硬體:鋯石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 然後讀取按鍵值檢測按鍵狀態,當按鍵狀態改變,判斷可能有按鍵動...