FPGA按键防抖
文章目錄
- basys3按鍵電路
- 按鍵消抖
- 軟件消抖原理
- 軟件消抖代碼
- 仿真結果
basys3按鍵電路
按鍵消抖
按鍵消抖通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動,為了不產生這種現象而作的措施就是按鍵消抖。在處理按鍵抖動的程序中,必須同時考慮消除閉合和斷開兩種情況下的抖動。所以,對于按鍵消抖的處理,必須按最差的情況來考慮。機械式按鍵的抖動次數、抖動時間、抖動波形都是隨機的。不同類型的按鍵其最長抖動時間也有差別,抖動時間的長短和按鍵的機械特性有關,按鍵輸出的信號的跳變時間(上升沿和下降沿)最大是在20ms左右。在代碼中,設置的也是20ms抖動時間。也即在20ms后才判斷為跳變時間點。----百度百科
軟件消抖原理
一句話只有持續時間夠長的按鍵信號才有效
軟件消抖代碼
/*******按鍵消抖*******/ module key_vibration(input Clk,input rst_n,input [3:0] key,output reg [3:0] key_en);parameter DURATION = 500000; //延時10ms reg [19:0] cnt; //按下計數器reg [19:0] cnto;//未按計數器wire ken_enable;assign ken_enable = (key[3] | key[2] | key[1] | key[0]); //任意按鍵被按下assign key_float = ~(key[3] & key[2] & key[1] & key[0]);//按鍵沒被按下always @(posedge Clk or posedge rst_n)beginif(rst_n)beginkey_en <= 4'b0;cnt <= 20'd0;cnto <= 20'd0;endelse if(ken_enable) begin//計數開始cnto <= 20'd0;//抬起計數器清零if(cnt == DURATION-1)begin cnt <= cnt;if (key[3] | key[2] | key[1] | key[0]) beginkey_en<=key;cnt<=20'd0;endendelse cnt <= cnt + 1'b1;endelse if(key_float) begin//計數開始cnt <= 20'd0;//按下計數器清零if(cnto == DURATION-1)begincnto <= cnto;if(~(key[3] & key[2] & key[1] & key[0]))begin key_en <= key;cnto<=20'd0;endendelse cnto <= cnto + 1'b1;endelsebegincnt <= 20'd0;cnto <= 20'd0;endend endmodule仿真結果
總結
- 上一篇: 管理故事216之022-好团队应是学习型
- 下一篇: “数智创新 芯存未来”西部数据持续创新,