实验一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";