设计背景:
在我们的工程设计中我们会或多或少的用到开关,开关分为好多种,不管是哪一种开关在按下还是抬起都会有轻微的抖动,为了使我们的设计更加准确化,今天我们将学习按键消抖。
设计原理:
本次的设计是一个消抖的设计,在我们用的按键中,按下时低电平,抬起时高地平,可是在现实中按键的瞬间高低电平的变化并不是我们想的那样,而是下面的情况。
我们称按下到s的时候称为前抖,s到抬起后称为后抖,在正常的情况下就是上面电平变化波形,那么我们为了消除不必要的波形,我们就应该在s区域来判断按键是否按下也就是低电平,同理我们抬起的时候也要间隔一段时间后来确定按下,一般我们间隔的时间设置为 10ms ---- 20ms之间都可以,所以说消抖就是把现实中按下抬起的抖动消除,生成我们理想的高低高的波形。
设计架构图:
设计状态转移图
设计代码:
设计模块
0 module key_xiaodou(clk,rst_n,key,key_x);
1
2 input clk; //输入输出
3 input rst_n;
4 input key;
5
6 output reg key_x;
7 //parameter T10ms = 500_000; //设计一个10ms的计数参数
8 parameter T10ms = 50;
9
10 parameter s0 = 2'b00; //4个状态
11 parameter s1 = 2'b01;
12 parameter s2 = 2'b10;
13 parameter s3 = 2'b11;
14 reg [18:0] count;
15 reg [1:0]state;
16 always @ (posedge clk or negedge rst_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
69 endmodule
测试模块
0 `timescale 1ns/1ps
1
2 module xiaodou_tb();
3
4
全部0条评论
快来发表一下你的评论吧 !