电子科技大学EDA指导书附完整答案 下载本文

内容发布更新时间 : 2024/4/28 13:19:02星期一 下面是文章的全部内容请认真阅读。

四、各模块仿真测试 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