使用Altera FPGA开发板和7段数码管设计并实现一个四位十进制计数器
这个项目是我首次在FPGA上实现RTL设计,用于与外部组件进行接口连接。此前我曾尝试使用Altera MAX II EPM240 CPLD来实现简单的数字逻辑,例如多路复用器、解码器、用于闪烁LED的计数器,甚至UART发送器。尽管编程过程非常有趣,但很快我就意识到,仅靠240个逻辑单元难以完成太多功能。于是我投资购买了一块FPGA板,并最终在AliExpress上选择了Altera Cyclone IV EP4CE6E22C8N板,因其成本相对较低且内置多种外设,而成为我的首选。
作为我新电路板上的第一个项目,我决定做一个“Hello World”式的简单程序,但这次不使用LED闪烁,因为我之前已经用CPLD试过这个功能。最终我选择了电路板上的4位7段数码管,并给自己设定任务:设计一个计数器,从0开始递增到9999,每秒加1,当达到最大值9999时自动回零。当时我选择的硬件描述语言是VHDL,因为这是我在那时最熟悉的语言。
硬件
EP4CE6E22C8N板上的4位7段数码管采用共阳极结构。由于阳极连接到公共端子,因此需要施加高电压来激活器件的每个数码,从而使各段LED能够独立控制(通过低电压即可点亮)。四个数码共用同一组引脚来控制各个段(实现多路复用)。由于引脚经过复用,只有在每次选择7段数码中的一个时,才能显示不同数字的数据,从而逐个显示每个数码的数值,并快速切换至下一个,使人类肉眼无法察觉过渡过程。
RTL设计
该设计包含三个VHDL文件/模块,分别为:seg_display.vhd、seg_counter.vhd和seg_rom.vhd。用于显示数字0到9的逻辑/位组合存储在ROM模块中。计数器模块根据七段数码管上各位数字的位值,以相应速率从0递增到9。共有四个数字位:个位、十位、百位和千位。计数器被实例化以更新各数字的值,使得下一个数字(左侧)的计数器速度比前一个慢10倍。尽管这种设计可以工作,但效率极低,因为它需要四个活动的计数器。更好的解决方案是使用双达布算法(我几个月后才了解到这一点)将要显示的数值从二进制转换为BCD。七段数码管的VHDL模块会实例化计数器和ROM模块,并切换七段数码管上的各个数字,以实现如本文硬件部分所述的正确显示不同数字的效果。
建设项目
多年来,我通过使其在一定程度上独立于平台,对项目进行了一些调整。使用Tcl脚本,在Windows和Ubuntu系统上均可顺利构建,不会出现问题。
代码
本文编译自hackster.io





