FPGA Verilog按鍵消抖

2021-08-13 14:38:43 字數 1996 閱讀 5825

硬體:鋯石a4開發板,altera ep4ce10f17c8

語言:verilog hdl

原理:  機械式按鍵大概有20ms的抖動,所以檢測到按鍵變化後等20ms再判斷一次,如果鍵值相同才視為有效;

頂級模組按鍵切換led顯示

module key(led,key,clock,reset);

input clock,reset;

input [7:0] key;

output [7:0] led;

wire [7:0] keyval;//消除抖動後的按鍵值

reg [7:0] led; //控制顯示的暫存器

reg [7:0] led_next;

//消抖

keydebounced kd1(.keyval(keyval),.key(key),.clock(clock),.reset(reset));

//時序電路

always @(posedge clock,negedge reset)

begin

if(!reset)

led <= 8'h0;

else

led <= led_next;

end//組合電路 給顯示暫存器leds賦值

always @(keyval)

led_next = led ^ keyval;

endmodule

按鍵消抖模組

module keydebounced(keyval,key,clock,reset);

parameter keycnt = 8;//預設8個按鍵

parameter time = 20'd999_999;//50mhz 0.02us 20ms 10^6-1

input clock,reset;

input [7:0] key;

output [7:0] keyval;//輸出穩定的鍵值

reg [19:0] time_cnt;

reg [19:0] time_cnt_next;

reg [keycnt-1:0] key_reg;

reg [keycnt-1:0] key_reg_next;

//時序電路 給定時器賦值

always @(posedge clock,negedge reset)

begin

if(!reset)

time_cnt <= 20'h0;

else

time_cnt <= time_cnt_next;

end//組合電路 實現定時器

always @(*)

begin

if(time_cnt == time)

time_cnt_next = 20'h0;

else

time_cnt_next =time_cnt + 20'h1;

end//時序電路 給按鍵暫存器賦值

always @(posedge clock,negedge reset)

begin

if(!reset)

key_reg <= 8'h0;

else

key_reg <= key_reg_next;

end//組合電路 每隔乙個定時器週期接受依次按鍵的值

always @(*)

begin

if(time_cnt == time)

key_reg_next = key;

else

key_reg_next <= key_reg;

endassign keyval = key_reg & (~key_reg_next);

endmodule

FPGA 按鍵消抖

今天簡單的說說按鍵消抖,原理特別好理解,其實就是延時,做一定時間的延時後取值一次,就能夠得到特定的消抖後的狀態了。為什麼要消抖?見圖 我們可以看到,但按鍵按下的那一刻,存在一段時間的抖動,同時在釋放按鍵的一段時間裡也是存在抖動的,這就可能導致狀態在識別的時候可能檢測為多次的按鍵,因為執行過程中普通的...

按鍵消抖 有感

假設按鍵一般在20ms之內可以穩定,但是極端情況,抖動時間在50ms wire nedge 下降沿。按鍵按下 wire pedge 上公升沿,按鍵按回 assign nedge key a key b assign pedge key a key b 狀態分為 空 若檢測到下降沿則跳到按下狀態 按下...

按鍵消抖詳解

一 按鍵消抖原理 抖動時間的長短由按鍵的機械特性決定,一般為 5ms 10ms,鍵抖動會引起一次按鍵被誤讀多次。解決辦法 判斷按鍵按下時,延時 10 ms 即可。二 軟體實現按鍵消抖 1 首先定義乙個記錄按鍵狀態的變數 release 2 然後讀取按鍵值檢測按鍵狀態,當按鍵狀態改變,判斷可能有按鍵動...