非同于MCU的獨立按鍵消抖動
reg key_flag_r;
reg [KEY_WIDTH-1:0] key_data_r;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
key_flag_r = 1'b0;
key_value = {KEY_WIDTH{1'b0}};
end
else if(cnt == 20'd249999) //Delay_5ms
begin
case(state)
0:
begin
if(key_data != {KEY_WIDTH{1'b1}})
state = 1;
else
state = 0;
end
1:
begin
if(key_data != {KEY_WIDTH{1'b1}})
state = 2;
else
state = 0;
end
2:
begin
key_flag_r = 1'b1;
key_value = key_data; //lock the key_value
state = 3;
end
3:
begin
key_flag_r = 1'b0; //read the key_value
if(key_data == {KEY_WIDTH{1'b1}})
state = 4;
else
state = 3;
end
4:
begin
if(key_data == {KEY_WIDTH{1'b1}})
state = 0;
else
state = 4;
end
endcase
end
end
//---------------------------------------
//Capture the falling endge of the key_flag
reg key_flag_r0,key_flag_r1;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
key_flag_r0 = 0;
key_flag_r1 = 0;
end
else
begin
key_flag_r0 = key_flag_r;
key_flag_r1 = key_flag_r0;
end
end
assign key_flag = key_flag_r1 ~key_flag_r0;
endmodule
信號線說明如下:
clk
系統(tǒng)最高時鐘
rst_n
系統(tǒng)復(fù)位信號
Key_data
按鍵信號(可根據(jù)需要配置為n位)
Key_flag
按鍵確認(rèn)信號
Key_vaule
按鍵返回值
雷同上述MCU按鍵消抖動的狀態(tài),此模塊可以模擬成一下5個狀態(tài),見state machine:
(2)循環(huán)n次計數(shù)消抖動
同樣,此模塊也是Bingo無數(shù)次修改測試最后成型的代碼,利用了更少的資源,更適用于并行高速FPGA的性能要求。具體代碼實現(xiàn)過程請有需要的自行分析,本模塊通過相關(guān)時鐘的適配,n次計數(shù)來確認(rèn)按鍵信號,Verilog代碼如下所示:
/*************************************************
* Module Name : key_scan.v
* Engineer : Crazy Bingo
* Target Device : EP2C8Q208C8
* Tool versions : Quartus II 11.0
* Create Date : 2011-6-25
* Revision : v1.0
* Description :
**************************************************/
評論