基於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<=1'b0;
        count<=1'b0;
    end
    else
    begin
        if(count<20'd999_999)
        begin
            count<=count+1'b1;
            if(count<duty_cycle)
                led<=1'b1;
            else
                led<=1'b0;
        end
        else
            count<=1'b0;
    end
end
reg flag;
always @(posedge led)
begin
    if(!rst)
    begin
        duty_cycle<=1'b1;
        flag<=1'b0;
    end
    else
    begin
        if(flag==1'b0)
        begin
            if(duty_cycle<20'd979_511)
            begin
                duty_cycle<=duty_cycle+15'd9990;
                flag<=1'b0;
            end
            else
            begin
                duty_cycle<=duty_cycle-15'd9990;
                flag<=1'b1;
            end
        end
        else
        begin
            if(duty_cycle>1'b1)
            begin
                duty_cycle<=duty_cycle-15'd9990;
                flag<=1'b1;
            end
            else
            begin
                duty_cycle<=duty_cycle+15'd9990;
                flag<=1'b0;
            end
        end
    end
end
endmodule

記錄自己寫的呼吸燈小程序,程序未經重構,總體較粗糙,望看官見諒。

主體思想是基於PWM脈沖寬度調制來控制LED呈現出一種由暗到亮-由亮到暗的漸變效果;

由於程序比較簡單,故程序中沒有給出詳細注釋,在這里大概說一下其兩個always塊的作用,

第一個always塊下面主要是實現一個閃爍頻率為50Hz(這里晶振為50M)的LED功能,但每個閃爍周期的亮與滅的占空比由下面的always塊控制。

第二個always塊通過對占空比變量賦初值1的方式開始遞增,當達到接近閃爍周期時(此程序中不要超過閃爍周期,否則會出問題,可以修改觸發沿或其他方式控制,這里不做討論)做遞減操作。

通過這種簡單的控制每個周期的高電平占空比便可以控制LED實現呼吸燈的效果。

以上,歡迎各位看客共同討論,共同進步!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM