FPGA 按鍵消抖

2021-09-01 06:34:00 字數 1922 閱讀 4733

今天簡單的說說按鍵消抖,原理特別好理解,其實就是延時,做一定時間的延時後取值一次,就能夠得到特定的消抖後的狀態了。

為什麼要消抖? 見圖:

我們可以看到,但按鍵按下的那一刻,存在一段時間的抖動,同時在釋放按鍵的一段時間裡也是存在抖動的,這就可能導致狀態在識別的時候可能檢測為多次的按鍵,因為執行過程中普通的檢測一次狀態key為1就執行一次按鍵操作。所以我們在使用按鍵時往往需要消抖。

消抖方式有很多種,這裡我提供一種相對而言比較簡單容易理解的方式,通過延時來消抖。

我們知道,抖動時間的長短由按鍵的機械特性決定,一般為5ms~10ms.

大家看原理圖,其實我們要做的就是,但按鍵按下去後,只在中間穩定的某乙個時刻(10ms)取乙個真正按鍵的使能值就好了,詳細的見**:

(鑑於板子一般有四個按鍵,這裡的**是對四個按鍵消抖的)

/*******按鍵消抖*******/

module key_vibration(

input mclk,

input rst_n,

input [3:0] key,

output reg [3:0] key_en

); parameter duration = 50_000; //延時10ms

reg [15:0] cnt;

wire ken_enable;

assign ken_enable = key[3] | key[2] | key[1] | key[0]; //只要任意按鍵被按下,相應的按鍵進行消抖

always @(posedge mclk or negedge rst_n)

begin

if(!rst_n)

cnt <= 11'd0;

else if(ken_enable == 1) begin

if(cnt == duration)

cnt <= cnt;

else

cnt <= cnt + 1'b1;

endelse

cnt <= 16'b0;

endalways @(posedge mclk or negedge rst_n)

begin

if(!rst_n) key_en <= 4'd0;

else if(key[0]) key_en[0] <= (cnt == duration-1'b1) ? 1'b1 : 1'b0;

else if(key[1]) key_en[1] <= (cnt == duration-1'b1) ? 1'b1 : 1'b0;

else if(key[2]) key_en[2] <= (cnt == duration-1'b1) ? 1'b1 : 1'b0;

else if(key[3]) key_en[3] <= (cnt == duration-1'b1) ? 1'b1 : 1'b0;

else key_en <= key_en;

endendmodule

其實在寫這個模組的時候,我採用了兩種方式,對比了一下所占用的資源,這個相對而言跟節省資源些。

這是我上述**說占用的資源:

為什麼要比較呢,是因為我最近寫乙個模組時資源超了,真的就超了。。。

所以提醒大家學習入門初級階段,就該由意識的節省資源,多用心,就有不一樣的收穫。

ps:我開始開心一些了,所以你也要一直保持好心情。

FPGA按鍵消抖

fpga按鍵消抖key s0 判斷按鍵是否按下,如果是,轉移到狀態 key s1 key s1 10ms 後再次判斷按鍵是否按下,如果是,轉移狀態到 key s2,否則繼續回到 key s0 key s2 判斷按鍵是否抬起,如果是,轉移狀態到 key s3 key s1 10ms 後再次判斷按鍵是否...

FPGA之按鍵消抖

按鍵是一種常用的人機互動輸入介面,對於機械按鍵來說,在按下或彈起的時候,按鍵輸入值往往伴隨著輸入抖動。消除抖動的方式有很多種,以下是用fpga實現按鍵消抖。實現原理 當檢測到按鍵按下 一般按下為低電平 時開始計時 用計數器實現 大概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 暫存器定...