1. 程式人生 > 其它 >用verilog實現PWM控制呼吸燈。呼吸週期2秒:1秒逐漸變 亮,1秒逐漸變暗。系統時鐘24MHz,pwm週期1ms,精度1us。

用verilog實現PWM控制呼吸燈。呼吸週期2秒:1秒逐漸變 亮,1秒逐漸變暗。系統時鐘24MHz,pwm週期1ms,精度1us。

簡述PWM

PWM——脈寬調製訊號(Pulse Width Modulation),它利用微處理器的數字輸出來實現,是對類比電路控制的一種非常有效的技術,廣泛應用於測量、通訊、功率控制與變化等許多領域。

LED特效呼吸燈原理

採用pwm的方式,在固定的頻率下,採用佔空比的方式來實現LED亮度的變化。佔空比為0,LED燈不亮,佔空比為100%,則LED燈最亮。所以將佔空比從0到100%,再從100%到0不斷變化,就可以實現LED燈實現特效呼吸。

下面是Verilog描述:注:上硬體測試時,引數DELAY1000 還是要改為1000,下面程式碼中的DELAY1000 = 10是願作者為了模擬方便定的值。

module led(
input
clk, //24Mhz input rst_n, output led_out ); parameter DELAY24 = 24; //parameter DELAY1000 = 1000; parameter DELAY1000 = 10;//just test wire delay_1us; wire delay_1ms; wire delay_1s; reg pwm; reg [7:0] cnt1; reg
[10:0] cnt2; reg [10:0] cnt3; reg display_state; //延時1us always @(posedge clk or negedge rst_n)begin if(!rst_n) cnt1 <= 6'b0; else if(cnt1 == DELAY24 - 1'b1) cnt1 <= 6'b0; else cnt1 <= cnt1 + 1'b1; end assign delay_1us = (cnt1 == DELAY24 - 1
'b1)? 1'b1:1'b0; //延時1ms always @(posedge clk or negedge rst_n)begin if(!rst_n) cnt2 <= 10'b0; else if(delay_1us == 1'b1)begin if(cnt2 == DELAY1000 - 1'b1) cnt2 <= 10'b0; else cnt2 <= cnt2 + 1'b1; end else cnt2 <= cnt2; end assign delay_1ms = ((delay_1us == 1'b1) && (cnt2 == DELAY1000 - 1'b1))? 1'b1:1'b0; //延時1s always @(posedge clk or negedge rst_n)begin if(!rst_n) cnt3 <= 10'b0; else if(delay_1ms) begin if(cnt3 == DELAY1000 - 1'b1) cnt3 <= 10'b0; else cnt3 <= cnt3 + 1'b1; end else cnt3 <= cnt3; end assign delay_1s = ((delay_1ms == 1'b1) && (cnt3 == DELAY1000 - 1'b1))? 1'b1:1'b0; //state change always @(posedge clk or negedge rst_n)begin if(!rst_n) display_state <= 1'b0; else if(delay_1s)//每一秒切換一次led燈顯示狀態 display_state <= ~display_state; else display_state <= display_state; end //pwm訊號的產生 always @(posedge clk or negedge rst_n)begin if(!rst_n) pwm <= 1'b0; else case(display_state) 1'b0: pwm <= (cnt2 < cnt3)? 1'b1:1'b0; 1'b1: pwm <= (cnt2 < cnt3)? 1'b0:1'b1; default: pwm <= pwm; endcase end assign led_out = pwm; endmodule

測試程式碼:

module led_tb(
 
    );
    reg clk;
    reg rst_n;
    wire led_out;
    
    
    //generate clock
    initial begin
        clk = 0;
        forever 
            #20 clk = ~clk;
    end
    
    //initialization
    initial begin
        rst_n = 0;
        #10000
        rst_n = 1;
        
    end
    
    //instantiation
led led_inst (
   // Input Ports - Single Bit
   .clk     (clk),  
   .rst_n   (rst_n),
   // Input Ports - Busses
   // Output Ports - Single Bit
   .led_out (led_out)
   // Output Ports - Busses
   // InOut Ports - Single Bit
   // InOut Ports - Busses
);

endmodule

行為模擬時序圖:

參考連結:https://blog.csdn.net/Reborn_Lee/article/details/89971953