今天简单的说说按键消抖,原理特别好理解,其实就是延时,做一定时间的延时后取值一次,就能够得到特定的消抖后的状态了。
为什么要消抖? 见图:
我们可以看到,但按键按下的那一刻,存在一段时间的抖动,同时在释放按键的一段时间里也是存在抖动的,这就可能导致状态在识别的时候可能检测为多次的按键,因为运行过程中普通的检测一次状态key为1就执行一次按键操作。所以我们在使用按键时往往需要消抖。
消抖方式有很多种,这里我提供一种相对而言比较简单容易理解的方式,通过延时来消抖。
我们知道,抖动时间的长短由按键的机械特性决定,一般为5ms~10ms.
大家看原理图,其实我们要做的就是,但按键按下去后,只在中间稳定的某一个时刻(10ms)取一个真正按键的使能值就好了,详细的见代码:
(鉴于板子一般有四个按键,这里的代码是对四个按键消抖的)
/*******按键消抖*******/
module key_vibration(
input mclk,
input rst_n,
input [3:0] key,
output reg [3:0] key_en
);
parameter DURATION = 50_000; //延时10ms
reg [15:0] cnt;
wire ken_enable;
assign ken_enable = key[3] | key