标签:外部 0ms 图片 pos parameter 代码 机械 amp inpu
使用机械弹性开关,当机械触点闭合/断开时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定的接通,在断开时也不会马上断开。而是会在闭合/断开的瞬间伴随一连串的抖动,为避免这种现象带来的问题,需要进行按键消抖。
在按键个数较少时可以使用硬件方法消除抖动。下图所示为使用RS触发器进行硬件消抖,当按键未按下时,输出为0;当按键按下时,输出为1。此时,即使按键因为弹性抖动而产生瞬时断开(抖动从B跳开),只要按键不回到原始状态A,双稳态触发器的状态也不会改变(保持为0),从而不产生抖动的波形。
在按键数量较多的情况下,通常采用软件方法进行消抖。在检测到按键闭合后开始执行一个延时程序,根据抖动的时间通常为5~10ms,去产生一个20ms的延时,让前沿抖动消失后再一次检测按键的状态。如果仍保持闭合状态电平,则认定为真正有键按下。
1 module key_fileter #(parameter CNT_MAX=20‘d999_999)( 2 input sys_clk , // 系统时钟50MHz 3 input sys_rst_n , // 全局复位 4 input key_in , // 按键输入信号 5 output reg key_flag // 为1时表示消抖后检测到按键被按下,为0表示没有检测到被按下 6 ); 7 reg [19:0] cnt_20ms; 8 // cnt_20ms:如果时钟的上升沿检测到外部按键输入的值为低电平时,开始计数 9 always @(posedge sys_clk or negedge sys_rst_n) 10 if(!sys_rst_n) 11 cnt_20ms <= 20‘b0; 12 else if(key_in) 13 cnt_20ms <= 20‘b0; 14 else if(cnt_20ms==CNT_MAX && key_in) 15 cnt_20ms <= cnt_20ms; 16 else 17 cnt_20ms <= cnt_20ms + 1‘b1; 18 19 // key_flag:当计数满20ms后产生按键有效标志位,且key_flag在999_999时拉高,维持一个周期的高电平 20 always @(posedge sys_clk or negedge sys_rst_n) 21 if(!sys_rst_n) 22 key_flag <= 1‘b0; 23 else if(cnt_20ms== CNT_MAX-1‘b1) 24 key_flag <= 1‘b1; 25 else 26 key_flag <= 1‘b0; 27 28 endmodule
标签:外部 0ms 图片 pos parameter 代码 机械 amp inpu
原文地址:https://www.cnblogs.com/lizhiqing/p/12974922.html