1、数字系统EDA技术实验指导书学院:学号:姓名: 实验一 八位全加器的设计一、 预习内容1. 结合教材中的介绍熟悉Quartus软件的使用及设计流程;2. 八位全加器设计原理。二、实验目的3. 图形设计方法二、实验目的1. 掌握图形设计方法;2. 熟悉Quartus软件的使用及设计流程;3. 掌握全加器原理,能进行多位加法器的设计。三、实验器材三、 实验器材PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干四、实验要求 1、用VHDL设计一个四位并行全加器; 2、用图形方式构成一个八位全加器的顶层文件; 3、完成八位全加器的时序仿真。五、实验原理与内容1、原理:加法器是数字系统
2、中的基本逻辑器件。例如:为了节省资源,减法器和硬件乘法器都可由加法器来构成。但宽位加法器的设计是很耗费资源的,因此在实际的设计和相关系统的开发中需要注意资源的利用率和进位速度等两方面的问题。多位加法器的构成有两种方式:并行进位和串行进位方式。并行进位加法器设有并行进位产生逻辑,运算速度快;串行进位方式是将全加器级联构成多位加法器。通常,并行加法器比串行级联加法器占用更多的资源,并且随着位数的增加,相同位数的并行加法器比串行加法器的资源占用差距也会越来越大。实验表明,4 位二进制并行加法器和串行级联加法器占用几乎相同的资源。这样,多位数加法器由4 位二进制并行加法器级联构成是较好的折中选择。因此
3、本实验中的8 位加法器采用两个4位二进制并行加法器级联而成。2、实现框图: 1)四位加法器 四位加法器可以采用四个一位全加器级连成串行进位加法器,实现框图如下图所示,其中CSA为一位全加器。显然,对于这种方式,因高位运算必须要等低位进位来到后才能进行,因此它的延迟非常可观,高速运算肯定无法胜任。通过对串行进位加法器研究可得:运算的延迟是由于进位的延迟。因此,减小进位的延迟对提高运算速度非常有效。下图是减少了进位延迟的一种实现方法。可见,将迭代关系去掉,则各位彼此独立,进位传播不复存在。因此,总的延迟是两级门的延迟,其高速也就自不待言。2)八位加法器用两个并行四位加法器实现一个八位加法器的框图如
4、下:六、实验步骤1、 用VHDL语言或图形输入法设计一个并行四位全加器;2、 利用步骤一得到的四位全加器使用图形输入法实现一个8位全加器;3、 对最后的顶层文件进行编译、仿真;4、 如果时间有余可以直接设计一个八位的串行全加器,比较上述两种方法 综合后的不同(主要从消耗资源和运算速度考虑)。七、实验报告1、四位加法器library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity adder4 is port(c4: in std_logic; a4: in std_logic_vector(3 do
5、wnto 0); b4: in std_logic_vector(3 downto 0); s4: out std_logic_vector(3 downto 0); co4: out std_logic);end entity adder4;architecture art of adder4 is signal s5:std_logic_vector(4 downto 0); signal a5,b5:std_logic_vector(4 downto 0); begin a5=0&a4; b5=0&b4; s5=a5+b5+c4; s4=s5(3 downto 0); co4c8,a4=
6、a8(3 downto 0),b4=b8(3 downto 0),s4=s8(3 downto 0),co4=sc); u2:adder4 port map(c4=sc,a4=a8(7 downto 4),b4=b8(7 downto 4),s4=s8(7 downto 4),co4=co8); end architecture art;电路图 仿真波形实验二 用七段LED显示8421BCD码的VHDL设计一、预习内容1、 结合附录一了解EDA实验箱的原理;2、 七段LED显示原理;3、 怎样用VHDL实现8421BCD码在七段LED数码管上显示。二、实验目的实验目的1. 了解VHDL进行ED
7、A设计的基本步骤;2. 学会用Quartus进行时序仿真;3. 了解EDA实验箱的基本功能;三、实验器材验器材PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干四、实验要求1. 用VHDL设计具有清除端、使能端,计数范围为0-999的计数器设计。输出为8421BCD码;2. 用VHDL设计七段LED译码显示电路;3. Quartus进行时序仿真;4. 下载该程序验证程序是否正确;5. 请事先准备一个优盘,本实验程序需要保存,后面实验需要用到。五、实验原理与内容1、 8421BCD编码 在数字系统中常用四位二进制代码来表示一位十进制数字0、1、2、9,称之为二十进制代码,即BC
8、D码。将十进制数编成BCD码的电路,称为称二十进制(BCD)编码器。二-十进制编码的方案很多,若BCD编码器采用8421编码方案,称为8421BCD编码器。2、 七段译码器下图为译码器逻辑图,请按图进行连线。其中A,B,C,D 接拨号开关,a,b,c,d,e,f,g 接数码显示接口,管脚映射均为I/O 口,映射后,通过拨号开关改变输入二进制码,则输出数码管上显示相应的数值。3、 译码器真值表数值输入输出ABCDabcdefg00000111111010001011000020010110110130011111100140100011001150101101101160110101111170
9、1111110000810001111111910011111011A10101110111B10110011111C11001001110D11010111101E11101001111F11111000111六、实验步骤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)译码显示
10、电路功能仿真4、(1)整体时序仿真:五、实验结论:1、十进制计数器确实能实现对时钟脉冲的计数并且产生进位输出;2、由十进制计数器级联成的0-999计数器也能实现对时钟脉冲的计数,并且产生进位输出,而且输出的计数符合8421码格式。3、七段显示程序的输出是十六进制形式,输出结果与原理完全一致。4、各个仿真波形均有延迟。5、各模块及总体均符合功能设计要求。六、思考题:要译出0-9和一,只需要将译码模块中的when others= dout doutyyyyyyyyyyy=0000000; End case;End process;End architecture rt1;计数器源程序Library
11、 ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity count is Port(clk,reset:in std_logic; d:out std_logic_vector(2 downto 0);End entity count;Architecture rt1 of count isSignal y:std_logic_vector(2 downto 0);Begin Process(clk,reset) is Begin d=y; if reset=1 then y=000; else if (
12、clkevent and clk=1) then if (y=111) then y=000; else y=y+1; end if; end if; end if;end process;end architecture rt1;输入数据Library ieee;Use ieee.std_logic_1164.all;Entity data is Port(count:in std_logic_vector(2 downto 0); reset:in std_logic; y:out std_logic_vector(3 downto 0);End entity data;Architect
13、ure rt1 of data isBegin Process(count,reset) isBegin if reset=1 then yyyyyyyyyy=0000; End case; end if;End process;End architecture rt1;电路图仿真波形显示结果2、 总结实验步骤和实验结果 实验过程中用到的子程序很多,要保证每一个子程序的准确性。因为输入很多,在做波形图的时候要注意接入高低电平。3、 心得体会 在调试输出的数据的时候要注意高位和低位。在实验过程中,就出现了高地位相反的问题。 实验四 数字频率计的设计及实现一、预习内容1、什么是数字频率计;2、数字
14、频率计实现原理;3、写出原理草图和源程序。二、实验目的二、实验目的1、学会数字频率计的设计方法;2、掌握自顶向下的设计方法,体会其优越性。三、实验器材三、实验器材PC机一台、EDA教学实验系统一台、下载电缆一根(已接好)、导线若干四、实验要求1、用VHDL完成8位数字频率计的设计, 该频率计要求频率测量范围:1 Hz 20 MHz;具有清零复位功能;频率测量结果用八位数码管稳定显示;2、用实验系统箱实现该频率计,并用数码管显示所测的频率值。五、实验原理与内容1、测频原理若某一信号在T秒时间里重复变化了N 次,则根据频率的定义可知该信号的频率fs 为:fs=N/T 通常测量时间T取1秒或它的十进
15、制时间。频率计方框图如下:1)时基T 产生电路:提供准确的计数时间T。晶振产生一个振荡频率稳定的脉冲,通过分频整形、门控双稳后,产生所需宽度的基准时间T的脉冲,又称闸门时间脉冲。注意:分频器一般采用计数器完成,计数器的模即为分频比。2)计数脉冲形成电路:将被测信号变换为可计数的窄脉冲,其输出受闸门脉冲的控制。3)计数显示电路:对被测信号进行计数,显示被测信号的频率。计数器一般采用多位10 进制计数器;控制逻辑电路控制计数的工作程序:准备、计数、显示、复位和准备下一次测量。2、具体实现:1) 测频控制逻辑电路(以1 秒为例)2) 产生一个1秒脉宽的周期信号;3) 对计数器的每一位计数使能进行控制
16、;4) 完成下一次测量前的计数器复位;以下是一种可能的时序关系:5) 10 进制计数器要求具有计数使能端CNTEN、复位端CLR、进位输出端CO。3、元件例化图(方框图):注意:用8个十进制计数器实现1MHz 计数。六、实验步骤六、实验步骤1、画出实验原理方框图;2、设计各个元件;3、进行元件例化;4、下载程序,查看数码管显示的频率是否和待测的频率相同。七、实验报告1、源程序CNT10library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity CNT10 is port(clk,clr,ena:
17、in std_logic; cq:out integer range 0 to 15; carry_out:out std_logic);end entity CNT10;architecture art of CNT10 issignal cqi:integer range 0 to 15;begin process(clk,clr,ena) is begin if clr=1 then cqi=0;elsif clkevent and clk=1 then if ena=1 then if cqi9 then cqi=cqi+1;else cqi=0;end if; end if;end
18、if; end process; cq=cqi;end architecture art;FRE_DIVIDElibrary ieee;use ieee.std_logic_1164.all;entity FRE_DIVIDE is port(clk_1M:in std_logic; clk_1K,clk_1MZ:out std_logic);end entity FRE_DIVIDE;architecture art of FRE_DIVIDE issignal cout1,cout2:integer;signal K,MZ:std_logic;beginprocess(clk_1M) is
19、begin clk_1K=K; clk_1MZ=MZ; if (clk_1Mevent and clk_1M=1) then if cout1999999 then cout1=cout1+1;MZ=0;else cout1=0;MZ=1;end if;if cout29999 then cout2=cout2+1;K=0;else cout2=0;K=1;end if; end if;end process;end architecture art;REG32Blibrary ieee;use ieee.std_logic_1164.all;entity REG32B is port(loa
20、d:in std_logic; din:in std_logic_vector(31 downto 0); dout:out std_logic_vector(31 downto 0);end entity REG32B;architecture art of REG32B is begin process(load,din)is begin if loadevent and load=1 then doutyyyyyyyyyyy=0000000; End case;End process;End architecture rt1;TESTCT1library ieee;use ieee.st
21、d_logic_1164.all;use ieee.std_logic_unsigned.all;entity testctl is port(clk:in std_logic; tsten,clr_cnt,load:out std_logic);end entity testctl;architecture art of testctl is signal div2clk:std_logic; begin process(clk)is begin if clkevent and clk=1 thendiv2clk=not div2clk;end if; end process; process(clk,div2clk)is begin if clk=0and div2clk=0 thenclr_cnt=1;else clr_cnt=0;end if; end process; load=not div2clk;tsten=div2clk;end architecture art;2、3、