我们刚开始学习软件编程时,首先写的第一个代码是“Hello World”,而对于嵌入式或者单片机开发者,第一个硬件程序莫过于流水灯。
流水灯,顾名思义就是LED灯像流水一样闪烁。比如有n个灯,它的闪烁过程为:第1个灯亮->第2个灯亮->第3个灯亮->...->第n个灯亮->第1个灯亮->第2个灯亮->第3个灯亮->...一直这样循环下去,我们就会看到一个灯接着一个灯亮起来,如果亮的速度快一点儿的话,就像流水一样,也就是我们所说的流水灯。
我们这里以LED灯亮为高电平,灭为低电平,且有3个LED灯,将上述的操作过程抽象为数字时序,假设每个灯亮的时间为100ms,可得到如下的时序图:
是不是很清晰,每个灯亮的时间为100ms,第1个灯结束之后第2个灯亮,第2个结束之后第3个亮,第3个结束之后又开始第1个亮,依次循环。从图里面还可以看出从第1个灯开始到第3个灯结束,所用的总时间为300ms,其实这300ms就是循环一次的周期。
下面我们用FPGA来产生上面的时序并输出,使其对应到具体的LED灯上。这里还有个问题需要解决,我们FPGA的系统时钟为50MHz,其周期为20ns,现在我们需要一个周期为300ms的时间长度,那么需要计多少数,并且计数器需要多大的二进制位宽:Count=300ms/20ns=15000000=0xe4e1c0,将0xe4e1c0对应到二进制数上,其位宽为24位。既然知道了位宽及计数大小,下面我们开始编写流水灯的FPGA程序。
这就是流水灯的FPGA程序,使用Verilog语言编写,是不是很简单呀,是不是和C语言差不多呀~~~~
代码编写完毕之后,开始综合编译并编写TestBench测试文件进行仿真。
编写完TestBench测试文件之后调用Modelsim软件进行仿真,流水灯周期为300ms,这对Modelsim是一个很长的时间,此时基本电脑能卡死,仿真时间巨长,小编在这里试试看,能不能出现波形~~~~
终于仿真出来了,足足花了半个多小时的时间,才跑到600ms,内心是崩溃的~~~~
这就是仿真波形,是不是和我们前面抽象的数字时序波形一致呀~~~~
下面我们回到Quartus ii软件中,进行引脚分配和下载。
引脚分配结束之后,再次进行全局编译,然后下载程序至FPGA中。
我们来看看程序下载之后的实际效果~~~~
我们可通过抓取3个led灯两端的实际波形,通过示波器来观看,验证设计的正确性。
通过上面实际的示波器波形,可以证明,我们今天的设计是对的,完成了我们最终要实现的功能。小编的内心也是很开心的,哈哈哈~~~
这就是基于FPGA的流水灯程序,你学会了吗~~~~
文章评论(0条评论)
登录后参与讨论