設計背景:
在我們的工程設計中我們會或多或少的用到開關,開關分為好多種,不管是哪一種開關在按下還是抬起都會有輕微的抖動,為了使我們的設計更加準確化,今天我們將學習按鍵消抖。
設計原理:
本次的設計是一個消抖的設計,在我們用的按鍵中,按下時低電平,抬起時高地平,可是在現實中按鍵的瞬間高低電平的變化并不是我們想的那樣,而是下面的情況。
我們稱按下到s的時候稱為前抖,s到抬起后稱為后抖,在正常的情況下就是上面電平變化波形,那么我們為了消除不必要的波形,我們就應該在s區域來判斷按鍵是否按下也就是低電平,同理我們抬起的時候也要間隔一段時間后來確定按下,一般我們間隔的時間設置為 10ms ---- 20ms之間都可以,所以說消抖就是把現實中按下抬起的抖動消除,生成我們理想的高低高的波形。
設計架構圖:
?
設計狀態轉移圖?
設計代碼:
設計模塊
0modulekey_xiaodou(clk,rst_n,key,key_x);
1
2 inputclk; //輸入輸出
3 inputrst_n;
4 inputkey;
5
6 outputregkey_x;
7 //parameter T10ms = 500_000; //設計一個10ms的計數參數
8 parameterT10ms =50;
9
10 parameters0 =2'b00;//4個狀態
11 parameters1 =2'b01;
12 parameters2 =2'b10;
13 parameters3 =2'b11;
14 reg[18:0]count;
15 reg[1:0]state;
16 always@(posedgeclk ornegedgerst_n)
17 if(!rst_n)
18 begin
19 count <=19'b0;
20 state <=2'b0;
21 key_x <=1'b1;
22 end
23 else
24 begin
25 case(state)
26 s0:begin
27 if(key)//判斷是否按鍵按下
28 begin
29 count <=1'b0;
30 key_x <=1'b1;
31 end
32 else
33 begin
34 if(count <T10ms -1)//按下就計數10ms
35 begin
36 count <=count +1'b1;
37 key_x <=1'b1;
38 end
39 else
40 begin//計數到了后給輸出賦值為 0
41 key_x <=1'b0;
42 state <=s1;
43 end
44 end
45 end
46 s1:begin
47 if(~key)//判斷是否按鍵抬起
48 begin
49 count <=1'b0;
50 key_x <=1'b0;
51 end
52 else
53 begin
54 if(count <T10ms -1)//抬起就計數10ms
55 begin
56 count <=count +1'b1;
57 key_x <=1'b0;
58 end
59 else
60 begin
61 key_x <=1'b1;//計數到了后給輸 出賦值為1
62 state <=s0;
63 end
64 end
65 end
66 default:state <=0;
67 endcase
68 end
69endmodule
測試模塊
0`timescale1ns/1ps
1
2 modulexiaodou_tb();
3
4
-
FPGA
+關注
關注
1643文章
21967瀏覽量
614268
發布評論請先 登錄
一次消諧裝置與二次消諧裝置區別、一次消諧器與二次消諧器的區別

消諧裝置的作用

TVP5150輸出圖像有時抖有時無是怎么回事?
【正點原子STM32H7R3開發套件試用體驗】按鍵、串口通信
《DNESP32S3使用指南-IDF版_V1.6》第十一章 KEY實驗
米爾-紫光PG2L100H國產FPGA開發板試用】按鍵功能測試報告
FPGA加速深度學習模型的案例
基于FPGA實現按鍵消抖處理

FPGA做深度學習能走多遠?
兩種常見的硬件消抖實現方式

評論