四、各模块仿真测试 1、(1)0-9计数器功能仿真:
2、(1)0-999计数器功能仿真:
3、(1)译码显示电路功能仿真
4、(1)整体时序仿真:
五、实验结论:
1、十进制计数器确实能实现对时钟脉冲的计数并且产生进位输出;
2、由十进制计数器级联成的0-999计数器也能实现对时钟脉冲的计数,并且产生进位输出,而且输出的计数符合8421码格式。
3、七段显示程序的输出是十六进制形式,输出结果与原理完全一致。 4、各个仿真波形均有延迟。
5、各模块及总体均符合功能设计要求。
六、思考题:
要译出0-9和‘一’,只需要将译码模块中的when others=> dout<=“0000000”
改为:when others=> 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、写出实验源程序,画出仿真波形; 七段译码器源程序 Library ieee;
Use ieee.std_logic_1164.all; Entity BCD is
Port(bcd:in std_logic_vector(3 downto 0); y:out std_logic_vector(6 downto 0)); End entity BCD; Architecture rt1 of BCD is Begin Process(bcd) is Begin Case bcd is
When \
When \ When \ When \ When \ When \ When \ When \ When \ When \ When others=>y<=\ End case; End process; End architecture rt1; 计数器源程序 Library 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 is Signal y:std_logic_vector(2 downto 0); Begin
Process(clk,reset) is Begin d<=y;
if reset='1' then y<=\ else
if (clk'event and clk='1') then if (y=\ y<=\ else