Altifigence Academy

30 / 63 · 概念

计数器的下一状态与复位优先级

将递增、保持、复位与回绕统一为一份规格,计算逐边沿结果。

先用下一状态表达式定义功能

给 NN 位自由递增计数器加入同步 reset 与 enable 后,得到:

Ck+1={0rk=1(Ck+1) mod 2Nrk=0, ek=1Ckrk=0, ek=0C_{k+1}=\begin{cases} 0&r_k=1\\ (C_k+1)\bmod2^N&r_k=0,\ e_k=1\\ C_k&r_k=0,\ e_k=0 \end{cases}

复位复位 将状态恢复为规定初值的控制。必须同时规定其同步或异步性质,以及相对于其他控制的优先级。优先级最高,enable=0 时保持。在下方的可视化中,可以切换 enable,比较递增与保持行为。

从初始 q=11 选择 reset=1,只有下一状态先变为 00。点击下一时钟,观察存储值实际变化的时刻。释放 reset 后,依次执行 00→01→10→11→00;再比较 enable=0 时是否只有边沿数增加而 q 保持。

亲自比较上升沿前后的状态

同步 reset 优先于 enable。enable=0 时保持当前存储值。 q=11; q_next = (q + 1) mod 4

编写逐边沿预测表

两位计数器初始状态为 3,第一边沿 reset=1、之后 reset=0,则各边沿后的值为 0、1、2、3、0。即使在时钟之间把 reset 置为 1,同步寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多也不会在上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多之前立即变为 0。

边沿边沿前 reset旧 C更新后 C
1130
2001
3012
4023
5030

每列记录一个上升沿的观察结果。输入取自边沿前,名称带 after 的状态取自更新后。列的排列表示采样顺序,并非描绘物理传播延迟传播延迟 从输入变化到输出稳定为正确值所需的时间。逻辑表达式等价与时间特性是两回事。了解更多。从初始状态 3 开始,第一边沿的 reset 优先于递增;最后一个边沿从 3 回绕到 0。

两位计数器的复位与回绕
查看波形数据
波形数据:每个字符表示一个区间,点表示保持前一状态,p 表示一个时钟周期。
信号波形总线值
edge23452E0 → E1 → E2 → E3 → E4
reset10...
count before2345211 → 00 → 01 → 10 → 11
count after2345200 → 01 → 10 → 11 → 00

不要混淆 reset 的含义

always_ff @(posedge clk) 内的 if(rst) 是同步复位,不同于在事件列表中加入 reset 边沿的异步复位。异步复位的释放具有 recovery/removal 等额外时序要求,不能仅因为它更快变为 0 就随意改用。

若计数器用于周期性产生脉冲,还必须规定在哪个状态产生脉冲。是在计数值为最大值期间输出 1,还是在回绕到 0 的边沿后输出一个周期的 1,会改变输出表达式与观察时刻。

自己试试

一个三位计数器当前为 7。第一边沿 rst=0、en=0,下一边沿 rst=0、en=1,各边沿后的状态是什么?

阅读解释

第一边沿保持为 7;下一边沿越过三位范围,回绕为 0。若要继续保留 8,就需要更宽位宽,或另行规定饱和、错误策略。

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