29 / 63 · 概念
状态数、计数器位宽与未使用编码
从计数范围计算存储位数,并定义非法状态的恢复策略。
课时内容可免费阅读,选课后可保存学习进度。
计数电路也是状态机
循环计数 0~9 需要十个状态,最少存储位宽为 位。但四位寄存器寄存器 存储多位状态的电路。本课程中的同步寄存器在时钟边沿存储指定输入。了解更多有 16 种位模式,仅选对位宽并不能完成模 10 功能。
M 是状态数,而非最大值。从 0 数到 M-1 与从 0 数到 M 不同。若支持参数 M=1,应将存储位宽限制为至少一位,并令其始终保持 0。
四位存储有 16 个编码,但模 10 只把其中十个作为正常状态。确定位宽后,还必须加入比较与恢复策略。
- 十个状态: 正常 count 为 0~9
- 四位存储: 16 个编码,10~15 为多余编码
- 下一状态: en=1 且 count≥9 时为 0
越界状态也是设计的一部分
四位模 10 计数器若因某种原因变为 12,接下来应怎样工作?可以证明初始化和复位复位 将状态恢复为规定初值的控制。必须同时规定其同步或异步性质,以及相对于其他控制的优先级。了解更多条件使它不会发生,也可规定在不小于 9 时恢复为 0。恢复功能并不保证能抵抗所有硬件故障。
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 个状态,因此需要七位,未使用编码为 个。单纯递增不会在 99 回绕,而会继续到 127,所以实现的是模 128,而不是模 100。
✓ 已学习