1. 程式人生 > 其它 >流水燈實驗

流水燈實驗

技術標籤:Verilog學習verilog

//==================================================================================================
//  Filename      : led.v
//  Created On    : 2021-01-19 10:26:31
//  Last Modified : 2021-01-19 15:18:32
//  Revision      : 
//  Author        : 陳廣
//  Company       : Infiray
//  Email         : 
[email protected]
// // Description : LED流水燈實驗 // // // IO:LED0 --> E10;LED1 --> F9; LED2 -->C9;LED3 --> D9;CLK --> E1;RTC_NRST --> N13 // //================================================================================================== /*************************************************** LED為共陰極,高電平點亮 迴圈週期為1ms 每1/4ms點亮一個LED燈 計數器到1ms,輸出LED使能訊號 ****************************************************/ `timescale 1ns/1ns module led ( input clk, input rst_n, output reg [3:0] led_Sig ); parameter T1MS = 32'd49_999_999 ; /*************************************************** 為什麼這裡是32'd49_999_999,而不是16d'49_999_999 FPGA 的設計中通常使用計數器來計時,對於 50Mhz 的系統時鐘,一個時鐘週期是 20ns,那 麼表示一秒需要 50_000_000 個時鐘週期 (1s=1_000_000_000ns;20ns*50_000_000=1_000_000_000ns=1s), 如果一個時鐘週期計數器累加一次,那麼計數器從 0 到 49999999 正好是 50000000 個週期,就是 1 秒的時鐘 那麼可以知道 1ms=1_000_000ns=20ns*50_000即50_000個時鐘週期是1ms, 如果一個時鐘週期計數器累加一次,那麼計數器從0到49_999 正好是50_000個週期,也就是1ms 32位計數器最大可以表示4294967295;最大計時85.8993459秒 16位計數器最大可以表示65535;最大計時1310.7ms ****************************************************/ reg [31:0] timer; always @ (posedge clk or negedge rst_n) begin if(!rst_n) timer <= 32'd0; else if (timer == T1MS) timer <=32'd0; else timer <= timer + 32'd1; end parameter LED0 = 4'b0001 ; parameter LED1 = 4'b0010 ; parameter LED2 = 4'b0100 ; parameter LED3 = 4'b1000 ; parameter T1 = 32'd12_499_999 ; parameter T2 = 32'd24_999_999 ; parameter T3 = 32'd37_499_999 ; parameter T4 = 32'd49_999_999; //========================================================================\ // =========== Define Parameter and Internal signals =========== //========================================================================/ always @(posedge clk or negedge rst_n) begin if (!rst_n) led_Sig <= 4'b0000; else if (timer == T1) led_Sig <= LED0; else if (timer == T2) led_Sig <= LED1; else if (timer == T3) led_Sig <= LED2; else if (timer == T4) led_Sig <= LED3; end endmodule