實驗現象:
按鍵每按下一次,三色LED改變一次狀態。
核心程式碼:
//--------------------module_rst_n---------------------------// module state_ctrl( input clk_25m, input rst_n, input key, output fpga_ledr, output fpga_ledg, output fpga_ledb ); //--------------------key_in--------------------------------// parameter ms_10 = 250000; reg key_r; reg [17:0]low_cnt; reg [17:0]hig_cnt; always @(posedge clk_25m or negedge rst_n) //按鍵消抖動,提取按鍵狀態 if (!rst_n) begin key_r <= 1'd0; low_cnt <= 18'd0; hig_cnt <= 18'd0; end else if(key) //檢測按鍵狀態為高時,延時10ms,把按鍵狀態提取出來。 begin low_cnt <= 18'd0; if (hig_cnt == ms_10) begin key_r <= key; hig_cnt <= hig_cnt; end else hig_cnt <= hig_cnt + 1'd1; end else //按鍵狀態為低時,延時10ms,把按鍵狀態提取出來。 begin hig_cnt <= 18'd0; if (low_cnt == ms_10) begin key_r <= key; low_cnt <= low_cnt; end else low_cnt <= low_cnt + 1'd1; end wire key_state = key_r; //--------------------led_ctrl-----------------------------// reg [1:0]led_cnt; reg ledr,ledg,ledb; always@(negedge key_state or negedge rst_n) //按鍵下降沿控制led狀態切換 if (!rst_n) begin led_cnt <= 2'd0; end else if (led_cnt == 2'd2) begin led_cnt <= 2'd0; end else led_cnt <= led_cnt + 1'd1; always@(posedge clk_25m or negedge rst_n) //led狀態切換的狀態機 if (!rst_n) begin ledr <= 1'd1; ledg <= 1'd1; ledb <= 1'd1; end else case(led_cnt) 2'd0: //紅燈亮 begin ledr <= 1'd0; ledg <= 1'd1; ledb <= 1'd1; end 2'd1: //綠燈亮 begin ledr <= 1'd1; ledg <= 1'd0; ledb <= 1'd1; end 2'd2: //藍燈亮 begin ledr <= 1'd1; ledg <= 1'd1; ledb <= 1'd0; end default: //都不亮 begin ledr <= 1'd1; ledg <= 1'd1; ledb <= 1'd1; end endcase assign {fpga_ledr,fpga_ledg,fpga_ledb} = {ledr,ledg,ledb}; //--------------------endmodule-----------------------------// endmodule
原始碼下載連結:
連結:http://pan.baidu.com/s/1nvMFgxF 密碼:b895
iCore4連結: