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  例化名.功能代码中的计数器参数 = 自己定义的新数值 )。【重定义参数是根据自己的需要,如果不在意波形跑的快慢可以不进行重定义参数,重定义参数不影响程序】

 

 波形图如下:

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值