按鍵是一種常用的人機互動輸入介面,對於機械按鍵來說,在按下或彈起的時候,按鍵輸入值往往伴隨著輸入抖動。消除抖動的方式有很多種,以下是用fpga實現按鍵消抖。實現原理:當檢測到按鍵按下(一般按下為低電平)時開始計時(用計數器實現),大概10ms後檢測按鍵狀態,如果按鍵狀態為低電平,說明按鍵按下,輸出低電平;如果按鍵狀態為高電平,說明是按鍵抖動。按鍵彈起同理。
下面對按鍵消抖的**(ax_debounce.v)進行分析:
module ax_debounce(
input clk,
input rst,
input button_in,
output reg button_posedge,
output reg button_negedge,
output reg button_out
);
ax_debounce模組定義:時鐘輸入引腳clk、復位引腳rst、按鍵輸入引腳button_in。按鍵上公升沿輸出暫存器、按鍵下降沿輸出暫存器和按鍵狀態輸出暫存器。
assign q_reset = (def1 ^ def2);
通過按鍵的兩個輸入暫存器異或來檢測按鍵輸入的電平變化。
assign q_add = ~(q_reg == timer_max_val);
通過暫存器q_reg累加後與timer_max_val進行判斷,從而確定是否到達按鍵消抖時間。
always @(q_reset, q_add, q_reg)
begin
case ()
2'b00:
q_next <= q_reg;
2'b01:
q_next <= q_reg + 1;
default:
q_next <= };
endcase
end
以上**用於時間計數,計數值儲存到q_next中。
always @(posedge clk or posedge rst)
begin
if(rst == 1'b1)
begin
def1 <= 1'b0;
def2 <= 1'b0;
q_reg <= };
endelse
begin
def1 <= button_in;
def2 <= def1;
q_reg <= q_next;
end
end
以上**用於實時記錄按鍵輸入狀態,並依次儲存到def1 和def2中。
always @(posedge clk or posedge rst)
begin
if(rst == 1'b1)
button_out <= 1'b1;
else if(q_reg == timer_max_val)
button_out <= def2;
else
button_out <= button_out;
end
以上**表示按鍵狀態變化時把def2賦給按鍵輸出暫存器。
always @(posedge clk or posedge rst)
begin
if(rst == 1'b1)
begin
button_out_d0 <= 1'b1;
button_posedge <= 1'b0;
button_negedge <= 1'b0;
endelse
begin
button_out_d0 <= button_out;
button_posedge <= ~button_out_d0&button_out;
button_negedge <= button_out_d0& ~button_out;
endend
endmodule
以上**通過button_posedge和button_negedge的值來判斷當前的按鍵狀態是按鍵按下還是彈起。 FPGA 按鍵消抖
今天簡單的說說按鍵消抖,原理特別好理解,其實就是延時,做一定時間的延時後取值一次,就能夠得到特定的消抖後的狀態了。為什麼要消抖?見圖 我們可以看到,但按鍵按下的那一刻,存在一段時間的抖動,同時在釋放按鍵的一段時間裡也是存在抖動的,這就可能導致狀態在識別的時候可能檢測為多次的按鍵,因為執行過程中普通的...
FPGA按鍵消抖
fpga按鍵消抖key s0 判斷按鍵是否按下,如果是,轉移到狀態 key s1 key s1 10ms 後再次判斷按鍵是否按下,如果是,轉移狀態到 key s2,否則繼續回到 key s0 key s2 判斷按鍵是否抬起,如果是,轉移狀態到 key s3 key s1 10ms 後再次判斷按鍵是否...
2014 3 12 FPGA學習 按鍵消抖
生性愚鈍,現在才終於明白fpga的按鍵消抖原理。先貼一段別人的 dule key debounce sys clk sys rstn key in led out 輸入輸出訊號 input sys clk input sys rstn input key in output led out 暫存器定...