Verilog语言实现点亮LED灯的效果

程序简介:该模块实现点亮LED灯以0.5s的时间间隔进行点亮 熄灭的效果,也是同学们成为“点灯大师”的关键一步

/*
 * LED闪烁模块
 * 功能:通过计数器实现LED定时翻转,产生周期性闪烁效果
 * 闪烁频率 = 系统时钟频率 / (2*(计数器最大值+1))
 * 本例使用50MHz时钟时,LED每秒闪烁1次(周期1秒)
 */
module LED_flash(
    input        Clk,      // 系统时钟输入(假设50MHz)
    input        Reset_n,  // 异步复位信号,低电平有效
    output reg   Led       // LED输出信号
);

    // 25位宽计数器(最大计数值25,000,000对应50MHz时钟的0.5秒)
    reg [24:0] counter;    // 2^25 = 33,554,432 > 25,000,000

    // 计数器控制逻辑
    always@(posedge Clk or negedge Reset_n) 
    begin
        if(!Reset_n)                // 异步复位
            counter <= 0;           // 复位时计数器清零
        else if(counter == 24999999)// 达到0.5秒计数值(50MHz时钟)
            counter <= 0;           // 计数器归零
        else 
            counter <= counter + 1'd1; // 常规计数递增
    end

    // LED控制逻辑
    always@(posedge Clk or negedge Reset_n) 
    begin
        if(!Reset_n)                // 异步复位
            Led <= 0;               // 复位时关闭LED
        else if(counter == 24999999)// 每0.5秒触发一次
            Led <= !Led;            // 翻转LED状态(产生1Hz闪烁)
    end
    
endmodule

咱们这里闪烁的周期是1s,那么就是说咱们需要在1s内完成LED闪烁和熄灭的效果,就设定LED闪烁和熄灭各自为0.5s,相当于0.5s变换一次状态。如果不按0.5s计算的话,这里还会涉及到一个分频器的知识,这个我后面还会再出一篇博客进行讲解。

此外,这里面涉及一个counter数值位宽的计算:

上面讲到,我们需要0.5s变换一次状态,1s完成一个周期

开发板的时钟为50MHz,当Clk=50MHz时,时钟周期=20ns  

0.5s/20ns=25,000,000,也就是经过25,000,000次上升沿后,进行一次状态变换,那么我们就需要去用一个变量来计算上升沿的次数。25,000,000对应的二进制编码为25位 ,因此我们需要一个25位宽的变量,也就是 [24:0]counter

计数时是从0开始的,以4为例:0到1、1到2、2到3、3到0为四次计数,因此实际上的计数值应为计数次数-1

所以此处的计数值应为25,000000-1=24,999,999,即24,999,999对应0.5秒

(24,999,999+1)*20ns = 500,000,000ns  ,1s=10^9ns

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gogera

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值