由于普通物理按键存在反作用弹簧,因此当按下或者松开时均会产生额外的物理抖动,物理抖动便会产生电平的抖动。在按键从按下再到松开的过程中,其电平变化如图1所示,上为理想波形输出,下为实际波形输出。
因此,对于转变中间过程存在的跳变,我们需要将其去除,一般来说,噪声仅存在与一段时间内,如20ms。当检测到跳变沿后的开始进行计时,在计数时间内如果出现跳变则重新开始及时,知道在一定时间内没有检测到跳变沿为止 ,则认为键入的数据已经达到稳定的状态。
Verilog代码上的表达如下:
module filter(
clk,
data,
rst,
led,
data_state,
cnt,
en_cnt,
full,
data_out
);
input clk;
input rst;
input data;
output reg [19:0]cnt;
output reg led;
output wire [3:0] data_state;
output reg en_cnt;
wire [3:0] data;
output reg full;
output reg data_out;
localparam
idle = 4'b0001,
filter0 = 4'b0010,
down = 4'b0100,
filter1