30 / 63 · 概念
计数器的下一状态与复位优先级
将递增、保持、复位与回绕统一为一份规格,计算逐边沿结果。
课时内容可免费阅读,选课后可保存学习进度。
先用下一状态表达式定义功能
给 位自由递增计数器加入同步 reset 与 enable 后,得到:
复位复位 将状态恢复为规定初值的控制。必须同时规定其同步或异步性质,以及相对于其他控制的优先级。优先级最高,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 |
|---|---|---|---|
| 1 | 1 | 3 | 0 |
| 2 | 0 | 0 | 1 |
| 3 | 0 | 1 | 2 |
| 4 | 0 | 2 | 3 |
| 5 | 0 | 3 | 0 |
每列记录一个上升沿的观察结果。输入取自边沿前,名称带 after 的状态取自更新后。列的排列表示采样顺序,并非描绘物理传播延迟传播延迟 从输入变化到输出稳定为正确值所需的时间。逻辑表达式等价与时间特性是两回事。了解更多。从初始状态 3 开始,第一边沿的 reset 优先于递增;最后一个边沿从 3 回绕到 0。
查看波形数据
| 信号 | 波形 | 总线值 |
|---|---|---|
| edge | 23452 | E0 → E1 → E2 → E3 → E4 |
| reset | 10... | |
| count before | 23452 | 11 → 00 → 01 → 10 → 11 |
| count after | 23452 | 00 → 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,就需要更宽位宽,或另行规定饱和、错误策略。