电路组成如图所示,其中AN为按键开关,高有效,U1为7474,U2为7408。U1A、U1B、U2A、U2B组成一个状态(Q2、Q1)变化为00—01—10一00的状态机,按键输入信号KEY-lN接U1A、U1B的“清零”端CD,U1A、U1B的“置位”端SD始终接高电平,时钟脉冲CLK经U2C与/Q2相与后送U1A、U1B的时钟输入端CLK,消除抖动的按键信号经U侣的Q2即KEY-OUT输出。
(2)按键闭合时,KEY-IN为高电平,即U1A、U1B的“清零”端为高电平,如果此时时钟脉冲不为上升沿,Q2、Q1仍然为00;如果此时时钟脉冲为上升沿,则状态机不再处于“清零”状态。Q2、Q1由00变为01。由于按键开关的抖动,在下一个时钟脉冲上升沿到来之前,KEY-IN又变为低电平,即U1A、U1B的“清零”端又变为低电平,状态机又回到“清零”状态,即Q2、Q1由01回到00 。可见,在按键开关没有稳定闭合之前,状态机的Q2、Q1总是在00和01之间跳动,也就是说KEY—OUT在按键闭合抖动期间输出始终为低电平而无抖动。
(3)按键稳定闭合后,KEY—IN为高电平,即U1A、U侣的“清零”端为高电平,在时钟脉冲上升沿的作用下状态机的Q2、Q1由00变为01再变为10。在状态机的Q2、Q1变为10的瞬间,状态机的/Q2由1变为O,使得时钟脉冲被LJ2C"封锁”,即U1A、U1B的时钟输入端CLK保持低电平,由于此时U1A、U1B的“清零”端和“置位”端均为高电平,所以状态机保持Q2、Q1为10不变,也就是说在按键开关保持稳定闭合后,经过一个时钟周期,状态机就可保持Q2、01为10不变,KEY—OUT输出也就保持高电平而不发生抖动。
(4)按键断开时,KEY—IN为低电平,即U1A、U1B的“清零”端为低电平,状态机回到“清零”状态,即Q2、Q1变为00,KEY—OUT也就由高电平变为低电平,状态机的/Q2也由O变为1,U2C门被“打开”,时钟脉冲又可通过U2C加到U1A、U1B的时钟输入端。由于按键开关的抖动,KEY—IN又变为高电平,在时钟脉冲上升沿的作用下状态机的Q2、Q1由00变为01,由于按键抖动的时间小于时钟脉冲的周期,在下一个时钟脉冲上升沿到来之前,KEY—IN又会变为低电平,使得状态机又回到“清零”状态,即Q2、Q1又变为00。可见在按键断开时,状态机的Q2、Q1是在00和01之间跳动,也就是说KEY—OUT在按键断开抖动期间输出始终为低电平而无抖动。
(5)按键完全断开后,KEY—IN保持为低电平,即U1A、U1B的“清零”端也保持为低电平,状态机回到“清零”状态,Q2、Q1保持为00,KEY—OUT输出也就保持低电平而不发生抖动。同时,/Q2为1,U2C门保持“打开”,时钟脉冲被送到U1A、U1B的时钟输入端,为下一次按键闭合动作作好了准备。
根据上面电路工作情况分析及波形仿真可以看出,该电路能够消除按键开关动作时的前后沿抖动,输出的无抖动信号KEY—OUT的时间仅比按键稳定闭合的时间小一个时钟周期,可见输出的无抖动信号基本是跟随按键开关稳定闭合动作的。电路中所需要的时钟信号一般可通过实际电路中的系统时钟分频而得。很显然,如果不利用CPLD器件来实现该电路,如果需要消除抖动的按键较多。实际电路会显得很繁杂,但如果利用CPLD器件来实现,情况则完全不一样,因其内部资源非常丰富,整个电路会非常简洁。