VHDL语言与FPGA设计 实验报告.docx
《VHDL语言与FPGA设计 实验报告.docx》由会员分享,可在线阅读,更多相关《VHDL语言与FPGA设计 实验报告.docx(34页珍藏版)》请在冰点文库上搜索。
VHDL语言与FPGA设计实验报告
VHDL语言与FPGA设计
实验报告
学院:
班级:
姓名:
学号:
指导老师:
常州工学院
实验1:
2选1多路选择器设计
一、实验目的:
熟悉QuartusⅡ的VHDL文本设计流程全过程,学习简单组合电路的设计、仿真和硬件测试。
二、实验内容:
1.首先利用QuartusⅡ完成2选1多路选择器的文本编辑输入(mux21a.vhd)和仿真测试等步骤,给出仿真波形。
最后在实验系统上进行硬件测试,验证本项设计的功能。
2.引脚锁定以及硬件下载测试。
建议选实验电路模式No.5,用键1(PIO0)控制s(或s接clock2);a和b分别接clock0和clock5;输出信号y接扬声器speaker。
通过短路帽选择clock0接256Hz信号,clock5接1024Hz。
最后进行编译、下载和硬件测试实验(通过选择键1,控制a、b,可使扬声器输出不同音调)。
逻辑电路图
三、程序设计:
libraryieee;--
useieee.std_logic_1164.all;--
ENTITYmux21aIS
PORT(a,b,s:
INBIT;
y:
OUTBIT);
ENDENTITYmux21a;
ARCHITECTUREoneOFmux21aIS
BEGIN
PROCESS(a,b,s)
BEGIN
IFs='0'THEN
y<=a;ELSE
y<=b;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREone;
程序分析:
这是一个2选1多路选择器,a和b分别为两个数字输入端的端口名,s为通道选择控制信号输入端的端口名,y为输出端的端口名。
四、软件编译
选择PeocessingStartCompilation命令,启动全程编译。
编译无错后的报告信息
五、时序仿真
1)打开波形编辑器
选择File->new,选择vectorwaveformfile。
2)设定仿真时间区域
在Edit->endtime,在弹出的窗口time栏处输入50,单位选“us”。
3)波形文件存盘,默认文件名为mux21a.vwf
4)将此工程mux21a的端口信号名选入波形编辑器中
View->utilitywindows项的NodeFinder选项。
点击“list”。
5)将端口信号名拖入波形编辑器中,拖完信号后可以关掉浮动窗口
6)按键盘上“CTRL+W”,显示全部仿真时间区域。
7)编辑输入波形(输入激励信号)
8)仿真器参数设置
9)启动仿真器。
提示是否保存,选择“是”,仿真成功后选“确定”。
10)观察仿真结果
按键盘上“CTRL+W”,在全部仿真时间区域内观察波形,并分析波形图显示的逻辑功能是否正确。
电路时序波形图
时序分析:
当s=0时,y口输出a,当s=1时,y口输出b。
六、硬件测试
打开mux21a命名的工程,应选择File的OpenProject命令。
选择Assignments->assingnmenteditor项。
Category栏中选择locations,然后双击TO栏的《new》,选择NodeFinder。
在出现的对话框左边框中选择需要锁定的端口信号名,这些信号跳到右栏,单击OK按键后,这些信号名即进入信号编辑栏。
接着在表框中分别键入需要锁定的端口引脚名。
锁定引脚后,必须重新编译,启动Processing->StartCcomplication,编译完成后可下载配置文件。
引脚锁定图
使用USB编程器下载配置文件
首先安装USB编程器的驱动程序。
选择自己搜索驱动程序。
备注:
若没有正确安装驱动程序,USBBlaster编程器不可选,这时必须到硬件设备管理器中删除打问号的USB驱动程序,重新正确安装。
将编译产生的SOF格式配置文件配置进FPGA中。
在MODE选择JTAG。
编程器选择USBBlaster下载方式。
点击“start”将配置文件下载,然后进行硬件测试。
程序下载完成后,选择实验电路模式5,通过短路帽选择clock0接256Hz信号,clock5接1024Hz信号。
通过键一控制s,当键1进行切换时,明显能听到扬声器发出两种不同音调的声音。
实验2:
十进制计数器设计
一、实验目的
学习计数器的设计、仿真和硬件测试,进一步熟悉VHDL设计技术。
二、实验原理
对于异步清零和同步加载与时钟使能的计数器:
当时钟信号CLK、复位信号RST、时钟使能信号EN或加载信号LOAD中任一信号发生变化,都将启动进程。
此时如果RST为‘0’,将计数器清零,该操作独立于CLK,如果RST为‘1’,则看是否有时钟信号的上升沿,如果有且EN=‘1’,接下去是判断加载控制信号LOAD的电平,如果LOAD为低电平,则允许将输入口的四位加载数据置入计数器中,以便计数器在此基础上累计计数。
如果LOAD为高电平,则允许计数器计数;此时若数值小于9,计数器将进行正常计数,否则计数器清零。
但如果EN=‘0’,则计数器保持原值不变。
三、实验内容
1.在QuartusⅡ上对实验程序进行编辑、编译、综合、适配、仿真。
说明例中各语句的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形。
2.引脚锁定以及硬件下载测试。
建议选实验电路模式No.5,主时钟CLK接CLK0,EN接键1,RST接键2,(LOAD接键3,DATA接键5,6,7,8),COUT接发光管D1,4位输出总线CQ[3..0]连接数码管1(PIO19、PIO18、PIO17、PIO16)显示。
引脚锁定后进行编译、下载和硬件测试。
逻辑电路图
四、程序设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK,RST,EN:
INSTD_LOGIC;
CQ:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
COUT:
OUTSTD_LOGIC);
ENDCNT10;
ARCHITECTUREbehavOFCNT10IS
BEGIN
PROCESS(CLK,RST,EN)
VARIABLECQI:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='1'THENCQI:
=(OTHERS=>'0');--计数器异步复位
ELSIFCLK'EVENTANDCLK='1'THEN--检测时钟上升沿
IFEN='1'THEN--检测是否允许计数(同步使能)
IFCQI<9THENCQI:
=CQI+1;--允许计数,检测是否小于9
ELSECQI:
=(OTHERS=>'0');--大于9,计数值清零
ENDIF;
ENDIF;
ENDIF;
IFCQI=9THENCOUT<='1';--计数大于9,输出进位信号
ELSECOUT<='0';
ENDIF;
CQ<=CQI;--将计数值向端口输出
ENDPROCESS;
ENDbehave
五、软件编译
选择PeocessingStartCompilation命令,启动全程编译。
编译无错后的报告信息
六、时序仿真
1)打开波形编辑器
选择File->new,选择vectorwaveformfile。
2)设定仿真时间区域
在Edit->endtime,在弹出的窗口time栏处输入50,单位选“us”。
3)波形文件存盘,默认文件名为CNT10.vwf
4)将此工程CNT10的端口信号名选入波形编辑器中
View->utilitywindows项的NodeFinder选项。
点击“list”。
5)将端口信号名拖入波形编辑器中,拖完信号后可以关掉浮动窗口
6)按键盘上“CTRL+W”,显示全部仿真时间区域。
7)编辑输入波形(输入激励信号)
8)仿真器参数设置
9)启动仿真器。
提示是否保存,选择“是”,仿真成功后选“确定”。
10)观察仿真结果
按键盘上“CTRL+W”,在全部仿真时间区域内观察波形,并分析波形图显示的逻辑功能是否正确。
电路时序波形图
七、硬件测试
打开CNT10命名的工程,应选择File的OpenProject命令。
选择Assignments->assingnmenteditor项。
Category栏中选择locations,然后双击TO栏的《new》,选择NodeFinder。
在出现的对话框左边框中选择需要锁定的端口信号名,这些信号跳到右栏,单击OK按键后,这些信号名即进入信号编辑栏。
接着在表框中分别键入需要锁定的端口引脚名。
锁定引脚后,必须重新编译,启动Processing->StartCcomplication,编译完成后可下载配置文件。
引脚锁定图
使用USB编程器下载配置文件
首先安装USB编程器的驱动程序。
选择自己搜索驱动程序。
备注:
若没有正确安装驱动程序,USBBlaster编程器不可选,这时必须到硬件设备管理器中删除打问号的USB驱动程序,重新正确安装。
将编译产生的SOF格式配置文件配置进FPGA中。
在MODE选择JTAG。
编程器选择USBBlaster下载方式。
点击“start”将配置文件下载,然后进行硬件测试。
显示0-9,即十进制计数器,逢十进位灯闪烁一次
实验3:
七段数码显示译码器设计
一、实验目的
学习7段数码显示译码器设计;学习VHDL的CASE语句应用及多层次设计方法。
二、实验原理
7段数码是纯组合电路,通常的小规模专用IC,如74或4000系列的器件只能作十进制BCD码译码,然而数字系统中的数据处理和运算都是2进制的,所以输出表达都是16进制的,为了满足16进制数的译码显示,最方便的方法就是利用译码程序在FPGA/CPLD中来实现。
实验参考程作为7段译码器,输出信号LED7S的7位分别接数码管的7个段,高位在左,低位在右。
例如当LED7S输出为“1101101”时,数码管的7个段:
g、f、e、d、c、b、a分别接1、1、0、1、1、0、1;接有高电平的段发亮,于是数码管显示“5”。
注意,这里没有考虑表示小数点的发光管,如果要考虑,需要增加段h,LED7S:
OUTSTD_LOGIC_VECTOR(6DOWNTO0)应改为(7DOWNTO0)。
三、实验内容
1.说明程序中各语句的含义,以及该例的整体功能。
在QuartusII上对该例进行编辑、编译、综合、适配、仿真,给出其所有信号的时序仿真波形。
提示:
用输入总线的方式给出输入信号仿真数据。
2.引脚锁定及硬件测试。
建议选实验电路模式No.1,用数码管8(PIO31-PIO28)和数码管7(PIO27-PIO24)显示译码输出led7s,键1(PIO3-PIO0)控制输入a,硬件验证译码器的工作性能。
逻辑电路图
四、程序设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYDECL7SIS
PORT(A:
INSTD_LOGIC_VECTOR(3DOWNTO0);
LED7S:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
END;
ARCHITECTUREoneOFDECL7SIS
BEGIN
PROCESS(A)
BEGIN
CASEAIS
WHEN"0000"=>LED7S<="0111111";
WHEN"0001"=>LED7S<="0000110";
WHEN"0010"=>LED7S<="1011011";
WHEN"0011"=>LED7S<="1001111";
WHEN"0100"=>LED7S<="1100110";
WHEN"0101"=>LED7S<="1101101";
WHEN"0110"=>LED7S<="1111101";
WHEN"0111"=>LED7S<="0000111";
WHEN"1000"=>LED7S<="1111111";
WHEN"1001"=>LED7S<="1101111";
WHEN"1010"=>LED7S<="1110111";
WHEN"1011"=>LED7S<="1111100";
WHEN"1100"=>LED7S<="0111001";
WHEN"1101"=>LED7S<="1011110";
WHEN"1110"=>LED7S<="1111001";
WHEN"1111"=>LED7S<="1110001";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
END;
五、软件编译
选择PeocessingStartCompilation命令,启动全程编译。
编译无错后的报告信息
六、时序仿真
1)打开波形编辑器
选择File->new,选择vectorwaveformfile。
2)设定仿真时间区域
在Edit->endtime,在弹出的窗口time栏处输入50,单位选“us”。
3)波形文件存盘,默认文件名为DECL7S.vwf
4)将此工程DECL7S的端口信号名选入波形编辑器中
View->utilitywindows项的NodeFinder选项。
点击“list”。
5)将端口信号名拖入波形编辑器中,拖完信号后可以关掉浮动窗口
6)按键盘上“CTRL+W”,显示全部仿真时间区域。
7)编辑输入波形(输入激励信号)
8)仿真器参数设置
9)启动仿真器。
提示是否保存,选择“是”,仿真成功后选“确定”。
10)观察仿真结果
按键盘上“CTRL+W”,在全部仿真时间区域内观察波形,并分析波形图显示的逻辑功能是否正确。
电路时序波形图
七、硬件测试
打开DECL7S命名的工程,应选择File的OpenProject命令。
选择Assignments->assingnmenteditor项。
Category栏中选择locations,然后双击TO栏的《new》,选择NodeFinder。
在出现的对话框左边框中选择需要锁定的端口信号名,这些信号跳到右栏,单击OK按键后,这些信号名即进入信号编辑栏。
接着在表框中分别键入需要锁定的端口引脚名。
锁定引脚后,必须重新编译,启动Processing->StartCcomplication,编译完成后可下载配置文件。
引脚锁定图
使用USB编程器下载配置文件
首先安装USB编程器的驱动程序。
选择自己搜索驱动程序。
备注:
若没有正确安装驱动程序,USBBlaster编程器不可选,这时必须到硬件设备管理器中删除打问号的USB驱动程序,重新正确安装。
将编译产生的SOF格式配置文件配置进FPGA中。
在MODE选择JTAG。
编程器选择USBBlaster下载方式。
点击“start”将配置文件下载,然后进行硬件测试。
通过对仿真结果的分析,当输入端A=“0000”时,输出端DECL7S=“3F”,数码管显示“0”,当输入端A=“0001”时,输出端DECL7S=“06”,数码管显示“1”……。
实验4:
数控分频器设计
一、实验目的
学习数控分频器的设计、分析和测试方法。
二、实验原理
数控分频器的功能就是当在输入端给定不同输入数据时,将对输入的时钟信号有不同的分频比,数控分频器就是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可。
三、实验内容
在实验系统上硬件验证设计程序的功能。
可选实验电路模式No.1;键2、键1作为输入8位预置数D(PIO7-PIO0);CLK由clock0输入,频率选65536Hz或更高(确保分频后落在音频范围);输出FOUT接扬声器(SPKER)。
编译下载后进行硬件测试:
改变键2/键1的输入值,可听到不同音调的声音。
逻辑电路图
四、程序设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYDVFIS
PORT(CLK:
INSTD_LOGIC;
D:
INSTD_LOGIC_VECTOR(7DOWNTO0);
FOUT:
OUTSTD_LOGIC);
END;
ARCHITECTUREoneOFDVFIS
SIGNALFULL:
STD_LOGIC;
BEGIN
P_REG:
PROCESS(CLK)
VARIABLECNT8:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFCNT8="11111111"THEN
CNT8:
=D;--当CNT8计数计满时,输入数据D被同步预置给计数器CNT8
FULL<='1';--同时使溢出标志信号FULL输出为高电平
ELSECNT8:
=CNT8+1;--否则继续作加1计数
FULL<='0';--且输出溢出标志信号FULL为低电平
ENDIF;
ENDIF;
ENDPROCESSP_REG;
P_DIV:
PROCESS(FULL)
VARIABLECNT2:
STD_LOGIC;
BEGIN
IFFULL'EVENTANDFULL='1'THEN
CNT2:
=NOTCNT2;--如果溢出标志信号FULL为高电平,D触发器输出取反
IFCNT2='1'THENFOUT<='1';ELSEFOUT<='0';
ENDIF;
ENDIF;
ENDPROCESSP_DIV;
END;
五、软件编译
选择PeocessingStartCompilation命令,启动全程编译。
编译无错后的报告信息
六、时序仿真
1)打开波形编辑器
选择File->new,选择vectorwaveformfile。
2)设定仿真时间区域
在Edit->endtime,在弹出的窗口time栏处输入50,单位选“us”。
3)波形文件存盘,默认文件名为DVF.vwf
4)将此工程DVF的端口信号名选入波形编辑器中
View->utilitywindows项的NodeFinder选项。
点击“list”。
5)将端口信号名拖入波形编辑器中,拖完信号后可以关掉浮动窗口
6)按键盘上“CTRL+W”,显示全部仿真时间区域。
7)编辑输入波形(输入激励信号)
8)仿真器参数设置
9)启动仿真器。
提示是否保存,选择“是”,仿真成功后选“确定”。
10)观察仿真结果
按键盘上“CTRL+W”,在全部仿真时间区域内观察波形,并分析波形图显示的逻辑功能是否正确。
电路时序波形图
七、硬件测试
打开DVF命名的工程,应选择File的OpenProject命令。
选择Assignments->assingnmenteditor项。
Category栏中选择locations,然后双击TO栏的《new》,选择NodeFinder。
在出现的对话框左边框中选择需要锁定的端口信号名,这些信号跳到右栏,单击OK按键后,这些信号名即进入信号编辑栏。
接着在表框中分别键入需要锁定的端口引脚名。
锁定引脚后,必须重新编译,启动Processing->StartCcomplication,编译完成后可下载配置文件。
引脚锁定图
使用USB编程器下载配置文件
首先安装USB编程器的驱动程序。
选择自己搜索驱动程序。
备注:
若没有正确安装驱动程序,USBBlaster编程器不可选,这时必须到硬件设备管理器中删除打问号的USB驱动程序,重新正确安装。
将编译产生的SOF格式配置文件配置进FPGA中。
在MODE选择JTAG。
编程器选择USBBlaster下载方式。
点击“start”将配置文件下载,然后进行硬件测试。
改变键2/键1的输入值,可听到不同音调的声音。
实验5:
4位十进制频率计设计
一、实验目的
熟悉VHDL语言模块化设计和原理图输入方法的使用,掌握更复杂的层次化设计技术和数字系统设计方法。
完成4位十进制频率计的设计。
二、实验原理
设计VHDL的十进制计数器模块,连接它们的计数进位,用4个计数模块就能组成一个4位有时钟使能的计数器;用VHDL测频控制器控制输入信号和计数闸门,完成频率测量。
在仿真过程中应该注意它们可能的毛刺现象,最后按照设计流程和方法完成全部设计。
顶层原理图
三、实验内容
首先完成4位频率计的设计,然后进行硬件测试,建议选择电路模式No.5;数码2和1显示输出频率值,待测频率F_IN接clock0;测频控制时钟CLK接clock2,仿真测试该频率计待测信号的最高频率,并与硬件实测的结果进行比较。
四、程序设计
测频控制程序模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTESTCTLIS
PORT(CLKK:
INSTD_LOGIC;
CNT_EN,RST_CNT,LOAD:
OUTSTD_LOGIC);
ENDTESTCTL;
ARCHITECTUREbehavOFTESTCTLIS
SIGNALDIV2CLK:
STD_LOGIC;
BEGIN
PROCESS(CLKK)
BEGIN
IFCLKK'EVENTANDCLKK='1'THENDIV2CLK<=NOTDIV2CLK;
ENDIF;
ENDPROCESS;
PROCESS(CLKK,DIV2CLK)
BEGIN
IFCLKK='0'ANDDIV2CLK='0'THENRST_CNT<='1';
ELSERST_CNT<='0';
ENDIF;
ENDPROCESS;
LOAD<=NOTDIV2CLK;
CNT_EN<=DIV2CLK;
ENDbehav;
计数器程序模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK,RST,EN:
INSTD_LOGIC;
CQ:
OUTSTD_LOGIC_VEC