Altifigence Academy

16 / 37 · 概念

模计数器、饱和计数器与结束脉冲

设计最大值处理方式,以及终值计数信号的精确周期。

三种越界策略各不相同

同样是 N 位寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多,达到最大值时应回绕、保持最大值还是报告错误,取决于规格。

Cnextwrap=(C+1) mod 2NC_{next}^{wrap}=(C+1)\bmod2^N
Cnextsat=min⁡(C+1,2N−1)C_{next}^{sat}=\min(C+1,2^N-1)

八位模计数器在 255 之后变为 0,饱和计数器则保持 255,两者功能不同。需要正负数的累加器,还应考虑 signed 范围及两侧饱和边界。

每列记录一个上升沿上升沿 时钟从 0 变为 1 的瞬间。它不同于表示整个 CLK=1 区间的电平。了解更多的观察结果。输入取自边沿前,名称带 after 的状态取自更新后。列的排列表示采样顺序,并非描绘物理传播延迟传播延迟 从输入变化到输出稳定为正确值所需的时间。逻辑表达式等价与时间特性是两回事。了解更多。初始 count=8、reset=0、enable=1。相同输入下,模 10、四位回绕与四位饱和会形成不同轨迹。

最大值之后的三种策略
查看波形数据
波形数据:每个字符表示一个区间,点表示保持前一状态,p 表示一个时钟周期。
信号波形总线值
edge234523452E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8
mod10 after2345234529 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7
wrap4 after2345234529 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1
sat4 after2345234..9 → 10 → 11 → 12 → 13 → 14 → 15

比较模 M 的最后状态

若要每十次产生一次脉冲,可使用 0~9 状态,只计数 enable 有效的边沿。pulse 可注册为“本边沿消费状态 9 并返回 0”的事件标志。

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    count <= 4'd0;
    pulse <= 1'b0;
  end else begin
    pulse <= 1'b0;
    if (en) begin
      if (count == 4'd9) begin
        count <= 4'd0;
        pulse <= 1'b1;
      end else count <= count + 4'd1;
    end
  end
end

pulse 有默认赋值,因此下一边沿会回到 0。若只是输出 count==9,enable=0 停住时可能连续多个周期为 1。必须区分终止状态与完成事件。

计数周期的基准

复位后从 count=0 开始,必须经过十个 enable=1 的边沿,才出现第一个 pulse。相比将第一边沿称为第 0 或第 1 个,更重要的是始终一致地定义输入、状态和输出表。

本实验是模 16 计数器。从初始 1110 前进一个边沿得到 1111,再前进得到 0000。尝试在 1111 时令 enable=0 暂停。保持与饱和看起来可能数值相同,但恢复运行后行为不同。比较若采用饱和计数器,在相同条件下应得到什么值。

在四位最大值处停止或回绕

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

自己试试

上述电路在 count=9、pulse=0 时,先经过两个 en=0 的边沿,再经过一个 en=1 的边沿,count 与 pulse 如何变化?

阅读解释

暂停的两个边沿中,保持 count=9、pulse=0。第三个边沿变为 count=0、pulse=1,再下一边沿由默认赋值令 pulse=0。

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