1. 項目介紹
在FPGA上最簡單的應用就是點亮一盞閃爍的LED。學過軟件的朋友一般都寫過“Hello world”,因為這個是最簡單的程序。
2. 設計要求
LED燈以2s的周期閃爍,LED燈亮、滅,每1s取反一次,如此循環,不斷取反。從而實現LED燈的不斷閃爍。
3. 設計分析
從外部晶振(50M)時鍾輸入,利用計數器去計數1s,然后每隔1s改變一下LED輸出引腳的電平狀態。 因為開發板晶振為50M,所以一個時鍾周期為20ns(1/50MHz),因此計數器cnt通過對50MHz系統時鍾計數,計時到1s,需要累加1s/20ns=5000_0000次。

4.具體設計
4.1 硬件連接示意圖

4.2 架構設計

5. 設計實現
1 module led_flash( 2 input wire clk, 3 input wire rst_n, 4 5 output reg [3:0] led 6 ); 7 8 parameter T_1S = 26'd50_000_000; 9 10 reg [25:0] cnt; 11 12 always@(posedge clk or negedge rst_n)begin 13 if(rst_n == 1'b0) 14 cnt <= 26'd0; 15 else 16 if(cnt < T_1S - 1'b1) 17 cnt <= cnt + 1'b1; 18 else 19 cnt <= 26'd0; 20 end 21 22 always@(posedge clk or negedge rst_n)begin 23 if(rst_n == 1'b0) 24 led <= 4'b0000; 25 else 26 if(cnt == T_1S - 1'b1) 27 led <= ~led; 28 else 29 led <= led; 30 end 31 32 endmodule
6. 仿真驗證
1 `timescale 1ns/1ps 2 3 module led_flash_tb(); 4 5 reg clk; 6 reg rst_n; 7 8 wire [3:0] led; 9 10 defparam led_flash_inst.T_1S = 7'd100; 11 12 led_flash led_flash_inst ( 13 .clk (clk), 14 .rst_n (rst_n), 15 16 .led (led) 17 ); 18 19 initial begin 20 while(2)begin 21 clk = 1'b0; #10; 22 clk = 1'b1; #10; 23 end 24 end 25 26 initial begin 27 rst_n = 1'b0; 28 #21; 29 rst_n = 1'b1; 30 #(2000*10); //必須加括號, 31 $stop; 32 end 33 34 endmodule

7 參考資料
