47 / 63 · 概念
实际按钮输入:同步、消抖与单次事件
区分异步输入同步与触点弹跳消除,设计基于连续样本的消抖器。
课时内容可免费阅读,选课后可保存学习进度。
一次按键可能包含多次转换
机械按钮的触点在稳定前,可能反复接通与断开。同时,按钮信号与系统时钟无关,是异步输入。同步解决如何接入时钟域的问题,消抖则把短时间反复转换判定为一个稳定状态。仅加入两级触发器触发器 在指定时钟边沿存储输入,并保持到下一边沿的元件。输入必须满足 setup、hold 条件。了解更多,并不会自动消除弹跳。
- 异步按钮: 同时存在触点弹跳与时钟异步性
- 同步: 将单比特电平接入时钟域
- 消抖: 只在连续稳定样本后确认状态变化
- 边沿检测: 对已确认的 0→1 产生单周期事件
此流程假定按钮是保持足够长时间的单比特电平。短脉冲、多位一致性传输,以及异步时钟本身的处理,都需要单独设计。
连续 N 个样本规则
设当前已确认状态为 q,同步后的输入为 x,与 q 不同的连续样本数为 count。每次采样,若 x=q,就把 count 清零;若 x≠q,就递增 count,并在第 N 个连续样本时更新 q=x,再将 count 清零。
看一个 N=3、初始 q=0 的例子。每列表示观察同步后输入的采样时刻,图形不是物理触点电压。
| 样本 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| x | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |
| count after | 0 | 1 | 0 | 1 | 2 | 0 | 0 | 1 | 0 |
| q after | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
| rise event | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
查看波形数据
| 信号 | 波形 | 总线值 |
|---|---|---|
| sample | 234523452 | 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 |
| x | 0101...01 | |
| q after | 0....1... | |
| rise event | 0....10.. |
明确延迟与计数器位宽
采样间隔为 时,根据输入变化的相位,确认需要约 到 ;前端同步延迟另行累加。若保守要求“稳定 10 ms”,选择 N 时还必须考虑首尾样本之间的时间。采样之间的短暂转换可能看不到,因此连续样本一致并不能证明实际电压在此期间从未变化。必须同时规定开关特性与采样条件。
若 count 只存储 0 到 N−1,所需位宽为 。也要处理 N=1 特例:第一个相反样本就应立即确认,因此实现中与 N−1 比较的先后顺序很重要。
将一次按下转换为一个事件
若已确认的新状态为 q_next,则 。上表采用与状态确认同一次采样产生事件的策略。若通过独立寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多比较 q 与延迟一个周期的 q,可能因观察位置而增加延迟,因此还要规定何时消费事件。
自己试试
N=3、初始 q=0,输入依次为 1、1、0、1、1、1,状态在哪个样本改变?N=8 且计数器存储 0~7 时,最小位宽是多少?
阅读解释
第三个样本 0 将连续计数清零,所以在第六个样本确认 1。count 的 0~7 范围需三位;若另一实现存到 8,则需要四位,因此应先确认实际存储范围。