參考Verilog代碼
技巧分享:如何在FPGA內(nèi)實(shí)現(xiàn)按鍵消抖?
發(fā)布時(shí)間:2015-01-08 責(zé)任編輯:sherryyu
【導(dǎo)讀】在FPGA內(nèi)實(shí)現(xiàn)按鍵消抖的方法多種多樣,但是最簡單的是采用移位寄存器的方法進(jìn)行消抖。因?yàn)橐莆患拇嫫鞯姆椒ú恍枰獙?duì)時(shí)鐘進(jìn)行分頻,也不需要進(jìn)行延時(shí)等復(fù)雜操作。本文就為大家講解這種在FPGA內(nèi)實(shí)現(xiàn)按鍵消抖的方法。
抖動(dòng)的產(chǎn)生
通常的按鍵所用開關(guān)為機(jī)械彈性開關(guān),當(dāng)機(jī)械觸點(diǎn)斷開、閉合時(shí),由于機(jī)械觸點(diǎn)的彈性作用,一個(gè)按鍵開關(guān)在閉合時(shí)不會(huì)馬上穩(wěn)定地接通,在斷開時(shí)也不會(huì)一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動(dòng),為了不產(chǎn)生這種現(xiàn)象而作的措施就是按鍵消抖。
抖動(dòng)時(shí)間
抖動(dòng)時(shí)間的長短由按鍵的機(jī)械特性決定,一般為5ms~10ms。這是一個(gè)很重要的時(shí)間參數(shù),在很多場合都要用到按鍵穩(wěn)定閉合時(shí)間的長短則是由操作人員的按鍵動(dòng)作決定的,一般為零點(diǎn)幾秒至數(shù)秒。鍵抖動(dòng)會(huì)引起一次按鍵被誤讀多次。為確保FPGA對(duì)鍵的一次閉合僅作一次處理,必須去除鍵抖動(dòng)。在鍵閉合穩(wěn)定時(shí)讀取鍵的狀態(tài),并且必須判別到鍵釋放穩(wěn)定后再作處理。
圖1 按鍵抖動(dòng)
FPGA內(nèi)實(shí)現(xiàn)消抖的方法
在FPGA內(nèi)實(shí)現(xiàn)按鍵消抖的方法多種多樣,但是最簡單的是采用移位寄存器的方法進(jìn)行消抖。因?yàn)橐莆患拇嫫鞯姆椒ú恍枰獙?duì)時(shí)鐘進(jìn)行分頻,也不需要進(jìn)行延時(shí)等復(fù)雜操作,即可實(shí)現(xiàn)對(duì)按鍵邊沿的檢測。假設(shè)未按下時(shí)鍵值=1.
1、在無鍵按下時(shí),移位寄存器samp[7:0]始終采集到高電平,即samp[7:0]=8''b1111_1111;
2、當(dāng)鍵按下時(shí),samp[7:0]將采集到低電平,數(shù)據(jù)的變化方式為samp[7:0]=8''b1111_1110-->8''b1111_1100-->8''b1111_1000--> ........——>8''b0000_0000;samp[7:0]=8''b1111_1110即為按鍵下降沿。
3、當(dāng)松開按鍵時(shí),samp[7:0]將重新采集到高電平,數(shù)據(jù)變化方式為samp[7:0]=8''b0000_0001-->8''b0000_0011--> ........-->8''b1111_1111;當(dāng)samp[7:0]=8''b0111_1111時(shí),即為按鍵上升沿。
圖2 移位寄存器消抖原理圖
[page]
參考Verilog代碼
//模塊名:EdgeDetect,邊沿檢測
//button:按鍵,無鍵按下時(shí)為高電平//clk:10M時(shí)鐘
//rst:復(fù)位按鈕,低電平有效
//rise:檢測到上升沿,高電平有效,寬度為1個(gè)clk
//fall:檢測到下降沿,高電平有效,寬度為1個(gè)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
//產(chǎn)生上升沿信息
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
//產(chǎn)生下降沿信息
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
特別推薦
- 增強(qiáng)視覺傳感器功能:3D圖像拼接算法幫助擴(kuò)大視場
- PNP 晶體管:特性和應(yīng)用
- 使用IO-Link收發(fā)器管理數(shù)據(jù)鏈路如何簡化微控制器選擇
- 用好 DMA控制器這兩種模式 MCU效率大大提高!
- 深入分析帶耦合電感多相降壓轉(zhuǎn)換器的電壓紋波問題
- Honda(本田)與瑞薩簽署協(xié)議,共同開發(fā)用于軟件定義汽車的高性能SoC
- 第13講:超小型全SiC DIPIPM
技術(shù)文章更多>>
- 解決模擬輸入IEC系統(tǒng)保護(hù)問題
- 當(dāng)過壓持續(xù)較長時(shí)間時(shí),使用開關(guān)浪涌抑制器
- 用于狀態(tài)監(jiān)測的振動(dòng)傳感器
- 解鎖多行業(yè)解決方案——AHTE 2025觀眾預(yù)登記開啟!
- 汽車智造全“新”體驗(yàn)——AMTS 2025觀眾預(yù)登記開啟!
技術(shù)白皮書下載更多>>
- 車規(guī)與基于V2X的車輛協(xié)同主動(dòng)避撞技術(shù)展望
- 數(shù)字隔離助力新能源汽車安全隔離的新挑戰(zhàn)
- 汽車模塊拋負(fù)載的解決方案
- 車用連接器的安全創(chuàng)新應(yīng)用
- Melexis Actuators Business Unit
- Position / Current Sensors - Triaxis Hall
熱門搜索
精密電阻
精密工具
景佑能源
聚合物電容
君耀電子
開發(fā)工具
開關(guān)
開關(guān)電源
開關(guān)電源電路
開關(guān)二極管
開關(guān)三極管
科通
可變電容
可調(diào)電感
可控硅
空心線圈
控制變壓器
控制模塊
藍(lán)牙
藍(lán)牙4.0
藍(lán)牙模塊
浪涌保護(hù)器
雷度電子
鋰電池
利爾達(dá)
連接器
流量單位
漏電保護(hù)器
濾波電感
濾波器