lesson 2 獨立按鍵控制led燈
實現效果:無按鍵按下時, LED燈全滅;按鍵1按下時, LED燈顯示自右向左的流水效果;按鍵2按下時, LED燈顯示自左向右的流水效果;按鍵3按下時,四個LED燈同時閃爍;
按鍵4按下時, LED燈全亮。
設計過程
計數器設計:led在閃爍效果和流水效果實現需要時間間隔至少0.1s,在此我們設置為0.2s,因此需要設計一個0.2s的計數器,每隔0.2s計數器加一。
-
module key_led( input sys_clk, input rst_n, output reg [3:0] key, output reg [3:0] led ); reg [23:0] cnt; reg [1:0] led_control; //系統時鍾,計數器計數,計時0.2s always@(posedge sys_clk or negedge rst_n) begin if(!rst_n) cnt <= 0; else if(cnt < 24'd9_999_999)//計數滿0.2S。此處與上個流水燈實驗不同,上個流水燈實驗計數為10_000_000,實際上多計數了一個周期,此處剛好1000_0000個周期 cnt <= cnt + 1'b1; else cnt <= 24'd0; end //led狀態選擇 always@(posedge sys_clk or negedge rst_n) begin if(!rst_n) led_control <= 0; else if(cnt == 24'd9_999_999) led_control <= led_control + 1'b1; else led_control <= led_control; end //檢測按鍵 always@(posedge sys_clk or negedge rst_n) begin if(!rst_n) led <= 4'b0000; //led全滅 else if(key[0]==0) begin case(led_control) 2'b00:led <= 4'b1000; 2'b01:led <= 4'b0100; 2'b10:led <= 4'b0010; 2'b11:led <= 4'b0001; default:led <= 4'b0000; end else if(key[1]==0) begin case(led_control) 2'b00:led <= 4'b0001; 2'b01:led <= 4'b0010; 2'b10:led <= 4'b0100; 2'b11:led <= 4'b1000; default:led <= 4'b0000; end else if(key[2]==0) begin case(led_control) 2'b00:led <= 4'b1111; 2'b01:led <= 4'b0000; 2'b10:led <= 4'b1111; 2'b11:led <= 4'b0000; default:led <= 4'b0000; end else if(key[3]==0) led <= 4'b1111; else led <= 4'b0000; end endmodule
案列來源:新起點開發板資料