假设按键一般在20ms之内可以稳定,但是极端情况,抖动时间在50ms;
wire nedge;//下降沿。按键按下
wire pedge;//上升沿,按键按回
assign nedge=!key_a&&key_b;
assign pedge=key_a&&!key_b;
状态分为:空:若检测到下降沿则跳到按下状态;
按下:最重要的是如何判断此时已经达到稳定状态/此时是否还在抖动
我的思路,20ms内各触发器状态不变,等待计数器加满,因为未满时,不管存在抖动还是抖动已经消失,都让其20ms后进行其他动作,为了防止20ms后还有抖动,判断此时是否有上升沿,若有则重新计数,否则,现在稳定,进入下一个状态;但是这个思路有个BUG,如果20ms后的上升沿不是抖动产生而是按键按上的上升沿呢?就无法判断;所以第二种思路:
在20ms内,每来一个时钟上升沿都检查是否有上升沿,若有,说明抖动仍存在,重新计数,直到没有抖动,则为稳定;
这种判断的时间也不仅仅只是20ms,可能更长,但是,排除了稳定期之后的按上操作;
两种方式区别在于将时间还是上升沿作为判断抖动的关键条件,造成的结果也不同,所以一个条件下走不通时,需要考虑是否关键条件没有选对。