呼吸燈
控制乙個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...