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實現呼吸燈的效果。
以上,歡迎各位看客共同討論,共同進步!!!