設(shè)計(jì)背景:
在我們的工程設(shè)計(jì)中我們會或多或少的用到開關(guān),開關(guān)分為好多種,不管是哪一種開關(guān)在按下還是抬起都會有輕微的抖動,為了使我們的設(shè)計(jì)更加準(zhǔn)確化,今天我們將學(xué)習(xí)按鍵消抖。
設(shè)計(jì)原理:
本次的設(shè)計(jì)是一個(gè)消抖的設(shè)計(jì),在我們用的按鍵中,按下時(shí)低電平,抬起時(shí)高地平,可是在現(xiàn)實(shí)中按鍵的瞬間高低電平的變化并不是我們想的那樣,而是下面的情況。
我們稱按下到s的時(shí)候稱為前抖,s到抬起后稱為后抖,在正常的情況下就是上面電平變化波形,那么我們?yōu)榱讼槐匾牟ㄐ危覀兙蛻?yīng)該在s區(qū)域來判斷按鍵是否按下也就是低電平,同理我們抬起的時(shí)候也要間隔一段時(shí)間后來確定按下,一般我們間隔的時(shí)間設(shè)置為 10ms ---- 20ms之間都可以,所以說消抖就是把現(xiàn)實(shí)中按下抬起的抖動消除,生成我們理想的高低高的波形。
設(shè)計(jì)架構(gòu)圖:
?
設(shè)計(jì)狀態(tài)轉(zhuǎn)移圖?
設(shè)計(jì)代碼:
設(shè)計(jì)模塊
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; //設(shè)計(jì)一個(gè)10ms的計(jì)數(shù)參數(shù)
8 parameterT10ms =50;
9
10 parameters0 =2'b00;//4個(gè)狀態(tài)
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)//按下就計(jì)數(shù)10ms
35 begin
36 count <=count +1'b1;
37 key_x <=1'b1;
38 end
39 else
40 begin//計(jì)數(shù)到了后給輸出賦值為 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)//抬起就計(jì)數(shù)10ms
55 begin
56 count <=count +1'b1;
57 key_x <=1'b0;
58 end
59 else
60 begin
61 key_x <=1'b1;//計(jì)數(shù)到了后給輸 出賦值為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
+關(guān)注
關(guān)注
1630文章
21777瀏覽量
604686
發(fā)布評論請先 登錄
相關(guān)推薦
評論