基于PWM的呼吸灯设计(Verilog版)

Posted lightmonster

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于PWM的呼吸灯设计(Verilog版)相关的知识,希望对你有一定的参考价值。

module Breath_Led(clk,rst,led);
input clk,rst;
output reg led;
reg[19:0] count;
reg[19:0] duty_cycle;
always @(posedge clk)
begin
    if(!rst)
    begin
        led<=1b0;
        count<=1b0;
    end
    else
    begin
        if(count<20d999_999)
        begin
            count<=count+1b1;
            if(count<duty_cycle)
                led<=1b1;
            else
                led<=1b0;
        end
        else
            count<=1b0;
    end
end
reg flag;
always @(posedge led)
begin
    if(!rst)
    begin
        duty_cycle<=1b1;
        flag<=1b0;
    end
    else
    begin
        if(flag==1b0)
        begin
            if(duty_cycle<20d979_511)
            begin
                duty_cycle<=duty_cycle+15d9990;
                flag<=1b0;
            end
            else
            begin
                duty_cycle<=duty_cycle-15d9990;
                flag<=1b1;
            end
        end
        else
        begin
            if(duty_cycle>1b1)
            begin
                duty_cycle<=duty_cycle-15d9990;
                flag<=1b1;
            end
            else
            begin
                duty_cycle<=duty_cycle+15d9990;
                flag<=1b0;
            end
        end
    end
end
endmodule

记录自己写的呼吸灯小程序,程序未经重构,总体较粗糙,望看官见谅。

主体思想是基于PWM脉冲宽度调制来控制LED呈现出一种由暗到亮-由亮到暗的渐变效果;

由于程序比较简单,故程序中没有给出详细注释,在这里大概说一下其两个always块的作用,

第一个always块下面主要是实现一个闪烁频率为50Hz的LED功能,但每个闪烁周期的亮与灭的占空比由下面的always块控制。

第二个always块通过对占空比变量赋初值1的方式开始递增,当达到接近闪烁周期时(此程序中不要超过闪烁周期,否则会出问题,可以修改触发沿或其他方式控制,这里不做讨论)做递减操作。

通过这种简单的控制每个周期的高电平占空比便可以控制LED实现呼吸灯的效果。

以上,欢迎各位看客共同讨论,共同进步!!!

以上是关于基于PWM的呼吸灯设计(Verilog版)的主要内容,如果未能解决你的问题,请参考以下文章

PWM(脉宽调制)——LED特效呼吸灯设计

STM8S系列基于STVD标准库外设库开发,PWM输出实现LED呼吸灯效果

LabVIEW控制Arduino实现PWM呼吸灯(基础篇—5)

Arduino 利用PWM对板载LED实现呼吸灯效果

LabVIEW控制Arduino实现PWM呼吸灯(基础篇—5)

LabVIEW控制Arduino实现PWM呼吸灯(基础篇—5)