Altifigence Academy

29 / 63 · 概念

状态数、计数器位宽与未使用编码

从计数范围计算存储位数,并定义非法状态的恢复策略。

计数电路也是状态机

循环计数 0~9 需要十个状态,最少存储位宽为 ⌈log⁡210⌉=4\lceil\log_2 10\rceil=4 位。但四位寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多有 16 种位模式,仅选对位宽并不能完成模 10 功能。

N=⌈log⁡2M⌉,unused codes=2N−MN=\left\lceil\log_2 M\right\rceil,\qquad \text{unused codes}=2^N-M

M 是状态数,而非最大值。从 0 数到 M-1 与从 0 数到 M 不同。若支持参数 M=1,应将存储位宽限制为至少一位,并令其始终保持 0。

四位存储有 16 个编码,但模 10 只把其中十个作为正常状态。确定位宽后,还必须加入比较与恢复策略。

存储位宽与循环条件需分别设计
  1. 十个状态: 正常 count 为 0~9
  2. 四位存储: 16 个编码,10~15 为多余编码
  3. 下一状态: en=1 且 count≥9 时为 0

越界状态也是设计的一部分

四位模 10 计数器若因某种原因变为 12,接下来应怎样工作?可以证明初始化和复位复位 将状态恢复为规定初值的控制。必须同时规定其同步或异步性质,以及相对于其他控制的优先级。了解更多条件使它不会发生,也可规定在不小于 9 时恢复为 0。恢复功能并不保证能抵抗所有硬件故障。

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

本例中的错误值 10~15 也只在 en=1 的边沿恢复。enable=0 时,这些值同样保持不变;若规格要求立即恢复,就必须改变条件优先级。

位宽审查与功能审查是两回事

表示 0~999 用十位已足够,但自由递增会一直到 1023。必须加入在规格规定的最大状态返回 0 的比较与选择电路。对于存储器地址、迭代次数和数据包长度计数器,这种差别会直接导致非法访问或长度错误。

自己试试

求循环计数 0~99 的计数器最小位宽及未使用编码数。若只是按该位宽执行 +1,会有什么不同?

阅读解释

共有 100 个状态,因此需要七位,未使用编码为 128−100=28128-100=28 个。单纯递增不会在 99 回绕,而会继续到 127,所以实现的是模 128,而不是模 100。

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