电子科技大学EDA指导书附完整答案.docx
《电子科技大学EDA指导书附完整答案.docx》由会员分享,可在线阅读,更多相关《电子科技大学EDA指导书附完整答案.docx(24页珍藏版)》请在冰豆网上搜索。
![电子科技大学EDA指导书附完整答案.docx](https://file1.bdocx.com/fileroot1/2022-12/6/c246d9af-4a77-4d9f-ac00-93bf5941baf4/c246d9af-4a77-4d9f-ac00-93bf5941baf41.gif)
电子科技大学EDA指导书附完整答案
数字系统EDA技术
实验指导书
学院:
学号:
姓名:
实验一八位全加器的设计
一、预习内容
1.结合教材中的介绍熟悉QuartusⅡ软件的使用及设计流程;
2.八位全加器设计原理。
二、实验目的
3.图形设计方法
二、实验目的
1.掌握图形设计方法;
2.熟悉QuartusⅡ软件的使用及设计流程;
3.掌握全加器原理,能进行多位加法器的设计。
三、实验器材
三、实验器材
PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干
四、实验要求
1、用VHDL设计一个四位并行全加器;
2、用图形方式构成一个八位全加器的顶层文件;
3、完成八位全加器的时序仿真。
五、实验原理与内容
1、原理:
加法器是数字系统中的基本逻辑器件。
例如:
为了节省资源,减法器和硬件乘法器都可由加法器来构成。
但宽位加法器的设计是很耗费资源的,因此在实际的设计和相关系统的开发中需要注意资源的利用率和进位速度等两方面的问题。
多位加法器的构成有两种方式:
并行进位和串行进位方式。
并行进位加法器设有并行进位产生逻辑,运算速度快;串行进位方式是将全加器级联构成多位加法器。
通常,并行加法器比串行级联加法器占用更多的资源,并且随着位数的增加,相同位数的并行加法器比串行加法器的资源占用差距也会越来越大。
实验表明,4位二进制并行加法器和串行级联加法器占用几乎相同的资源。
这样,多位数加法器由4位二进制并行加法器级联构成是较好的折中选择。
因此本实验中的8位加法器采用两个4位二进制并行加法器级联而成。
2、实现框图:
1)四位加法器
四位加法器可以采用四个一位全加器级连成串行进位加法器,实现框图如下图所示,其中CSA为一位全加器。
显然,对于这种方式,因高位运算必须要等低位进位来到后才能进行,因此它的延迟非常可观,高速运算肯定无法胜任。
通过对串行进位加法器研究可得:
运算的延迟是由于进位的延迟。
因此,减小进位的延迟对提高运算速度非常有效。
下图是减少了进位延迟的一种实现方法。
可见,将迭代关系去掉,则各位彼此独立,进位传播不复存在。
因此,总的延迟是两级门的延迟,其高速也就自不待言。
2)八位加法器
用两个并行四位加法器实现一个八位加法器的框图如下:
六、实验步骤
1、用VHDL语言或图形输入法设计一个并行四位全加器;
2、利用步骤一得到的四位全加器使用图形输入法实现一个8位全加器;
3、对最后的顶层文件进行编译、仿真;
4、如果时间有余可以直接设计一个八位的串行全加器,比较上述两种方法
综合后的不同(主要从消耗资源和运算速度考虑)。
七、实验报告
1、
四位加法器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityadder4is
port(c4:
instd_logic;
a4:
instd_logic_vector(3downto0);
b4:
instd_logic_vector(3downto0);
s4:
outstd_logic_vector(3downto0);
co4:
outstd_logic);
endentityadder4;
architectureartofadder4is
signals5:
std_logic_vector(4downto0);
signala5,b5:
std_logic_vector(4downto0);
begin
a5<='0'&a4;
b5<='0'&b4;
s5<=a5+b5+c4;
s4<=s5(3downto0);
co4<=s5(4);
endarchitectureart;
连线图
仿真波形
2、分析实验结果;
从波形中可以看出,S8的输出由A8和B8的和来得到,而且显示是以8个为一组进行显示的。
3、心得体会;
首先编写正确的程序是非常重要的,特别注意拼写的情况。
另外在仿真是一定要搞清楚,顶层文件和其它组成文件的区别。
在一开始就应该注意到,免得在后面又重新来建立新的工程。
八、问题及思考
试设计一由8位二进制加法器为基本元件构成的8位减法器。
源程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityadder8is
port(c8:
instd_logic;
a8:
instd_logic_vector(7downto0);
b8:
instd_logic_vector(7downto0);
s8:
outstd_logic_vector(7downto0);
co8:
outstd_logic);
endentityadder8;
architectureartofadder8is
componentadder4is
port(c4:
instd_logic;
a4:
instd_logic_vector(3downto0);
b4:
instd_logic_vector(3downto0);
s4:
outstd_logic_vector(3downto0);
co4:
outstd_logic);
endcomponentadder4;
signalsc:
std_logic;
begin
u1:
adder4
portmap(c4=>c8,a4=>a8(3downto0),b4=>b8(3downto0),s4=>s8(3downto0),co4=>sc);
u2:
adder4
portmap(c4=>sc,a4=>a8(7downto4),b4=>b8(7downto4),s4=>s8(7downto4),co4=>co8);
endarchitectureart;
电路图
仿真波形
实验二用七段LED显示8421BCD码的VHDL设计
一、预习内容
1、结合附录一了解EDA实验箱的原理;
2、七段LED显示原理;
3、怎样用VHDL实现8421BCD码在七段LED数码管上显示。
二、实验目的实验目的
1.了解VHDL进行EDA设计的基本步骤;
2.学会用QuartusⅡ进行时序仿真;
3.了解EDA实验箱的基本功能;
三、实验器材验器材
PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干
四、实验要求
1.用VHDL设计具有清除端、使能端,计数范围为0-999的计数器设计。
输出为8421BCD码;
2.用VHDL设计七段LED译码显示电路;
3.QuartusⅡ进行时序仿真;
4.下载该程序验证程序是否正确;
5.请事先准备一个优盘,本实验程序需要保存,后面实验需要用到。
五、实验原理与内容
1、8421BCD编码
在数字系统中常用四位二进制代码来表示一位十进制数字0、1、2、﹒﹒﹒、9,称之为二-十进制代码,即BCD码。
将十进制数编成BCD码的电路,称为称二-十进制(BCD)编码器。
二-十进制编码的方案很多,若BCD编码器采用8421编码方案,称为8421BCD编码器。
2、七段译码器
下图为译码器逻辑图,请按图进行连线。
其中A,B,C,D接拨号开关,a,b,c,d,e,f,g接数码显示接口,管脚映射均为I/O口,映射后,通过拨号开关改变输入二进制码,则输出数码管上显示相应的数值。
3、译码器真值表
数
值
输入
输出
A
B
C
D
a
b
c
d
e
f
g
0
0
0
0
0
1
1
1
1
1
1
0
1
0
0
0
1
0
1
1
0
0
0
0
2
0
0
1
0
1
1
0
1
1
0
1
3
0
0
1
1
1
1
1
1
0
0
1
4
0
1
0
0
0
1
1
0
0
1
1
5
0
1
0
1
1
0
1
1
0
1
1
6
0
1
1
0
1
0
1
1
1
1
1
7
0
1
1
1
1
1
1
0
0
0
0
8
1
0
0
0
1
1
1
1
1
1
1
9
1
0
0
1
1
1
1
1
0
1
1
A
1
0
1
0
1
1
1
0
1
1
1
B
1
0
1
1
0
0
1
1
1
1
1
C
1
1
0
0
1
0
0
1
1
1
0
D
1
1
0
1
0
1
1
1
1
0
1
E
1
1
1
0
1
0
0
1
1
1
1
F
1
1
1
1
1
0
0
0
1
1
1
六、实验步骤
1、写出七段译码器和具有清除端、使能端,计数范围为0-999的计数器的VHDL源程序,编译通过;
2、进行波形仿真;
3、选定器件、映射管脚、编译、下载。
七、实验报告
1、写出实验源程序,画出仿真波形;
三、各模块VHDL程序
1、0-9计数器
2、0-999计数器
3、译码显示模块
四、各模块仿真测试
1、
(1)0-9计数器功能仿真:
2、
(1)0-999计数器功能仿真:
3、
(1)译码显示电路功能仿真
4、
(1)整体时序仿真:
五、实验结论:
1、十进制计数器确实能实现对时钟脉冲的计数并且产生进位输出;
2、由十进制计数器级联成的0-999计数器也能实现对时钟脉冲的计数,并且产生进位输出,而且输出的计数符合8421码格式。
3、七段显示程序的输出是十六进制形式,输出结果与原理完全一致。
4、各个仿真波形均有延迟。
5、各模块及总体均符合功能设计要求。
六、思考题:
要译出0-9和‘一’,只需要将译码模块中的whenothers=>dout<=“0000000”改为:
whenothers=>dout<=“0000001”
即可。
实验三扫描显示电路设计
一、预习内容
1、什么是扫描显示;
2、怎样实现数码显示;
3、写出原理草图,写出源程序。
二、实验目的实验目的
1、进一步熟悉用VHDL进行EDA设计方法;
2、本实验与实验二的不同之处在八个数码管都要稳定地显示;
3、进一步了解EDA实验箱的基本功能;
三、实验器材实验器材
PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干
四、实验要求
五、
1、用VHDL设计一个扫描显示电路,使得八个数码管能同时显示(要求显示的值为自己的学号+100,如学号为1,则数码管显示101,多出的数码管全显示0),然后编译、仿真;
2、下载该程序,验证程序是否正确。
3、请事先准备一个优盘,后面实验需要用到。
五、实验原理与内容
数码显示板上一共有8个数码管,如果按照传统的数码管驱动方式(静态扫描方式),则需要8个七段译码器进行驱动,这样既浪费资源,有时电路工作也不可靠。
所以现在最常见的数码管驱动电路已经不用上述的静态扫描方式了,而是采用动态扫描显示的方式,这种方式只需一个译码器就可以实现电路正常、可靠的工作,这样大大节省资源。
动态数码扫描显示方式是利用了人眼的视觉暂留效应,把八个数码管按一定顺序(从左至右或从右至左)进行点亮,当点亮的频率(即扫描频率)不大时,我们看到的是数码管一个个的点亮,然而,当点亮频率足够大时,我们看到的不再是一个一个的点亮,而是全部同时显示(点亮),与传统方式得到的视觉效果完全一样。
因此我们只要给数码管这样一个扫描频率,那么就可以实现两个以上的数码管同时点亮。
而这个频率我们可以通过一个计数器来产生,只要计数频率足够大,就可以实现我们的要求。
事实上,因为数码管点亮不是瞬间就可以的,它也需要一定的时间,该时间与数码管的选择有关系。
为了折中这一对矛盾,实验中一般可将计数频率选择在100Hz左右肯定可以满足上述两个要求。
动态数码扫描显示的硬件电路设计要求是:
对共阴数码管,将其公共端阴极接三八译码器的输出,三八译码器的输入为位选信号输入;将8个(或更多)的数码管的相同段接在一起,然后引出。
原理图如下:
六、实验步骤
1、调出实验二的源程序,检查是否正确;
2、修改实验二程序实现0~999的8421BCD码,并将结果通过数码管显示;
3、编译、仿真程序;
4、下载程序判断是否正确。
七、实验报告
1、写出实验源程序,画出仿真波形;
七段译码器源程序
Libraryieee;
Useieee.std_logic_1164.all;
EntityBCDis
Port(bcd:
instd_logic_vector(3downto0);
y:
outstd_logic_vector(6downto0));
EndentityBCD;
Architecturert1ofBCDis
Begin
Process(bcd)is
Begin
Casebcdis
When"0000"=>y<="1111110";
When"0001"=>y<="0110000";
When"0010"=>y<="1101101";
When"0011"=>y<="1111001";
When"0100"=>y<="0110011";
When"0101"=>y<="1011011";
When"0110"=>y<="1011111";
When"0111"=>y<="1110000";
When"1000"=>y<="1111111";
When"1001"=>y<="1111011";
Whenothers=>y<="0000000";
Endcase;
Endprocess;
Endarchitecturert1;
计数器源程序
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
Entitycountis
Port(clk,reset:
instd_logic;
d:
outstd_logic_vector(2downto0));
Endentitycount;
Architecturert1ofcountis
Signaly:
std_logic_vector(2downto0);
Begin
Process(clk,reset)is
Begin
d<=y;
ifreset='1'then
y<="000";
else
if(clk'eventandclk='1')then
if(y="111")then
y<="000";
else
y<=y+'1';
endif;
endif;
endif;
endprocess;
endarchitecturert1;
输入数据
Libraryieee;
Useieee.std_logic_1164.all;
Entitydatais
Port(count:
instd_logic_vector(2downto0);
reset:
instd_logic;
y:
outstd_logic_vector(3downto0));
Endentitydata;
Architecturert1ofdatais
Begin
Process(count,reset)is
Begin
ifreset='1'theny<="0000";
else
Casecountis
When"000"=>y<="1001";
When"001"=>y<="0001";
When"010"=>y<="0001";
When"011"=>y<="0000";
When"100"=>y<="0000";
When"101"=>y<="0000";
When"110"=>y<="0000";
When"111"=>y<="0000";
Whenothers=>y<="0000";
Endcase;
endif;
Endprocess;
Endarchitecturert1;
电路图
仿真波形
显示结果
2、总结实验步骤和实验结果
实验过程中用到的子程序很多,要保证每一个子程序的准确性。
因为输入很多,在做波形图的时候要注意接入高低电平。
3、心得体会
在调试输出的数据的时候要注意高位和低位。
在实验过程中,就出现了高地位相反的问题。
实验四数字频率计的设计及实现
一、预习内容
1、什么是数字频率计;
2、数字频率计实现原理;
3、写出原理草图和源程序。
二、实验目的二、实验目的
1、学会数字频率计的设计方法;
2、掌握自顶向下的设计方法,体会其优越性。
三、实验器材三、实验器材
PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干
四、实验要求
1、用VHDL完成8位数字频率计的设计,该频率计要求频率测量范围:
1Hz~20MHz;具有清零复位功能;频率测量结果用八位数码管稳定显示;
2、用实验系统箱实现该频率计,并用数码管显示所测的频率值。
五、实验原理与内容
1、测频原理
若某一信号在T秒时间里重复变化了N次,则根据频率的定义可知该信号的频率fs为:
fs=N/T通常测量时间T取1秒或它的十进制时间。
频率计方框图如下:
1)时基T产生电路:
提供准确的计数时间T。
晶振产生一个振荡频率稳定的脉冲,通过分频整形、门控双稳后,产生所需宽度的基准时间T的脉冲,又称闸门时间脉冲。
注意:
分频器一般采用计数器完成,计数器的模即为分频比。
2)计数脉冲形成电路:
将被测信号变换为可计数的窄脉冲,其输出受闸门脉冲的控制。
3)计数显示电路:
对被测信号进行计数,显示被测信号的频率。
计数器一般采用多位10进制计数器;控制逻辑电路控制计数的工作程序:
准备、计数、显示、复位和准备下一次测量。
2、具体实现:
1)测频控制逻辑电路(以1秒为例)
2)产生一个1秒脉宽的周期信号;
3)对计数器的每一位计数使能进行控制;
4)完成下一次测量前的计数器复位;
以下是一种可能的时序关系:
5)10进制计数器
要求具有计数使能端CNTEN、复位端CLR、进位输出端CO。
3、元件例化图(方框图):
注意:
用8个十进制计数器实现1MHz计数。
六、实验步骤
六、实验步骤
1、画出实验原理方框图;
2、设计各个元件;
3、进行元件例化;
4、下载程序,查看数码管显示的频率是否和待测的频率相同。
七、实验报告
1、源程序
CNT10
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityCNT10is
port(clk,clr,ena:
instd_logic;
cq:
outintegerrange0to15;
carry_out:
outstd_logic);
endentityCNT10;
architectureartofCNT10is
signalcqi:
integerrange0to15;
begin
process(clk,clr,ena)is
begin
ifclr='1'thencqi<=0;
elsifclk'eventandclk='1'then
ifena='1'then
ifcqi<9thencqi<=cqi+1;
elsecqi<=0;endif;
endif;
endif;
endprocess;
cq<=cqi;
endarchitectureart;
FRE_DIVIDE
libraryieee;
useieee.std_logic_1164.all;
entityFRE_DIVIDEis
port(clk_1M:
instd_logic;
clk_1K,clk_1MZ:
outstd_logic);
endentityFRE_DIVIDE;
architectureartofFRE_DIVIDEis
signalcout1,cout2:
integer;
signalK,MZ:
std_logic;
begin
process(clk_1M)is
begin
clk_1K<=K;
clk_1MZ<=MZ;
if(clk_1M'eventandclk_1M='1')then
ifcout1<999999thencout1<=cout1+1;MZ<='0';
elsecout1<=0;MZ<='1';endif;
ifcout2<9999thencout2<=cout2+1;K<='0';
elsecout2<=0;K<='1';endif;
endif;
endprocess;
endarchitectureart;
REG32B
libraryieee;
useieee.std_logic_1164.all;
entityREG32Bis
port(load:
instd_logic;
din:
instd_logic_vector(31downto0);
dout:
outstd_logic_vector(31downto0));
endentityREG32B;
architectureartofREG32Bis
begin
process(load,din)is
begin
ifload'eventandload='1'thendout<=din;
endif;
endprocess;
endarchitectureart;
SEG7-DEC
Libraryieee;
Useieee.std_logic_1164.all;
EntitySEG7_DECis
Port(bcd:
instd_logic_vector(3downto0);
y:
outstd_logic_vector(6downto0));
EndentitySEG7_DEC;
Architecturert1ofSEG7_