数码管共有八个段选信号,通过电阻直接与FPGA相连接;有六个供电端,分别三极管相连接,三极管的控制端由三八译码器的输出控制,三八译码器的输入是由FPGA控制输出。
数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。
数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管。
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
例如:如果想要显示数字“1”,则B、C段亮,其他段不亮就可以了。
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当FPGA输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于FPGA对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
开发板上的数码管为共阳极数码管,并且为动态显示接口,在COM端的三极管是PNP三极管,故而输出低电平时,三极管导通。
三八译码器的原理为C、B、A组成输入信号,根据C、B、A的输入值,对应选择Y(低电平选中)。
三八译码器的使能端已经通过电路固定好,一直处于使能状态。FPGA只需要控制C、B、A即可,然后就会选中对应的数码管。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
每一位数码管都可以显示十进制的0~9,或者显示十六进制的0~9以及A~F。一个数码管可以显示任意的四位二进制,六个数码管可是显示任意的24位二进制。
24位二进制实际上会分为6组四位的二进制,分别显示到对应的数码管上。
在设计时,首先设计1ms的计时器。1ms中切换一次选中的管子;根据选中的管子,选择出对应的四位二进制,然后将二进制译码为对应的段选信号输出。
共阳极数码管段选信号码表为:
本模块命名为seven_tube_drive。
在编写代码时,将data信号作为端口信号,下板时由于没有外界提供此信号,所以下板时,会将此信号从端口处省略掉,内部直接产生一个固定的数值。
设计一个1ms的计数器,每1ms切换一次要点亮的数码管。根据要点亮的位从data的24位中选择出对应的四位,然后将四位数据译码为段选信号即可。
设计代码为:
在设计中,定义了一个sel寄存器,端口的seven_tube_sel为sel寄存器的寄存信号,时序上会比sel晚一拍。show_data信号的产生是利用sel寄存器和外部data的组合逻辑信号,时序上和sel同步;端口的seven_tube_seg_n为show_data信号的寄存信号,时序上会比show_data信号晚一拍。因此seven_tube_seg_n和seven_tube_sel信号是同步的,都比sel信号晚一拍。此时数码管就不会出现“鬼影”。
当数码管的seven_tube_sel和seven_tube_seg_n不同步时,就会导致选中的管子和想要显示的数字不是完全同步的,由于不同步的时间相对比较少,所以显示出错误的数字的时间较短,点亮的程度就会比较小,称为“鬼影”。
在仿真时,将T_1ms的参数修改为10。
data的数据按照16进制的方式赋值即可,赋值后不要进行更改,否则不利于仿真图的查看。
仿真代码为:
在仿真图中,将cnt、sel、show_data信号调出;将data信号设置为十六进制显示,cnt设置为无符号位显示,sel设置为无符号位显示,show_data设置为十六进制显示。
可以从图中看出,设计符合我们的设计要求。
下板时,将T_1ms修改为50_000。并且将部分设计代码修改为下列格式:
进行分析综合后,进行分配管脚。下板后,就可以看到数码管上显示123456。
设计者可以修改data的赋值,再次综合后,观测数码管显示数据是否正确。
测试完成后,在后续使用过程中,还是需要将data设置为端口,以供给其他模块进行驱动。