搜档网
当前位置:搜档网 › FPGA实验报告

FPGA实验报告

FPGA实验报告
FPGA实验报告

实验一Quartus使用环境和简单电路设计

一、实验目的

1. 熟悉Quartus Ⅱ软件基本使用方法;

2. 掌握电路的基本设计方法;

3. 掌握电路的基本仿真方法;

4. 掌握电路的基本下载方法。

二、实验器材

1. KH-310 下载板;

2. KH-310 LED 显示模块。

三、文件档名

加载:halfadd.sof

烧录:halfadd.pof

工程项目文件名:halfadd.qpf

四、实验内容

用VHDL 语言和原理图分别完成设计、仿真和下载基本逻辑门电路半加器的过程:

输入:a,b;输出:求和sum,进位c;

五、实验步骤

1. 新建文本文件

在Quartus Ⅱ管理器界面中选择File/New.., 菜单,出现New 对话框,如图3.1 所示。在对话框中选择VHDL File,点击OK,打开文本编辑器,输入半加器的VHDL 语言程序,如图1.2 所示。然后保存文件halfadd.vhd。需要注意的是,文件名与模块名必须一致。

图3.1 Quartus Ⅱ新建文本文件界面

图3.2 输入半加器的VHDL 语言程序

图3.3 保存文件

2. 建立工程项目

(1)在管理器窗口中选择File/New Project Wizard...菜单,出现新建项目向导New Project Wizard 对话框,输入项目目录(r:\test)、项目名称(halfadd)和顶层实体(halfadd),如图3.4 所示,顶层实体名可以与项目名不同。

图3.4 建立工程项目

(2)点击Next,添加文件对话框。点击按钮“…”,添加与该项目有关的所有文件到当前项目,

如图3.5 所示。本例只有一个文件halfadd.vhd,所以不用添加其它器件。

图3.5

图3.6

图3.7 添加项目有关的文件

(3)点击Next 按钮,再点击Next 选择目标器件系列Cyclone,点击NEXT 选择目标器件封装形式,引脚数目和速度级别。如图3.8 所示,点击NEXT。

图3.8 选择目标器件

(4)点击FINISH 按钮,项目halfadd 出现在项目导航窗口中,如图3.9 所示。双击文件名,

即可打开文件。

图3.9 打开文件

3. 编译并综合

选择菜单Processing\Start Complition 或直接点击工具栏中编译快捷按钮开始编译。编译过程中,状态窗口显示编译进度的百分比和每个阶段所花费的时间。信息窗口显示所有信息,警告和错误,双击某个信息项,可以定位到原设计文件并高亮显示。编译完成后将产生一个编译报告栏,编译结果在编译报告栏中自动更新,如图3.10 所示。报告栏包含了将一个设计适配到器件的所有信息。选中某一项可获得更详细的信息。如编译有错误,需要修改设计进行,并重新编译。

图3.10 编译并综合文件

4. 设计仿真

(1)新建仿真波形文件.vwf

选择菜单File/New..,在New 对话框中选择Other Files/Vector Waveform File,出现空的仿真波形文件。将文件保存为halfadd.vwf。如图1.11 所示:

编译快捷键信息窗口

图3.11 打开仿真波形文件

(2)加入节点

选择菜单Edit /Insert Node or Bus..,在Insert Node or Bus 对话框中点击按钮Node Finder,先在Filter 项里选择Pins:all,然后点击List,如图3.12 所示:

图3.12 列出仿真节点

点击“》”(全部选中)或“>”(一个一个加入)选择要仿真节点,“《”和“<”删除所选节点。点击OK,加入节点。如图1.13 所示:

图3.13 选择仿真节点

(3)确定仿真时间和编辑激励波形

选择菜单Edit/End Time..,可以调整最大仿真时间。本例使用200ns,如图3.14 所示;选择菜

单Edit\Grid Size..,可以修改网格大小,通常用网格大小表示信号状态的基本维持时间,本例输入5ns,如图3.15 所示。编辑激励波形时,先选中Name 栏的一个节点,然后单击图形工具菜单中的赋值快捷键,如图3.16 所示,根据要求编辑波形。

图3.14 确定仿真结束时间图3.15 修改网格大小

图3.16 编辑激励波形

(4)运行仿真器

保存后选择Processing \Start Simulation 菜单,或点击工具栏中的仿真快捷键按钮运行仿真器,波形如图3.16 所示。如果仿真结果有错误,需要修改设计并重新编译仿真。

(5)管脚的分配与定位

选择Assignment\ Pins 菜单,打开引脚分配窗口,如图3.17 所示。进行管脚分配:下面以33001下载板为例进行管脚分配:输入a 设置为引脚pin1,输入b 设置为引脚pin2,分别对应SW3 的IO1 和IO2;输出sum 设置为引脚pin43,输出c 设置为引脚pin44,分别对应KH-310 主板LED 区D1 和D2 两个LED,如下图:

图 3.17 管脚的分配与定位

分配完成后需要重新编译。选择菜单Processing\Start Complition 或直接点击工具栏中编译快捷按钮开始编译。

(6)硬件连接

将PC 的并口和下载板的JTAG,/PS(Passive serial)通过Altera 的下载线连接起来。RESET 是FPGA芯片复位按键;TDO,TDI 是目标器件选择短路夹,两个短路夹都接FO,FI 时对FPGA 配置,接EO,EI 时对EPC2 配置;配置开关控制EPC2 对FPGA 进行配置;该下载板支持JTAG、PS(Passive serial)(Quartus II 支持)两种配置方式。

(7)器件下载编程与硬件实现

选择Tools\Programmer 菜单,如图3.18 所示。请注意在Hardware setup 右边显示的是当前采用的烧录设备,应该是“ByteBlasterMV(LPT1)”。如果不是,点击“Hardware setup”按钮,如图1.19 所示,在弹出的对话框中点击“Add”按钮,则又会弹出一个对话框,选择含有“ByteBlasterMV”的项添加就可以指定烧录设备为“ByteBlasterMV(LPT1)”。在Mode 栏中选择JTAG下载方式,选中Program/Configure选项。设置好以后,连接下载电缆,点击窗口中Start 按钮开始下载。

图3.18 器件下载编程

图3.19 器件硬件实现

(8)编程后的硬件测试

下载完成后,改变输入端口a,b 的电平值,观察LED 的输出变化,验证半加器的功能。

5. 用原理图设计半加器

(1)选择菜单File \New..中Block Diagram\Schematic File 打开模块编辑器。如图3.20 所示。

图3.20 模块编辑器

(2)添加模块:点击右键,选择Insert/Symbol,在Name 中输入xor 现异或门,如图1.21 所示,点击ok 拖入图中。同样输入AND2 将与门加入图中;输入input,output 加入输入输出。

图3.21 添加模块

(3)连线

将输入输出改名为a,b,sum,c,并连线。当鼠标位于一个符号引脚上或图表模块边沿时连线工具变为十字形,移动鼠标,选择开始点,按住左键拖动鼠标至结束点放开。如图1.22 所

示。

图3.22 连线并修改名称

(3)保存文件为halfadd.bdf 并将其设为顶层文件。接着就对原理图进行编译、仿真、下载和验证,步骤同文本编辑方式,请参考上面步骤。

以上建立工程项目,编译仿真,下载等操作在下面的实验中将不会重复,详细操作请见实验一中的内容。

实验二、跑马灯设计

一、实验目的

1. 学习状态机的设计技巧;

2. 掌握CASE 语句的使用。

二、实验器材

1. KH-310 下载板;

2. KH-310 时钟模块;

3. KH-310 LED 显示模块。

三、文件档名

加载:led.sof

烧录:led.pof

项目工程文件:led.qpf

四、实验内容

控制8 个LED 进行花式显示,设计四种显示模式:

1. 从左到右逐个点亮LED;

2. 从右到左逐个点亮LED;

3. 从两边到中间逐个点亮LED;

4. 从中间到两边逐个点亮LED。

四种模式循环切换,由复位键rst 控制系统的运行与停止。

五、实验原理

图3.23

可用移位寄存器来控制逐个点亮LED 的操作,移位的频率为1Hz。

六、实验连线

输入信号:

时钟clk 接10Hz 输入(SW7) P152;

复位rst 接拨动开关I01(拨码开关SW3 左1)P1 ;

输出信号:

8 位输出信号接LED 模块O25—O32。P43~P50;

七、实验操作

下载程序,将SW7 拨至第二段(10Hz),拨码开关SW3 的IO1 拨至ON 的位置,此时,LED 灯的前8 位会有规律的闪烁。

八、实验程序

1.VHDL 程序

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity led is

port(clk:in std_logic;

rst:in std_logic;

q :out std_logic_vector(7 downto 0));

end;

architecture led of led is

constant s0:std_logic_vector(1 downto 0):="00"; --模式1

constant s1:std_logic_vector(1 downto 0):="01"; --―模式2

constant s2:std_logic_vector(1 downto 0):="10"; --―模式3

constant s3:std_logic_vector(1 downto 0):="11"; --―模式4

signal present:std_logic_vector(1 downto 0); -- ――当前模式signal q1:std_logic_vector(7 downto 0);

signal count:std_logic_vector(3 downto 0);

begin

process(rst,clk)

begin

if(rst='0')then -- ――系统初始化

present<=s0;

q1<=(others=>'0');

elsif(clk'event and clk='1')then

case present is

when s0 => if(q1="00000000")then --――S0模式:从左到右逐个点亮LED

q1<="10000000";

else if(count="0111")then

count<=(others=>'0');

q1<="00000001";

present<=s1;

else q1<=q1(0) & q1(7 downto 1);

count<=count+1;

present<=s0;

end if;

end if;

when s1 => if(count="0111")then --S1模式:从右到左逐个点亮LED

count<=(others=>'0');

q1<="10000001";

present<=s2;

else q1<=q1(6 downto 0) & q1(7);

count<=count+1;

present<=s1;

end if;

when s2 => if(count="0011")then --S2模式:从两边到中间逐个点亮LED count<=(others=>'0');

q1<="00011000";

present<=s3;

else q1(7 downto 4)<=q1(4) & q1(7 downto 5);

q1(3 downto 0)<=q1(2 downto 0) & q1(3);

count<=count+1;

present<=s2;

end if;

when s3 => if(count="0011")then --S3模式:从中间到两边逐个点亮LED count<=(others=>'0');

q1<="10000000";

present<=s0;

else q1(7 downto 4)<=q1(6 downto 4) & q1(7);

q1(3 downto 0)<=q1(0) & q1(3 downto 1);

count<=count+1;

present<=s3;

end if;

end case;

end if;

end process;

q<=q1;

end;

实验三、乒乓球实验

一、实验目的

1. 掌握时钟分频电路的HDL 设计;

2. 掌握CASE 语句的使用;

3. 掌握VHDL模块化程序设计方式。

二、实验器材

1. KH-310 下载板;

2. KH-310 时钟模块;

3. KH-310 LED 显示模块;

4. KH-310 七段数码管模块。

三、实验内容

设计一个乒乓球游戏机,模拟乒乓球比赛基本过程和规则,并能自动裁判和计分。

四、文件档名

加载:corna.sof

烧录:corna.pof

工程项目文件:corna.qpf

五、实验原理

乒乓球游戏机是用8~16 个发光二极管代表乒乓球台,中间两个发光二极管兼作乒乓球网,用点亮的发光二极管按一定方向移动来表示球的运动。另外设置发球开关:Af、Bf;和接球开关Aj、Bj。利用若干七段数码管作为计分牌。

甲乙双方按乒乓球比赛规则来操作开关。当甲方按动发球开关Af 时,靠近甲方的第一个灯亮,然后顺序向乙方移动。当球过网后,乙方可以接球,接球后灯反方向运动,双方继续比赛,如果一方提前击球(过网击球)或未击到球,则判失分,对方加分。重新发球后继续比赛。

六、实验连线

图3.24

输入信号:

控制时钟CLK:可调时钟SW7 输入;

接发球输入Af,Aj,Bf,Bj:脉冲发生器EPI0~EPI3(Pin236 Pin238 Pin237 Pin239);系统复位Clr:拨码开关I01;

输出信号:

乒乓球信号shift[15..0]:LED 显示模块O25~O40;

计分输出q[6..0]:七段数码管O56~O50(Pin79~Pin73)(JP1);

Sellread[3..0]:数码管选择SO61~SO58(Pin86~Pin83)(数码管跳线接左侧扫描方式)。

七、实验步骤

下载程序,将SW3 的IO1 拨到ON 后可进行比赛,PULS1 为甲方发球,PULS2 为甲方接球,PULS3 为乙方发球,PULS4 为乙方接球。LED 灯中,始终点亮的代表球网,将SW7 拨至第四段的位置。点击发球之后,双方可进行比赛,比赛规则参照实验原理部分。

八、实验程序

说明:下面的程序仅实现对当前局进行计分,需手工清除计分进行下一局比赛,同学们可以增加

局分显示,如一方记满11 分,当前局计分自动清零,局比分自动增加。

1.VHDL 程序

Library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity corna is

port (

clr,af,aj,bf,bj,clk:in std_logic;

shift:out std_logic_vector(15 downto 0);

ah,al,bh,bl: out std_logic_vector(3 downto 0) );

end corna;

architecture corna_arc of corna is

signal amark,bmark : integer;

signal clk1:std_logic;

signal fen:std_logic_vector(9 downto 0);

begin

process

begin

wait until clk='1';

fen<=fen+1;

clk1<=fen(7);

end process;

process(clr,clk1)

variable a,b : std_logic;

variable she: std_logic_vector(15 downto 0);

begin

if clr='0' then

a:='0';

b:='0';

she:="0000000000000000";

amark<=0;

bmark<=0;

elsif clk1'event and clk1 ='1' then

if a='0' and b='0' and af='1' then

a:='1';

she:="1000000000000000";

elsif a='0' and b='0' and bf='1' then

b:='1';

she:="0000000000000001";

elsif a='1' and b='0' then

if she>128 then

if bj='1' then

amark<=amark+1;

a:='0';

b:='0';

she:="0000000000000000";

else

she:='0'&she(15 downto 1);

end if;

elsif she=0 then

amark<=amark+1;

a:='0';

b:='0';

else

if bj='1' then

a:='0';

b:='1';

else

she:='0'& she(15 downto 1);

end if;

end if;

elsif a='0' and b='1' then

if she<256 and she/=0 then

if aj='1' then

bmark<=bmark+1;

a:='0';

b:='0';

she:="0000000000000000";

else

she:=she(14 downto 0)&'0';

end if;

elsif she=0 then

bmark<=bmark+1;

a:='0';

b:='0';

else

if aj='1' then

a:='1';

b:='0';

else

she:=she(14 downto 0)&'0';

end if;

end if;

end if;

end if;

shift<=she;

end process;

process(clk,clr,amark,bmark)

variable aha,ala,bha,bla: std_logic_vector(3 downto 0); variable tmp1,tmp2: integer;

begin

if clr='0' then

aha:="0000";

相关主题