實現一個雙向流水燈,從右往左流動,到最左邊時,再從左邊往右流動,然后再從右邊開始流動,如此不斷反復。燈亮、間隔時間都為0.2s,本實驗共有四個LED燈,從左到右依次為LED[3]、LED[2]、LED[1]、LED[0],FPGA輸出低電平點亮。
實現思路:
1. 定義一個0.2s的計數器
2. LED[3]、LED[0]作為邊界標志位,在被點亮時 ,切換流向,即LED[3]、LED[0]為低電平時,要進行方向轉換,所以要定義一個1bit reg變量存儲標志
實驗代碼:

1 //燈亮、間隔時間都為0.2s的雙向流水燈 2 module flow_led( 3 input clk, 4 input rst_n, 5 output reg [3:0]led 6 ); 7 8 parameter SYS_FRQ = 50; //時鍾輸入頻率,50MHz 9 parameter LED_FLOW_TIME = 18'd200_000; //LED流水燈亮間隔時間,單位us,這里是0.2s 10 parameter LED_FLOW_CNT_TIME = LED_FLOW_TIME * SYS_FRQ; //LED流水燈,每個燈亮的時鍾周期數 11 12 reg [23:0] flow_cnt; //0.2s計數器 13 reg flow_flag; //流向標志,0----從右往左,1----從左往右 14 15 16 //流水燈每個燈亮時間計數器 17 always @(posedge clk or negedge rst_n) 18 if(!rst_n) 19 flow_cnt <= 24'b0; 20 else if(flow_cnt == LED_FLOW_CNT_TIME - 1'b1) 21 flow_cnt <= 24'b0; 22 else 23 flow_cnt <= flow_cnt + 1'b1; 24 25 26 //流水方向邊界,分別為四個LED燈的兩邊,即LED[0]、LED[3],在這兩個地方需要轉換標志,以改變其流向 27 always @(posedge clk or negedge rst_n) 28 if(!rst_n) 29 flow_flag <= 1'b0; 30 else if(led[0] == 1'b0) 31 flow_flag <= 1'b0; 32 else if(led[3] == 1'b0) 33 flow_flag <= 1'b1; 34 else 35 flow_flag <= flow_flag; 36 37 38 //流水效果實現 39 always @(posedge clk or negedge rst_n) 40 if(!rst_n) 41 led <= 4'b1110; //FPGA輸出低電平時,點亮LED 42 else if(flow_flag == 1'b0) //從右往左 43 begin 44 if(flow_cnt == LED_FLOW_CNT_TIME - 1'b1) 45 led <= {led[2:0], led[3]}; 46 else 47 led <= led; 48 end 49 else if(flow_flag == 1'b1) //從左往右 50 begin 51 if(flow_cnt == LED_FLOW_CNT_TIME - 1'b1) 52 led <= {led[0], led[3:1]}; 53 else 54 led <= led; 55 end 56 else 57 led <= led; 58 59 60 endmodule