设计背景:
在我们的工程设计中我们会或多或少的用到开关,开关分为好多种,不管是哪一种开关在按下还是抬起都会有轻微的抖动,为了使我们的设计更加准确化,今天我们将学习按键消抖。
设计原理:
本次的设计是一个消抖的设计,在我们用的按键中,按下时低电平,抬起时高地平,可是在现实中按键的瞬间高低电平的变化并不是我们想的那样,而是下面的情况。
我们称按下到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
+关注
关注
1626文章
21670浏览量
601882
发布评论请先 登录
相关推荐
评论