Altifigence Academy

47 / 63 · 概念

实际按钮输入:同步、消抖与单次事件

区分异步输入同步与触点弹跳消除,设计基于连续样本的消抖器。

一次按键可能包含多次转换

机械按钮的触点在稳定前,可能反复接通与断开。同时,按钮信号与系统时钟无关,是异步输入。同步解决如何接入时钟域的问题,消抖则把短时间反复转换判定为一个稳定状态。仅加入两级触发器触发器 在指定时钟边沿存储输入,并保持到下一边沿的元件。输入必须满足 setup、hold 条件。了解更多,并不会自动消除弹跳。

区分三个阶段的作用
  1. 异步按钮: 同时存在触点弹跳与时钟异步性
  2. 同步: 将单比特电平接入时钟域
  3. 消抖: 只在连续稳定样本后确认状态变化
  4. 边沿检测: 对已确认的 0→1 产生单周期事件

此流程假定按钮是保持足够长时间的单比特电平。短脉冲、多位一致性传输,以及异步时钟本身的处理,都需要单独设计。

连续 N 个样本规则

设当前已确认状态为 q,同步后的输入为 x,与 q 不同的连续样本数为 count。每次采样,若 x=q,就把 count 清零;若 x≠q,就递增 count,并在第 N 个连续样本时更新 q=x,再将 count 清零。

看一个 N=3、初始 q=0 的例子。每列表示观察同步后输入的采样时刻,图形不是物理触点电压。

样本012345678
x010111101
count after010120010
q after000001111
rise event000001000
N=3:连续确认相反值后才接受
查看波形数据
波形数据:每个字符表示一个区间,点表示保持前一状态,p 表示一个时钟周期。
信号波形总线值
sample2345234520 → 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8
x0101...01
q after0....1...
rise event0....10..

明确延迟与计数器位宽

采样间隔为 TsT_s 时,根据输入变化的相位,确认需要约 (N−1)Ts(N-1)T_s 到 NTsNT_s;前端同步延迟另行累加。若保守要求“稳定 10 ms”,选择 N 时还必须考虑首尾样本之间的时间。采样之间的短暂转换可能看不到,因此连续样本一致并不能证明实际电压在此期间从未变化。必须同时规定开关特性与采样条件。

若 count 只存储 0 到 N−1,所需位宽为 max⁡(1,⌈log⁡2N⌉)\max(1,\lceil\log_2 N\rceil)。也要处理 N=1 特例:第一个相反样本就应立即确认,因此实现中与 N−1 比较的先后顺序很重要。

将一次按下转换为一个事件

若已确认的新状态为 q_next,则 rise=q‾ qnextrise=\overline q\,q_{next}。上表采用与状态确认同一次采样产生事件的策略。若通过独立寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多比较 q 与延迟一个周期的 q,可能因观察位置而增加延迟,因此还要规定何时消费事件。

自己试试

N=3、初始 q=0,输入依次为 1、1、0、1、1、1,状态在哪个样本改变?N=8 且计数器存储 0~7 时,最小位宽是多少?

阅读解释

第三个样本 0 将连续计数清零,所以在第六个样本确认 1。count 的 0~7 范围需三位;若另一实现存到 8,则需要四位,因此应先确认实际存储范围。

你的选择适用于此浏览器,可随时在页脚更改。