代碼如下:
程序分析:
去抖
去抖可分位硬件去抖和軟件去抖,顧名思義硬件去抖就是通過硬件來達到去抖的目的,一般是用施密特觸發器來實現,需要消耗硬件資源,在一些成本限制的時候,往往采用軟件去抖。
軟件去抖原理:一般按鍵的抖動頻率是幾十khz(故狀態轉移間隔為ms級,程序中我們采用20ms)整體思路是跳過這一段抖動,我們設計的去抖狀態機如下:
假如按鍵按下時為低電平,idle為初始狀態,當檢測到有按鍵按下時即key_pre==0,進入delay1狀態(注意:狀態從idle到delay1需要20ms,相等于跳過抖動),若此時key_pre仍為0,則我們認為是按鍵按下,則進入下一狀態,否則回到idle認為時抖動,到此為按下去抖。在press狀態下,若檢測到按鍵抬起即key_pre==1,則進入delay2狀態,否則仍在press狀態(防止有長時間按下),在delay2狀態,若key_pre仍為1,則認為按鍵以抬起,則進入下一狀態taiqi,至此完成抬起去抖,可以產生去抖后的信號。
程序關鍵點:
第一:delay信號的產生
delay信號的高電平時間,只是一個主時鐘的寬度,所以當delay==1時,狀態轉移alw塊只會觸發一次,而不是多次。
第二:去抖后信號key_out的產生(輸出高電平表示按下)。
程序中我們采用
assign key_out=(state==taiqi && delay==1)?1'b1:1'b0;
有人認為當狀態到taiqi是直接就可輸出,為什么還要有delay==1這個條件呢?我們先看一下這兩種仿真結果:
加上delay==1
??
從圖中我們可以明顯看出,未加delay==1,key_out為1有很寬的脈寬,在以clk_50M為敏感信號是,會造成多次觸發,而加上delay==1,key_out的寬度只為一個clk_50M主時鐘寬度,達到去抖效果。
-
FPGA
+關注
關注
1626文章
21671瀏覽量
601899
發布評論請先 登錄
相關推薦
評論