基於Verilog實現呼吸燈

2021-09-10 06:07:43 字數 3464 閱讀 4866

首先掌握秒的單位換算,這裡總結一些。因為筆者目前用的大多為50mhz,所以介紹以此為例。但關於秒的轉換全世界都是一樣的。

1mhz = 1,000khz = 1,000,000hz

頻率:是用單位時間內完成的週期性變化的次數,是描述週期運動頻繁程度的量。

因此結合以上內容,50mhz,就是說,(兩個相鄰時鐘上公升沿算乙個週期)1s內有50,000,000hz個時鐘上公升沿。所以乙個週期有多久就可以計算出來了1/50,000,000 = 0.000,000,02s

而常見的時間單位換算

1s = 1,000ms毫秒

1s = 1,000ms = 1,000,000us 微秒      1ms = 1,000us

1s = 1,000ms = 1,000,000us = 1,000,000,000ns 納秒   1us = 1,000ns

下面還有皮秒和飛秒。進製都是1,000

所以可得,50mhz時鐘頻率下的乙個週期是20ns!!!

原理就我理解,總的來說,就是先分頻,再控制占空比。通過控制led的亮燈時間來實現呼吸功能。

功能就是讓led燈2s為從暗到亮,下乙個2s從亮到暗。

具體實現為將2s分為1000份。在這1000份裡邊,依次增加亮燈的時間。2s的1000份就是2ms

所以將2ms再分為1000份,就是2us。第乙個2ms,亮led2us 第二個2ms,亮led4us......

然後依次增加。

由於分的太細,,可能看的不是很清楚。

module pwm_led(

clk,rst_n,pwm_led

);input clk;

input rst_n;

output pwm_led;

//兩秒計時器

reg time_2s;

reg [27:0] cnt_2s;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

cnt_2s <= 28'd0;

time_2s <= 1'b0;

endelse

if(cnt_2s == 28'd50_000_000 - 1'b1)

begin

cnt_2s <= 28'd0;

time_2s <= 1'b1;

endelse

begin

cnt_2s <= cnt_2s + 1'b1;

time_2s <= 1'b0;

endend//2ms計時器

reg time_2ms;

reg [16:0] cnt_2ms;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

cnt_2ms <= 17'd0;

time_2ms <= 1'b0;

endelse

if(cnt_2ms == 17'd100_000 - 1'b1)

begin

cnt_2ms <= 17'd0;

time_2ms <= 1'b1;

endelse

begin

cnt_2ms <= cnt_2ms + 1'b1;

time_2ms <= 1'b0;

endend//計數是第幾個2ms

reg [9:0] number_2ms;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

number_2ms <= 10'd0;

else

if( number_2ms == 10'd999 )

number_2ms <= 10'd0;

else

if(time_2ms)

number_2ms <= number_2ms + 1'b1;

else

number_2ms <= number_2ms;

end//2us計時器

reg time_2us;

reg [6:0] cnt_2us;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

begin

cnt_2us <= 7'd0;

time_2us <= 1'b0;

endelse

if(cnt_2us == 7'd100 - 1'b1)

begin

cnt_2us <= 7'd0;

time_2us <= 1'b1;

endelse

begin

cnt_2us <= cnt_2us + 1'b1;

time_2us <= 1'b0;

endend//計數2us,數是第幾個2us

reg [9:0] number_2us;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

number_2us <= 10'd0;

else

if(number_2us == 10'd999 )

number_2us <= 10'd0;

else

if(time_2us)

number_2us <= number_2us + 1'b1;

else

number_2us <= number_2us;

endwire led_flag0;//暗到亮

wire led_flag1;//亮到暗

assign led_flag0 = (number_2us < number_2ms) ? 1 : 0;

assign led_flag1 = (number_2us < number_2ms) ? 0 : 1;

reg led_flag;

always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

led_flag <= 1'b1;

else

if(time_2s)

led_flag <= ~led_flag;

else

led_flag <= led_flag;

endassign pwm_led = (led_flag) ? led_flag0 : led_flag1;

endmodule

**經驗證可以實現功能,還是很好玩的。

用verilog實現 簡單的呼吸燈

呼吸燈 控制乙個led燈在1s內從滅慢慢到亮,下一秒內從亮慢慢到滅。迴圈往復。led的亮度可以由點亮時間與熄滅時間長度來控制。乙個毫秒裡,亮0us,滅1000us,下一毫秒亮1us滅999us,下一下毫秒裡,亮2us滅998us,在下一毫秒裡,亮3us滅997us,依次進行下去,直到1000us亮,...

5 verilog語言編寫呼吸燈

1 本節目錄 2 fpga簡介 3 verilog簡介 4 verilog語言編寫呼吸燈 5 本節結束。fpga field programmable gate array 是在pal gal等可程式設計器件的基礎上進一步發展的產物。它是作為專用積體電路 asic 領域中的一種半定製電路而出現的,既...

verilog PWM實現呼吸燈

使用pwm技術實現呼吸燈。利用占空比每1ms遞增1us的占空比來點亮led。沒隔1s實現燈由逐漸變亮到逐漸變暗,或者逐漸變暗到逐漸變數的轉換。使用的語言是verilog。module led breath parameter led width 4 input clk,global clock in...