数字系统设计软件实验报告.docx
- 文档编号:15478521
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:33
- 大小:483.87KB
数字系统设计软件实验报告.docx
《数字系统设计软件实验报告.docx》由会员分享,可在线阅读,更多相关《数字系统设计软件实验报告.docx(33页珍藏版)》请在冰点文库上搜索。
数字系统设计软件实验报告
实验一QuartusⅡ9.1软件的使用
一、实验目的:
1、通过实现书上的例子,掌握QUARTUSII9.1软件的使用;
2、编程实现3-8译码电路以掌握VHDL组合逻辑的设计以及QUARTUSII9.1软件的使用。
二、实验流程:
1、仔细阅读书上的操作指南,学会在QuartusⅡ9.1中创建新的工程,创建过程如下所示:
1)、建立新设计项目:
①启动QuartusⅡ9.1软件,在软件的管理器窗口选File下拉菜单,即File→NewProjectWizard,则出现新建工程向导窗口。
如下所示:
②点击Next按钮,将弹出新建工程设置窗口,如下图所示。
在新建工程设置窗口中设置好工程的存放路径、工程名称等。
③点击Next进入添加文件窗口,如下图。
由于尚未创建文件,跳过该步骤。
④点击Next按钮,进入选择目标芯片窗口。
在这里我们选择Cyclone系列的EP1C6Q240C8,如下图:
⑤点击Next按钮,进入EDA工具设置窗口,通常选择默认的“None”,表示选择QuartusⅡ自带的仿真器和综合器。
如下图:
⑥点击Next按钮,弹出NewProjectWizard概要对话框,在这个窗口中列出了所有前面设置的结果。
若有错误则点击Back回去修改,否则点击Finish结束,即完成新工程的设定工作。
如下图:
2)、文本设计输入:
①在QuartusⅡ主界面菜单栏中选择File下拉菜单中的New,弹出新建设计文件窗口,选择VHDLFile项,点击OK按钮即可打开VHDL文本编辑窗口,其默认文件名为“Vhdl.vhd”。
②出现文本编辑窗口后,我们可以直接在空白界面中键入所设计的VHDL文本。
这时我们将书本中的程序输入到文本编辑环境中去。
程序如下:
libraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycount10is
port(clk,load,en:
instd_logic;
data_in:
instd_logic_vector(3downto0);
seg:
outstd_logic_vector(6downto0));
endcount10;
architecturebehaofcount10is
signalqout:
std_logic_vector(3downto0);
signalq_temp:
std_logic_vector(3downto0);
begin
process(clk,load)
begin
if(load='1')then
q_temp<=data_in;
elsif(clk'eventandclk='1')then
if(en='0')then
qout<=qout;
elsif(qout="1001")then
qout<="0000";
else
qout<=qout+1;
endif;
q_temp<=qout;
endif;
endprocess;
process(q_temp)
begin
caseq_tempis
when"0000"=>seg<="1000000";
when"0001"=>seg<="1111001";
when"0010"=>seg<="0100100";
when"0011"=>seg<="0110000";
when"0100"=>seg<="0011001";
when"0101"=>seg<="0010010";
when"0110"=>seg<="0000010";
when"0111"=>seg<="1111000";
when"1000"=>seg<="0000000";
when"1001"=>seg<="0010000";
whenothers=>seg<="0001000";
endcase;
endprocess;
endbeha;
键入完毕后进行保存。
3)、输入并保存成功后,需要对设计项目进行全编译。
编译过程中会对程序进行检查,若程序无错误,则全编译成功,否则编译不成功,需要返回程序进行检查,修改错误。
选取菜单中Processing→StartCompilation进行全编译,最终程序无错误,编译成功。
4)、全编译成功后,则需要进行仿真。
仿真包括功能仿真和时序仿真。
首先进行功能仿真:
①指定功能仿真模式。
选择菜单中Assignment→setting,在左侧Category栏中选中Simulatorsetting,然后在右侧Simulationmode的下拉菜单中选Functional。
如下图所示:
②通过建立波形文件进行仿真,具体步骤如下:
第一步:
在菜单栏中选择File→New,选择VectorWaveformFile项,点击OK按钮打开空白波形编辑窗口,使用下拉菜单File中的Saveas命令,将其另存为“count10.vwf”文件。
第二步:
选择菜单栏中Edit→InsertNodeorBus,弹出插入节点窗口。
第三步:
点击插入节点窗口的NodeFinder按钮,再点击List按钮。
在左侧NodeFound窗口中选取将要仿真的节点,然后将选取信号选取至右侧的SelectNode窗口中。
最后点击OK按钮回到插入节点窗口,再次点击OK按钮回到波形编辑窗口。
第四步:
设置信号的方针激励,首先选中所需赋值的信号之后点击鼠标右键,在弹出的活动菜单中选Value子菜单,出现仿真激励类型子菜单。
设置时钟时,即选择Value子菜单中的Clock。
所有的输入信号均要赋值,最后保存完成赋值后的波形文件。
第五步:
运行菜单Processing→GenerateFunctionalSimulationNetlist命令产生用于功能仿真的网表文件。
第六步:
选取Processing→StartSimulation执行仿真模拟,将出现仿真结果波形。
结果如下所示:
经过分析,结果正确。
下面进行时序仿真:
①指定功能仿真模式。
选择菜单中Assignment→setting,在左侧Category栏中选中Simulatorsetting,然后在右侧Simulationmode的下拉菜单中选Timing。
如下图所示:
②通过建立波形文件进行仿真,具体步骤如下:
第一步:
在菜单栏中选择File→New,选择VectorWaveformFile项,点击OK按钮打开空白波形编辑窗口,其默认文件名为“Waveforml.vwf”。
第二步:
对于时序仿真来说,将仿真时间设置在一个合理区域十分重要,通常设置的时间范围在数十微秒之间。
选择菜单中Edit→EndTime,在弹出的结束时间窗口中设置为1µs。
第三步:
加入输入、输出信号,设置输入信号周期,保存文件等步骤均与前面功能仿真相同。
第四步:
选取Processing→StartSimulation进行模拟仿真,仿真结果将出现。
结果如下所示:
经过分析,结果正确。
2、七段译码器程序的功能图如下所示:
关于7段译码器的说明:
在实验1中使用了一个7段译码器,其由7个发光二极管构成,二极管的负极接到对应引脚,正极接高电平构成共阳极的7段数码管。
如下如所示:
显示0时,a,b,c,d,e,f管脚接低电平,g管脚接高电平点亮的二极管会显示数字0。
如图所示:
3、根据三-八译码器真值表完成VHDL程序的设计并仿真。
输入
输出
D2
D1
D0
Q7
Q6
Q5
Q4
Q3
Q2
Q1
Q0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
1
0
0
0
1
1
0
0
0
0
1
0
0
0
1
0
0
0
0
0
1
0
0
0
0
1
0
1
0
0
1
0
0
0
0
0
1
1
0
0
1
0
0
0
0
0
0
1
1
1
1
0
0
0
0
0
0
0
1)、三-八译码器功能仿真注意事项:
因为需要考察电路输入的所有状态,因此需要输入分别有000、001、010、011、100、101、110、111八个状态,在仿真通道文件中选择d界面旁边的赋值选项此时高亮显示表示可用,选中C,在弹出的对话框中进行设置。
2)、实验设计程序代码如下:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitycount38is
PORT(x:
inSTD_LOGIC_VECTOR(2DOWNTO0);
y:
outSTD_LOGIC_VECTOR(7DOWNTO0));
endcount38;
architecturebehaofcount38is
begin
process(x)
begin
casexis
when"000"=>y<="00000001";
when"001"=>y<="00000010";
when"010"=>y<="00000100";
when"011"=>y<="00001000";
when"100"=>y<="00010000";
when"101"=>y<="00100000";
when"110"=>y<="01000000";
when"111"=>y<="10000000";
whenothers=>y<="ZZZZZZZZ";
endcase;
endprocess;
endbeha;
3)、3-8译码器程序设计思路:
输入三位,输出八位,无使能端。
采用case-when语句,将输入与输出对应起来。
因when已列举出了所有情况,故whenothers可不写。
4)、程序设计好之后,输入QuartusⅡ中进行仿真,仿真结果如下:
功能仿真结果:
时序仿真结果:
经过分析,结果符合预期3-8译码器的功能,结果正确。
三、实验心得与体会:
实验二模十状态机与7段译码器显示
一、实验目的:
通过设计频率可选的模十状态机以及7段译码电路以进一步掌握VHDL硬件描述语言。
二、实验流程:
本设计有分频器、多路选择器、状态机和译码器。
时钟输入作为分频器的输入,输出时钟分别为2分频、4分频、8分频和16分频;
四个频率的时钟信号由4选1的多路选择器选择其中之一作为状态机的时钟输入;
使用选中的时钟频率作为输入驱动状态机按照以下的次序输出:
0->2->5->6->1->9->4->8->7->3->0的顺序输出;
使用此输出作为驱动输入到7段译码器的显示逻辑。
三、实验原理:
1、分频器:
采用一个4位计数器实现2、4、8、16分频,当输入脉冲的上升沿(下降沿)来临时计数发生跳变。
功能语句描述:
if(clk'eventandclk='1')then
count<=count+1;
或者:
if(clk'eventandclk‘last_value='0')then
count<=count+1;
或者:
if(rising_edge(clk))then
count<=count+1;
在由上升沿导致的进程执行时,上述两个表达式的值都为真;而在由其他输入变化导致的进程执行时,上述表达式的值为假。
2、多路选择器:
分频器的输出对应多路选择器的输入,所以需要设计一个4-1选择器,四种情况分别对应”00”、”01“、”10“、”11“。
功能语句描述:
(case-when语句)
begin
process(sel)—sel是频率选择信号
caseselis
when"00"=>clk1<=count(0);
when"01"=>clk1<=count
(1);
when"10"=>clk1<=count
(2);
when"11"=>clk1<=count(3);
whenothers=>null;
endcase;
endprocess;
--注意:
如果when所列举的情况不包括所有情况,一定要加”whenothers”。
或者:
(if-else)
begin
process(clk,rst)
if(sel=“00”)then
clk1<=count(0);
elsif(sel=“01”)then
clk1<=count
(1);
elsif(sel=“10”)then
clk1<=count
(2);
else
clk1<=count(3);
endif;
endprocess;
3、模十状态机:
因为实验要求中已经规定了输出顺序,所以不能简单套用计数器的思路,可采用case-when语句将现态与次态对应起来。
功能语句描述:
casecountsis
when"0000"=>counts<="0010";
when"0010"=>counts<="0101";
when"0101"=>counts<="0110";
when"0110"=>counts<="0001";
when"0001"=>counts<="1001";
when"1001"=>counts<="0100";
when"0100"=>counts<="1000";
when"1000"=>counts<="0111";
when"0111"=>counts<="0011";
when"0011"=>counts<="0000";
whenothers=>counts<="0000";
endcase;
4、7段译码器:
实验一中已经完成该程序设计,此处不再赘述。
功能语句描述:
casetmpis
when"0000"=>seg<="1000000";
when"0001"=>seg<="1111001";
when"0010"=>seg<="0100100";
when"0011"=>seg<="0110000";
when"0100"=>seg<="0011001";
when"0101"=>seg<="0010010";
when"0110"=>seg<="0000010";
when"0111"=>seg<="1111000";
when"1000"=>seg<="0000000";
when"1001"=>seg<="0010000";
whenothers=>seg<="0001000";
endcase;
5、程序功能图如下:
count
clkclk1
sel0sel1
counts
四:
实验程序及结果:
1、实验程序代码如下:
libraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitymod10is
port(clk,rst,load:
instd_logic;
sel:
instd_logic_vector(1downto0);
countss:
instd_logic_vector(3downto0);
seg:
outstd_logic_vector(6downto0));
endmod10;
architecturebehaofmod10is
signalclk1,clk2,clk4,clk8,clk16:
std_logic;
signalcount,q_temp:
std_logic_vector(3downto0);
signalcounts:
std_logic_vector(3downto0):
="0000";
begin
process(clk,rst)
begin
if(rst='0')then
count<="0000";
elsif(clk'eventandclk='0')then
count<=count+1;
endif;
clk2<=count(0);
clk4<=count
(1);
clk8<=count
(2);
clk16<=count(3);
endprocess;
process(sel)
begin
caseselis
when"00"=>clk1<=clk2;
when"01"=>clk1<=clk4;
when"10"=>clk1<=clk8;
when"11"=>clk1<=clk16;
whenothers=>null;
endcase;
endprocess;
process(clk1,rst,load)
begin
if(rst='0')then
counts<="0000";
elsif(load='1')then
counts<=countss;
elsif(clk1'eventandclk1='0')then
casecountsis
when"0000"=>counts<="0010";
when"0010"=>counts<="0101";
when"0101"=>counts<="0110";
when"0110"=>counts<="0001";
when"0001"=>counts<="1001";
when"1001"=>counts<="0100";
when"0100"=>counts<="1000";
when"1000"=>counts<="0111";
when"0111"=>counts<="0011";
when"0011"=>counts<="0000";
whenothers=>counts<="0000";
endcase;
endif;
q_temp<=counts;
endprocess;
process(q_temp)
begin
caseq_tempis
when"0000"=>seg<="1000000";
when"0001"=>seg<="1111001";
when"0010"=>seg<="0100100";
when"0011"=>seg<="0110000";
when"0100"=>seg<="0011001";
when"0101"=>seg<="0010010";
when"0110"=>seg<="0000010";
when"0111"=>seg<="1111000";
when"1000"=>seg<="0000000";
when"1001"=>seg<="0010000";
whenothers=>seg<="0001000";
endcase;
endprocess;
endbeha;
2、实验结果:
将程序键入QuartusⅡ软件并进行功能仿真,仿真结果如下所示:
其中,clk为系统时钟;rst为复位(清零)信号,低有效;sel为频率选择信号;seg为七段译码器输出;count为分频器输出信号;counts为状态信号输出。
经过分析,结果符合功能要求,结果正确,因此程序设计合理。
五、实验心得体会:
实验三数字钟的设计与仿真
一、实验目的:
通过设计实现四种频率可选的数字钟的设计与仿真,以熟悉VHDL语言编程。
二、实验流程:
系统整体由分频器、多路选择器和计数器三个模块组成。
输入引脚有3根,分别为时钟(提供整个系统的时钟信号)、选择器输入Sel1、Sel0(选择不同的频率输入)。
输出引脚有24根,分别为时个位hour_low(3downto0)和十位hour_high(3downto0)、分钟个位min_low(3downto0)和十位minr_high(3downto0)、秒个位second_low(3downto0)和十位secondr_high(3downto0)。
三、实验原理:
分频器与多路选择器的原理在前面实验中已经描述清楚,这里不再赘述,只给出实现程序代码。
1、分频器与多路选择器实现代码:
process(clk)
begin
if(clk'eventandclk='1')then
count<=count+1;
endif;
endprocess;
process(count,chose)
begin
casechoseis
when"00"=>clk1<=count(0);
when"01"=>clk1<=count
(1);
when"10"=>clk1<=count
(2);
when"11"=>clk1<=count(3);
endcase;
endprocess;
2、在程序中加入复位信号rst,并且为高有效,实现程序如下:
process(clk,rst)
begin
if(rst='1')then
hh<="0000";
hl<="0000";
mh<="0000";
ml<="0000";
sh<="0000";
sl<="0000";
3、计数器:
根据时间的计数规律,编程实现计数器的计数过程,实现程序代码如下:
if(clk'eventandclk='1')then
sl<=sl+1;
if(sl="1001")then
sl<="0000";
sh<=sh+1;
if(sh="0101")then
sh<="0000";
ml<=ml+1;
if(ml="1001")then
ml<="0000";
mh<=mh+1;
if(mh="0101")then
mh<="0000"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 系统 设计 软件 实验 报告