用verilog實現 簡單的呼吸燈

2021-10-11 02:27:17 字數 1703 閱讀 5990

呼吸燈

控制乙個led燈在1s內從滅慢慢到亮,下一秒內從亮慢慢到滅。迴圈往復。

led的亮度可以由點亮時間與熄滅時間長度來控制。乙個毫秒裡,亮0us,滅1000us,下一毫秒亮1us滅999us,下一下毫秒裡,亮2us滅998us,在下一毫秒裡,亮3us滅997us,依次進行下去,直到1000us亮,0us滅。

思路分析

1、不管led燈的亮滅都是1ms,這樣我們可以直接定義時間t=50_000(1ms);

2、1ms=1000us,50m時鐘的的1us=50個時鐘週期;

3、每增加1ms,同時也新增1us;

4、亮1ms後狀態切換

module      breath_led (

input wire clk,

input wire rst,

output reg [7:0] led

);reg [1:0] cstate;

localparam s0=0;

localparam s1=1;

reg [15:0] i; //亮燈時間

reg [15:0] cnt; //計時器

localparam t=50_000; //1ms

always@(posedge clk or posedge rst) begin

if(rst) begin

cnt<=0;

led<=8'b0000_0000;

cstate<=0;

endelse

case(cstate)

s0 : begin

if(i==t && cnt==t-1) begin

cstate<=s1;

cnt<=0;

endelse if(cnt==t-1) begin

i<=i+50;

cnt<=0;

endelse begin

cstate<=s0;

cnt<=cnt+1;

endif(cntled<=8'b1111_1111;

else

led<=8'b0000_0000;

ends1 : begin

if(i==0 && cnt==t-1) begin

cstate<=s0;

cnt<=0;

endelse if(cnt==t-1) begin

i<=i-50;

cnt<=0;

endelse begin

cstate<=s1;

cnt<=cnt+1;

endif(cntled<=8'b1111_1111;

else

led<=8'b0000_0000;

enddefault : led<=8'b0000_0000;

endcase

endendmodule

基於Verilog實現呼吸燈

首先掌握秒的單位換算,這裡總結一些。因為筆者目前用的大多為50mhz,所以介紹以此為例。但關於秒的轉換全世界都是一樣的。1mhz 1,000khz 1,000,000hz 頻率 是用單位時間內完成的週期性變化的次數,是描述週期運動頻繁程度的量。因此結合以上內容,50mhz,就是說,兩個相鄰時鐘上公升...

verilog簡單實現串列埠

uart 2017.10.7 傳送接收到的資料 波特率9600 乙個停止位 無奇偶校驗 de2板子 rx gpio k25 0 left tx tx gpio k26 1 right rx gnd 右邊第6 或者倒數第6 復位不成功 復位按鍵有問題 靠右按即可復位 特別注意 如果乙個條件中同時給乙個...

用verilog實現的串列埠通訊模組

串列埠功能 1 8個資料位 1個停止為 無校驗位 2 空閒時資料線為高電平,從高電平跳向低電平表示啟動訊號 3 波特率可以通過parameter引數實現可調 有兩個檔案 uart.v 串列埠模組 module uart 全域性時鐘復位訊號 iclk,irst n,序列資料線 irx,序列接收 otx...