verilog实现流水灯500ms(循环移位) |
您所在的位置:网站首页 › keil8个流水灯编程 › verilog实现流水灯500ms(循环移位) |
一、流水灯实验思路: 流水灯就是使开发板上的4个LED灯按照一定的时间依次交替亮灭。比如,要设计一个流水灯,开始时LED0点亮,经过500ms后LED0熄灭,LEDO熄灭同时 LED1被点亮,再经过500ms后LED1熄灭,LED2点亮,依此类推。 由于二极管的阳极分别与FPGA相应的管脚相连,只需要改变与LED灯相连的FPGA管脚的电平,LED灯的亮灭状态就会发生变化。当FPGA管脚为高电平时, LED灯点亮;为低电平时,LED 灯熄灭。 二、实验要求: 实现FPGA 控制4个LED流水循坏点亮每个LED,点亮的LED的时间500ms。 那么如何实现500ms计数呢? 实现500ms计数就是将500ms(500_000_000)分成时钟周期计算,一个时钟周期为20,500_000_000÷20 = 25_000_000,所以计数的最大值是 25_000_000-1 / /最大值-1的原因是计数器计数是从0开始计数的,这里面的下划线没有任何意义,只是为了方便看数。 三、程序实现 首先我们需要知道流水灯的变化规律,如下图所示: 所以从上图我们知道,实现这个功能无非是对四位二进制数进行移位操作,左移右移都可以实现只是写法需要注意写法: 本程序使用两个always实现,功能文件如下: tb文件,本设计只需要观察时钟与复位信号,无需其他控制,较简单,tb文件如下: / / tb文件中,15行进行参数重定义的原因是,流水灯功能程序中DELAY_500MS的时间太长了,在modelsim进行波形仿真时,需要跑较长的时间,才能观察到波形的所有状态,所以这个时候,我们需要对计数器的参数进行重定义,格式为 (defparam 例化名.功能代码中的计数器参数 = 自己定义的新数值 )。【重定义参数是根据自己的需要,如果不在意波形跑的快慢可以不进行重定义参数,重定义参数不影响程序】
波形图如下: |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |