本文由面包板社区博主“小马哥”原创,未经允许不得转载!
面包板社区博客大赛正在进行中,了解详情请撮→
2017面包板社区博客大赛!第一季开赛!
博客大赛奖项设置:
特等奖(1名):3000元 + 奖杯
一等奖(2名):1500元 + 奖杯
二等奖(3名):800元 + 奖杯
三等奖(5名):500元
博客链接:https://www.mianbaoban.cn/blog,手动输入网址前往开博参赛!
我们刚开始学习软件编程时,首先写的第一个代码是“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软件中,进行引脚分配和下载。