技巧分享:如何在FPGA內實現按鍵消抖?
發布時間:2015-01-08 責任編輯:sherryyu
【導讀】在FPGA內實現按鍵消抖的方法多種多樣,但是最簡單的是采用移位寄存器的方法進行消抖。因為移位寄存器的方法不需要對時鍾進行分頻,也不需要進行延時等複雜操作。本文就為大家講解這種在FPGA內實現按鍵消抖的方法。
抖動的產生
通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、biheshi,youyujixiechudiandedanxingzuoyong,yigeanjiankaiguanzaibiheshibuhuimashangwendingdijietong,zaiduankaishiyebuhuiyixiaziduankai。yinerzaibihejiduankaideshunjianjunbansuiyouyilianchuandedoudong,weilebuchanshengzhezhongxianxiangerzuodecuoshijiushianjianxiaodou。
抖動時間
抖動時間的長短由按鍵的機械特性決定,一般為5ms~10ms。這zhe是shi一yi個ge很hen重zhong要yao的de時shi間jian參can數shu,在zai很hen多duo場chang合he都dou要yao用yong到dao按an鍵jian穩wen定ding閉bi合he時shi間jian的de長chang短duan則ze是shi由you操cao作zuo人ren員yuan的de按an鍵jian動dong作zuo決jue定ding的de,一yi般ban為wei零ling點dian幾ji秒miao至zhi數shu秒miao。鍵jian抖dou動dong會hui引yin起qi一yi次ci按an鍵jian被bei誤wu讀du多duo次ci。為wei確que保baoFPGA對鍵的一次閉合僅作一次處理,必須去除鍵抖動。在鍵閉合穩定時讀取鍵的狀態,並且必須判別到鍵釋放穩定後再作處理。

圖1 按鍵抖動
FPGA內實現消抖的方法
在FPGA內nei實shi現xian按an鍵jian消xiao抖dou的de方fang法fa多duo種zhong多duo樣yang,但dan是shi最zui簡jian單dan的de是shi采cai用yong移yi位wei寄ji存cun器qi的de方fang法fa進jin行xing消xiao抖dou。因yin為wei移yi位wei寄ji存cun器qi的de方fang法fa不bu需xu要yao對dui時shi鍾zhong進jin行xing分fen頻pin,也ye不bu需xu要yao進jin行xing延yan時shi等deng複fu雜za操cao作zuo,即ji可ke實shi現xian對dui按an鍵jian邊bian沿yan的de檢jian測ce。假jia設she未wei按an下xia時shi鍵jian值zhi=1.
1、在無鍵按下時,移位寄存器samp[7:0]始終采集到高電平,即samp[7:0]=8''b1111_1111;
2、當鍵按下時,samp[7:0]將采集到低電平,數據的變化方式為samp[7:0]=8''b1111_1110-->8''b1111_1100-->8''b1111_1000--> ........——>8''b0000_0000;samp[7:0]=8''b1111_1110即為按鍵下降沿。
3、當鬆開按鍵時,samp[7:0]將重新采集到高電平,數據變化方式為samp[7:0]=8''b0000_0001-->8''b0000_0011--> ........-->8''b1111_1111;當samp[7:0]=8''b0111_1111時,即為按鍵上升沿。

圖2 移位寄存器消抖原理圖
[page]
參考Verilog代碼
//模塊名:EdgeDetect,邊沿檢測
//button:按鍵,無鍵按下時為高電平//clk:10M時鍾
//rst:複位按鈕,低電平有效
//rise:檢測到上升沿,高電平有效,寬度為1個clk
//fall:檢測到下降沿,高電平有效,寬度為1個clk
module EdgeDetect(
input clk,
input rst,
input button,
output reg rise,
output reg fall
);
reg[7:0] samp;//移位寄存器采集button鍵值
//移位寄存器采集button信息
always@(posedge clk or negedge rst)
begin
if(!rst)
samp<=8''b1111_1111;
else
samp<={samp[7:1],button};
end
//產生上升沿信息
always@(posedge clk or negedge rst)
begin
if(!rst)
rise<=1''b0;
else if(samp==8''b1111_1110)
rise<=1''b1;
else
rise<=1''b0;
end
//產生下降沿信息
always@(posedge clk or negedge rst)
begin
if(!rst)
fall<=1''b0;
else if(samp==8''b0111_1111)
fall<=1''b1;
else
fall<=1''b0;
end
endmodule
特別推薦
- 噪聲中提取真值!瑞盟科技推出MSA2240電流檢測芯片賦能多元高端測量場景
- 10MHz高頻運行!氮矽科技發布集成驅動GaN芯片,助力電源能效再攀新高
- 失真度僅0.002%!力芯微推出超低內阻、超低失真4PST模擬開關
- 一“芯”雙電!聖邦微電子發布雙輸出電源芯片,簡化AFE與音頻設計
- 一機適配萬端:金升陽推出1200W可編程電源,賦能高端裝備製造
技術文章更多>>
- 築基AI4S:摩爾線程全功能GPU加速中國生命科學自主生態
- 一秒檢測,成本降至萬分之一,光引科技把幾十萬的台式光譜儀“搬”到了手腕上
- AI服務器電源機櫃Power Rack HVDC MW級測試方案
- 突破工藝邊界,奎芯科技LPDDR5X IP矽驗證通過,速率達9600Mbps
- 通過直接、準確、自動測量超低範圍的氯殘留來推動反滲透膜保護
技術白皮書下載更多>>
- 車規與基於V2X的車輛協同主動避撞技術展望
- 數字隔離助力新能源汽車安全隔離的新挑戰
- 汽車模塊拋負載的解決方案
- 車用連接器的安全創新應用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索




