設計思路:
設計程式碼:
RTL:
module led_flash( clk,rst_n,led ); input clk,rst_n; output reg led=0; parameter max=24999999; //(計數的最大值) reg [24:0] cnt=0; always@(posedge clk or negedge rst_n) if(!rst_n) cnt <= 0; else if (cnt == max) cnt <= 0; else cnt <= cnt+1; //燈的閃爍 always@(posedge clk or negedge rst_n) if(!rst_n) led <= 0; else if (cnt == max) led <= ~led; else led <= led; endmodule
tb:
`timescale 1ns / 1ps module led_flash_tb(); reg clk,rst_n; wire led; led_flash u_led_flash( .clk(clk), .rst_n(rst_n), .led(led) ); initial clk = 1; always #10 clk = ~clk; //每10ns翻轉一次,因此clk週期為20ns initial begin rst_n = 0; #200; rst_n = 1; #3000000000; $stop; end endmodule
模擬波形:
在上面我設定的是3s結束,但是模擬時間太長了,也就沒有繼續,看到led翻轉就暫停了。
在波形的邊緣處右鍵,選擇Mark,可以打一個標記,點一下標記底下就會出現刻度尺。
可以看到,led的半個週期為500ms,滿足我們的設計要求。
電路結構圖:
上班驗證:
這裡發現什麼都看不到,點一下上面這個group按鈕就好了
上板後發現led以1s頻率閃爍,如果按住按鈕0的話led將不閃爍(復位),本實驗設計得到成功驗證。