实验二 7段数码管译码器设计与实现
[实验目的]
熟悉 VHDL 语言的语法规范
了解模块之间的连接
[重点和难点]
VHDL 语言中 port map 的使用
模块化设计方法
[设备器材]
稳压电源
万用表
示波器
计算机
实验板一块
Quartus II 4.1
Syplify8.1
[预习思考题]
1) 仔细阅读下面的[相关知识]介绍,怎样在本次设计里面体现出
顶层设计和底层设计(解释一下你的功能划分和端口定义)?
2) 为了控制实验板上的数码管,我们需要定义哪些端口?
3) 要使数码管 DISP6 点亮,控制端口应该怎样控制?
[实验内容]
用 VHDL 描述7段数码管译码器,完成编译、仿真和下载。
要求:
1) 输入为一个四位二进制数,使用拨码开关 SW1、SW2、SW3
和 SW4 表示,其中 SW1 是最高位,SW4 是最低位,并使用
发光二极管 LD1、LD2、LD3 和 LD4 显示这四位二进制数,
LD1 是最高位,LD4 为最低位,亮表示‘1’,不亮表示‘0’。
2) 输出为0~9这10个数码管图形,在数码管 DISP6 上显示。
具体编码方式可以参考下面的表格。注意:这里的
0
(10)
9~
(10)
为
十进制表示,对应着二进制的
0000
(2)
~
1001
(2)
3) 对于二进制的1
010
(2)
~
1111
(2)
这6个状态要求数码管什么都不
显示,处于全灭的状态。
[相关知识]
1) 7段数码管结构如图所示:
每一段都是一个发光二极管,它们的负极全部连接到一
起,所以叫共阴极(Common cathode)。我们开发板上的 CAT
就是阴极的缩写。
如(c)图所示,当需要用7段数码管显示数字时,我们
只需要点亮某些二极管即可,这是0~9通常的显示模式。
图(d)是每个字符对应的管脚输入值。
通常7段数码管还有一个小数点显示,所以它的输入端有
8个,设计时要注意是否需要点亮小数点。
在实验板上我们用 AA,AB,AC,AD,AE,AF,AG,
AP 分别表示 a,b,c,d,e,f,g,p。
实验板上有6个7段数码管,它们的8个输入端(a~g 和
p)都是并联在一起的,共阴极是分开的(CAT1~CAT6)。我
们需要点亮某个数码管只需要给对应的 CATn 置‘0’即可。
注意6个 CAT 端不允许同时出现一个以上‘0’。
所以我们的设计里,输出管脚除了数据端(a~g 和 p)外
还应有6个控制端(CAT1~CAT6),并且必须保证6个控制端
上的数据在任意时刻只有一个为 0。
有兴趣的同学想想,怎样利用这个硬件特点,在不同位置
显示不同的数(不要求同时显示)。
2) 我们一般把具体实现叫做顶层设计,在这一层次主要考虑需要
用到多少 IO 口;对于这些 IO 口的信号的处理模块我们叫做底
层设计,例如各种译码模块。
一般我们写好一个译码模块后,不必要每次在新的设计里
面都加入这个 process,而是把它做成一个独立的文件,今后
直接使用这个独立的文件(事先要用 component 定义),用 port
map 关键字给实例化。
这样能够保证设计的一致性,只要修改一个底层设计文件,
所有用到这个底层设计文件的顶层设计在重新编译后就都会
使用新的设计了。
更进一步,可以使用 package 来打包,这样连 component
定义都可以省去,通过 use 语句加入自己的包之后就能够直接
port map 了。
3) 在模块例化中使用名称符号,不要用位置符号,便于检查错误。
在完成了前面基本实验要求后,才可以选择下面的扩展实验
[扩展实验]
1) 7段数码管输入端改为第一次实验的2位加法器的结果。由于
2位加法器的结果也是2位,而7段数码管输入端是4位的,
所以需要扩展2位加法器的输出,构成4位宽度才能够连接到
译码器输入端。
注意,2位加法器模块和7段数码管显示模块都不能再进
行改动,而是直接使用。用一个顶层设计把它们包括进去。