代碼如下:
程序分析:
去抖
去抖可分位硬件去抖和軟件去抖,顧名思義硬件去抖就是通過硬件來達(dá)到去抖的目的,一般是用施密特觸發(fā)器來實(shí)現(xiàn),需要消耗硬件資源,在一些成本限制的時候,往往采用軟件去抖。
軟件去抖原理:一般按鍵的抖動頻率是幾十khz(故狀態(tài)轉(zhuǎn)移間隔為ms級,程序中我們采用20ms)整體思路是跳過這一段抖動,我們設(shè)計的去抖狀態(tài)機(jī)如下:
假如按鍵按下時為低電平,idle為初始狀態(tài),當(dāng)檢測到有按鍵按下時即key_pre==0,進(jìn)入delay1狀態(tài)(注意:狀態(tài)從idle到delay1需要20ms,相等于跳過抖動),若此時key_pre仍為0,則我們認(rèn)為是按鍵按下,則進(jìn)入下一狀態(tài),否則回到idle認(rèn)為時抖動,到此為按下去抖。在press狀態(tài)下,若檢測到按鍵抬起即key_pre==1,則進(jìn)入delay2狀態(tài),否則仍在press狀態(tài)(防止有長時間按下),在delay2狀態(tài),若key_pre仍為1,則認(rèn)為按鍵以抬起,則進(jìn)入下一狀態(tài)taiqi,至此完成抬起去抖,可以產(chǎn)生去抖后的信號。
程序關(guān)鍵點(diǎn):
第一:delay信號的產(chǎn)生
delay信號的高電平時間,只是一個主時鐘的寬度,所以當(dāng)delay==1時,狀態(tài)轉(zhuǎn)移alw塊只會觸發(fā)一次,而不是多次。
第二:去抖后信號key_out的產(chǎn)生(輸出高電平表示按下)。
程序中我們采用
assign key_out=(state==taiqi && delay==1)?1'b1:1'b0;
有人認(rèn)為當(dāng)狀態(tài)到taiqi是直接就可輸出,為什么還要有delay==1這個條件呢?我們先看一下這兩種仿真結(jié)果:
加上delay==1
??
從圖中我們可以明顯看出,未加delay==1,key_out為1有很寬的脈寬,在以clk_50M為敏感信號是,會造成多次觸發(fā),而加上delay==1,key_out的寬度只為一個clk_50M主時鐘寬度,達(dá)到去抖效果。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21803瀏覽量
606464
發(fā)布評論請先 登錄
相關(guān)推薦
fpga教程之——按鍵消抖
【FPGA設(shè)計實(shí)例】用FPGA實(shí)現(xiàn)開關(guān)按鍵去抖
FPGA完整教程基礎(chǔ)版和高級版(免費(fèi))
【黑金原創(chuàng)教程連載】FPGA那些事兒-驅(qū)動篇I,每周更新
fpga按鍵去抖
深入剖析FPGA去抖
FPGA學(xué)習(xí)與開發(fā)板的那些事
STM32單片機(jī)按鍵消抖和FPGA按鍵消抖的相關(guān)資料分享
基于FPGA的按鍵消抖電路設(shè)計
你一定想知道FPGA的那些事...
使用FPGA進(jìn)行消抖的典型例子
![使用<b class='flag-5'>FPGA</b>進(jìn)行消<b class='flag-5'>抖</b>的典型例子](https://file.elecfans.com/web1/M00/91/B2/pIYBAFzTka6AVRoOAAKM1WFJXHo402.png)
評論