本章目录 26 节

← 返回课程首页

第 13 章 计数器与简单时序模块

1. 本章要解决的问题

上一章的寄存器会保存或移动外部送来的数据。本章再向前走一步:如果把寄存器当前状态经过组合逻辑处理后送回输入,寄存器就能在每个时钟边沿自动产生下一个状态。

本章回答六个问题:

  1. 二进制计数器为什么能自动执行 000→001→010→…
  2. 怎样让计数器只循环 \(N\) 个状态,而不是用完全部 \(2^K\) 个状态?
  3. 计数器输出为什么能够分频?
  4. 同步计数器与异步脉动计数器的差别在哪里?
  5. 怎样用移位寄存器构成环形计数器和 Johnson 计数器?
  6. 设计简单时序模块时,怎样检查非法状态、复位和输出含义?

2. 与前一章的联系

第 12 章建立了三条基础:触发器只在有效边沿采样;多位寄存器同时读取旧状态;移位寄存器每拍移动一次位模式。本章没有更换存储元件,只改变寄存器输入的来源。

普通寄存器:外部数据 D ──→ 寄存器 ──→ Q
计数器:    当前状态 Q ──→ 下一状态逻辑 ──→ D ──→ 寄存器 ──→ 新 Q

这一结构也是后续有限状态机的核心。计数器的状态转移规则很规律,适合先练习“当前状态—下一状态”的设计方法。

3. 前置知识快速检查

先尝试回答下面四个问题:

  1. 3 bit 无符号数从 000111 分别表示哪些整数?
  2. 同一时钟边沿到来时,寄存器各位读取旧状态还是相邻位刚更新的新状态?
  3. 带使能寄存器在 \(EN=0\) 的有效边沿会怎样?
  4. 4 bit 右移寄存器若满足 \([Q_3^+,Q_2^+,Q_1^+,Q_0^+]=[SI,Q_3,Q_2,Q_1]\),旧状态 1001\(SI=0\),下一状态是什么?

对应答案是:0~7;读取旧状态;保持;0100。若第 1 题不熟,回看第 6 章;若第 2~4 题不熟,回看第 12 章第 15~16 节。

4. 学习目标

完成本章后,你应能够:

5. 计数器的核心:状态经过组合逻辑再反馈

把一个 \(K\) bit 寄存器的当前状态写成向量 \(Q=[Q_{K-1}ldots Q_1Q_0]\)。组合逻辑根据当前状态 \(Q\) 和外部控制 \(X\) 算出下一状态:

\[ Q^+=F(Q,X). \]

\(Q^+\) 只是“准备在下一个有效边沿写入的值”。边沿到来前,组合逻辑可以随着 \(Q\) 或控制输入变化;边沿到来后,寄存器经过时钟到 Q 延迟更新,新的 \(Q\) 又成为下一轮计算的输入。

阅读图 13-1 时沿蓝色数据路径看一圈:当前状态送入下一状态逻辑,结果回到寄存器的 D 端;紫色时钟只控制何时写入。

寄存器与下一状态逻辑构成计数器

图 13-1 寄存器保存当前状态,组合逻辑计算下一状态,时钟边沿完成离散更新

这个图处在 RTL/门级抽象。它保留状态、逻辑功能和时钟关系,暂不展开触发器内部晶体管。第 14 章会进一步计算反馈路径允许的最大组合延迟。

6. 同步二进制加一计数器

同步计数器(synchronous counter)的所有触发器共享同一个有效时钟边沿。一个连续计数的 \(K\) bit 二进制计数器满足

\[ Q^+=(Q+1)\bmod 2^K. \]

“模 \(2^K\)”表示只保留 \(K\) bit。最大状态 \(2^K-1\) 再加 1 时,最高进位被丢弃,状态回到 0。3 bit 计数器因此循环:

000 → 001 → 010 → 011 → 100 → 101 → 110 → 111 → 000 → …

若加入高有效使能 \(EN\),则

\[ Q^+= \begin{cases} (Q+1)\bmod 2^K, & EN=1,\\ Q, & EN=0. \end{cases} \]

使能不改变时钟。它只让下一状态逻辑在“加一”和“保持”之间选择。

7. 每一位何时翻转

二进制加一可以逐位理解。\(Q_0\) 是最低有效位(LSB):每次数值加一,它都翻转。\(Q_1\) 只有在更低位 \(Q_0=1\) 时才翻转,因为此时加一会从第 0 位产生进位。\(Q_2\) 只有在 \(Q_1Q_0=11\) 时翻转。

定义翻转条件 \(T_i\)\(T_i=1\) 表示第 \(i\) 位在本边沿取反。带使能时

\[ T_0=EN, \]

\[ T_i=EN\prod_{k=0}^{i-1}Q_k,qquad i\ge1. \]

使用 D 触发器时,D 输入应为

\[ D_i=Q_i\oplus T_i. \]

\(T_i=0\),异或使 \(D_i=Q_i\),该位保持;当 \(T_i=1\)\(D_i=\overline{Q_i}\),该位翻转。对 3 bit 计数器:

\[ D_0=Q_0\oplus EN, \]

\[ D_1=Q_1\oplus(ENQ_0), \]

\[ D_2=Q_2\oplus(ENQ_1Q_0). \]

图 13-2 把“所有位同一边沿更新”和“各位翻转条件不同”放在一起。注意:011→100 时三位在逻辑意义上属于同一次状态更新,不是先改 \(Q_0\) 再逐位向上传递。

3bit同步二进制计数器

图 13-2 同步计数器共享同一时钟,各位由旧状态产生的翻转条件决定下一状态

例题 1:逐拍分析 3 bit 同步计数器

一个 3 bit 同步加一计数器初始状态为 101。连续四个上升沿的 \(EN\) 依次为 1、0、1、1。求每个边沿后的状态。

逐拍使用旧状态:

边沿 边沿前状态 \(EN\) 边沿后状态
1 101 1 110
2 110 0 110
3 110 1 111
4 111 1 000

最后一次是 7 加 1,3 bit 只保留低三位,所以回到 0。

变式: 若第四个边沿 \(EN=0\),最终状态保持 111

8. 为什么优先使用时钟使能

暂停计数最直接的方法是让下一状态等于当前状态,而不是把普通逻辑门随意串到时钟线上。下面这种裸与门时钟不应作为通用设计方法:

\[ CLK_g=CLK\cdot EN. \]

如果 \(CLK=1\) 期间 \(EN\) 从 0 变为 1,\(CLK_g\) 会在周期中途产生一个边沿;组合逻辑毛刺也可能变成窄时钟脉冲。时钟边沿直接控制触发器,额外边沿可能让部分寄存器误采样。

基础 RTL 设计应使用触发器的时钟使能语义。真正的低功耗时钟门控使用专门的集成时钟门控单元,并由实现流程检查,本书第 23 章再介绍。

9. 模 N 计数器

\(N\) 计数器(modulo-\(N\) counter)只使用 \(N\) 个状态,通常按

\[ 0,1,2,\ldots,N-1,0,1,\ldots \]

循环。容纳这些状态所需的最小位宽为

\[ K=\lceil\log_2N\rceil. \]

\(\lceil\ \rceil\) 表示向上取整。例如模 6 需要 3 bit,因为 2 bit 只能表示 4 个状态,而 3 bit 可以表示 8 个状态。

一个带高有效同步复位 \(RST\) 和使能 \(EN\) 的模 6 计数器可以定义为

\[ Q^+= \begin{cases} 0, & RST=1,\\ Q, & RST=0,\ EN=0,\\ 0, & RST=0,\ EN=1,\ Q=5,\\ Q+1, & RST=0,\ EN=1,\ 0\le Q<5,\\ 0, & RST=0,\ EN=1,\ Q\in\{6,7\}. \end{cases} \]

最后一行是非法状态恢复规则。3 bit 硬件客观上还能保存 110111。即使正常路径不会主动进入它们,复位不完整、上电未知状态或瞬态故障都可能使电路落入未使用状态。把它们映射到 0,可以让模块在下一有效计数边沿回到合法循环。

图 13-3 中实线构成正常的六状态循环,虚线表示未使用状态的恢复路径。

模6计数器状态循环与非法状态恢复

图 13-3 模 6 计数器使用 3 bit 中的六个状态,并明确规定 110111 如何恢复

例题 2:设计模 6 计数器

要求计数序列为 0→1→2→3→4→5→0,带同步复位、使能和终点计数输出 \(TC\)

第一步,确定位宽:

\[ K=\lceil\log_2 6\rceil=3. \]

第二步,规定下一状态:复位优先;未使能时保持;使能且 \(Q=5\) 时回 0;使能且 \(Q<5\) 时加一;状态 6、7 在使能时回 0。

第三步,定义终点计数(terminal count):

\[ TC=EN\cdot(Q=5). \]

这里 \(TC\) 是组合指示:它在“当前已经是 5 且允许计数”时为 1,表示下一个边沿将回到 0。如果系统希望边沿后得到一个寄存脉冲,应另加触发器,不能悄悄改变接口含义。

变式:\(TC\) 只定义为 \((Q=5)\),暂停在 5 时它会持续为 1,而不是只表示即将回卷。

10. 模 2 的幂与任意模数

\(N=2^K\),普通 \(K\) bit 二进制计数器自然就是模 \(N\) 计数器,不需要额外检测终点。例如 4 bit 计数器天然是模 16。

\(N\) 不是 2 的幂,需要额外判断终点并选择回零值。比较器和 MUX 会进入寄存器反馈路径,增加组合延迟和面积。对基础设计,先保证状态定义完整,再考虑逻辑化简。

不要把“让二进制计数器跑到非法状态后再异步清零”当作首选同步设计。解码延迟可能使清零脉冲宽度依赖门延迟,也可能在输出上产生短暂非法码。同步回卷的状态边界更清楚。

11. 用二进制计数器分频

连续计数且每个时钟周期加一时,\(Q_0\) 每拍翻转一次,完成一个完整高低循环需要两个输入周期,因此

\[ f_{Q_0}=\frac{f_{clk}}{2}. \]

\(Q_1\) 每两拍翻转一次,\(Q_2\) 每四拍翻转一次。一般地,

\[ f_{Q_i}=\frac{f_{clk}}{2^{i+1}}. \]

图 13-4 先标出输入时钟周期,再比较三个输出位的完整周期。每向高位移动一位,频率再除以 2。

二进制计数器各位的二分频关系

图 13-4 连续二进制计数时,\(Q_0\)\(Q_1\)\(Q_2\) 分别得到除 2、除 4、除 8 的周期波形

例题 3:计算各位输出频率

一个 4 bit 二进制计数器由 80 MHz 时钟驱动,始终使能。求各位频率。

\[ f_{Q_0}=80/2=40\ \text{MHz}, \]

\[ f_{Q_1}=80/4=20\ \text{MHz}, \]

\[ f_{Q_2}=80/8=10\ \text{MHz}, \]

\[ f_{Q_3}=80/16=5\ \text{MHz}. \]

这些结论要求连续计数。若 \(EN\) 间歇为 0,输出相对于真实时间不再保持固定周期。

变式: 输入改为 100 MHz 时,\(Q_3\) 为 6.25 MHz。

12. 三种“分频输出”不要混为一谈

“分频”在接口规格中可能指不同波形:

  1. 二进制计数器某一位:\(2^m\) 分频,稳态下高低各占一半周期。
  2. \(N\) 终点脉冲:\(N\) 个输入周期出现一次,重复频率为 \(f_{clk}/N\),但脉冲通常只宽一个时钟周期,占空比为 \(1/N\)
  3. 新的 50% 占空比分频时钟: 对偶数 \(N\) 可设计输出每 \(N/2\) 拍翻转;奇数分频要得到严格 50% 占空比通常需要利用两种边沿或更专门的结构。

因此,“模 5 计数器能产生 5 分频事件”是正确的;“直接取某一位就得到 50% 占空比的 5 分频时钟”并不成立。

若分频信号要作为其他触发器的时钟,还要考虑时钟树、偏斜和时钟域关系。基础同步系统更常把终点脉冲当作时钟使能,让所有寄存器继续使用同一主时钟。

13. 异步脉动计数器

异步计数器(asynchronous counter)也称脉动计数器(ripple counter)。它不是让所有触发器共享同一时钟,而是让前一级输出充当后一级时钟。以负边沿触发、每级都执行翻转的结构为例:外部 \(CLK\) 驱动 \(Q_0\)\(Q_0\) 的下降沿驱动 \(Q_1\)\(Q_1\) 的下降沿再驱动 \(Q_2\)

稳定之后,它也能呈现二进制计数序列。但一个输入边沿到来后,变化像波纹一样逐级传播:

外部 CLK 边沿 → Q0 经过 t_cq 翻转
              → 若 Q0 出现有效边沿,Q1 再经过 t_cq 翻转
              → 若 Q1 出现有效边沿,Q2 再经过 t_cq 翻转

因此从 01111000 的过渡不会同时完成。按 \([Q_3Q_2Q_1Q_0]\) 观察,电路可能短暂经过 0110→0100→0000→1000。这些中间码不是新的逻辑计数状态,而是各级传播延迟造成的暂态。

图 13-5 对比了同步与脉动结构。同步计数器的触发器同时收到时钟,剩余差异主要是各自 \(t_{cq}\);脉动计数器把前一级输出当作后一级时钟,延迟会逐级累计。

同步计数器与异步脉动计数器对比

图 13-5 同步结构在同一边沿启动各位更新,脉动结构的有效边沿逐级传播并产生暂态中间码

例题 4:估算脉动稳定时间

一个 4 bit 脉动计数器中,每级触发器的最大时钟到 Q 延迟均为 25 ps。最坏情况下,一个外部边沿引发四级依次翻转。估算最高位稳定所需时间。

\[ t_{settle,max}\approx4\times25\ \text{ps}=100\ \text{ps}. \]

这只是给定简化模型下的累计估算。真实值还依赖每级边沿、负载、PVT 和触发器规格。

如果在 40 ps 时用组合译码器读取整个计数值,电路可能仍处在中间码。设计不能把暂态码当作稳定计数结果。

变式: 8 级、每级 30 ps 时,最坏累计值约为 240 ps。

14. 同步与脉动计数器怎样选择

比较项 同步计数器 异步脉动计数器
时钟连接 所有位共享主时钟 前一级输出驱动后一级时钟
状态更新 同一边沿启动 逐级传播
最大延迟趋势 下一状态组合逻辑与单级触发器延迟 多级触发器延迟累计
多位译码 稳定窗口更清楚 过渡时容易看到暂态码
时钟分析 单一时钟域较清楚 产生多个派生时钟关系
典型用途 常规同步控制、地址和周期计数 简单低速计数或专用分频场景

脉动计数器元件少、结构直观,但它的“简单”会把复杂性转移到时序和接口上。本课程后续同步设计默认使用同步计数器。

15. 环形计数器

环形计数器(ring counter)把移位寄存器的末端输出直接反馈到首端。对 4 bit 状态向量 \([Q_3Q_2Q_1Q_0]\),定义

\[ [Q_3^+,Q_2^+,Q_1^+,Q_0^+]=[Q_0,Q_3,Q_2,Q_1]. \]

若初始化为独热码 1000,状态循环为

1000 → 0100 → 0010 → 0001 → 1000 → …

4 个触发器只得到 4 个独热状态,但每个状态可直接作为一个互斥的周期相位信号,译码很简单。

初始化是环形计数器不可省略的要求。若从 0000 开始,反馈和移位后仍是 0000,计数器永远不会进入独热循环。若从 1100 开始,则两个 1 会一起旋转,也不再是独热状态。

16. Johnson 计数器

Johnson 计数器(Johnson counter)也称扭环计数器(twisted-ring counter),它把末端输出取反后反馈到首端。对相同位序:

\[ [Q_3^+,Q_2^+,Q_1^+,Q_0^+]=[\overline{Q_0},Q_3,Q_2,Q_1]. \]

0000 开始,4 bit Johnson 计数器循环:

0000 → 1000 → 1100 → 1110 → 1111 → 0111 → 0011 → 0001 → 0000

\(K\) bit Johnson 计数器的正常循环包含 \(2K\) 个状态。它比环形计数器利用更多状态,同时相邻正常状态仍只改变一位,便于产生有规律的相位序列。

图 13-6 把两种反馈规则并列。先看箭头上的反馈值,再检查每拍是否使用全部旧状态。

4bit环形计数器与Johnson计数器状态循环

图 13-6 环形计数器反馈原位值并循环一个 1,Johnson 计数器反馈反相值并形成 \(2K\) 个正常状态

例题 5:比较两种移位反馈序列

两个 4 bit 模块都采用 \(Q_0\) 反馈到 \(Q_3\) 的方向。

前者每拍移动已有的 1;后者先逐拍移入 1,装满后再逐拍移入 0。

变式: Johnson 计数器再运行四拍,依次为 0111、0011、0001、0000

17. 它们也是简单序列发生器

序列发生器(sequence generator)是在每个时钟边沿按规定顺序产生状态或输出的时序模块。二进制计数器、环形计数器和 Johnson 计数器都属于规则序列发生器:

更长的伪随机序列可以用线性反馈移位寄存器产生,但它涉及反馈多项式、最大长度条件和全零锁死等新问题,超出本章基础主线。

18. 设计一个简单时序模块的固定流程

面对“每隔若干拍做一次动作”或“按顺序产生控制信号”的需求,可以按下面步骤设计:

  1. 定义状态含义。 明确每个位模式表示什么,不先画门。
  2. 列出正常序列。 写出每个当前状态对应的下一状态。
  3. 确定位宽。 二进制编码常用 \(\lceil\log_2N\rceil\) bit,独热环形结构常用 \(N\) bit。
  4. 规定复位状态。 复位后必须进入已知、可用的状态。
  5. 规定未使用状态。 说明它们保持、恢复还是进入某安全状态。
  6. 加入使能和优先级。 写清复位、使能、正常更新的先后关系。
  7. 定义输出时刻。 输出是当前状态译码、边沿后寄存值,还是一个单周期脉冲?
  8. 检查时钟。 优先使用同一主时钟和时钟使能,不随意制造派生时钟。
  9. 逐拍验证。 从复位开始覆盖正常循环、暂停、回卷和非法状态恢复。

这套流程会在第 16 章推广为有限状态机设计。

19. 常见误区与反例

误区 1:同步计数器内部的进位逐级跨过触发器

同步计数器的各触发器同一边沿读取由旧状态算出的 D。组合逻辑可能存在不同路径延迟,但不会让同一边沿的新 \(Q_0\) 再作为 \(Q_1\) 的本拍旧值。

误区 2:\(K\) bit 计数器只能设计成模 \(2^K\)

它的物理状态容量是 \(2^K\),可以通过下一状态逻辑只使用其中 \(N\) 个状态,构成任意满足 \(N\le2^K\) 的模 \(N\) 计数器。

误区 3:未使用状态不需要定义

未使用不等于不存在。完整设计应明确它们如何恢复,特别是控制模块和安全相关状态机。

误区 4:模 N 终点脉冲就是 50% 占空比分频时钟

终点脉冲的重复率可以是 \(f_{clk}/N\),但若脉宽为一个输入周期,占空比是 \(1/N\)

误区 5:把 \(EN\) 与普通时钟直接相与就能安全暂停

\(EN\) 在时钟高电平期间变化可能制造额外边沿。使用时钟使能或合格的时钟门控单元。

误区 6:脉动计数器在数值跳变时始终呈现合法二进制码

各级延迟累计会产生暂态中间码。若组合译码这些位,可能出现毛刺。

误区 7:环形计数器复位为全零最安全

普通环形反馈下,全零会锁住。应初始化为规定的独热状态,或加入能够注入 1 的恢复逻辑。

误区 8:Johnson 计数器的全部 \(2^K\) 个状态都在正常循环中

\(K\) bit Johnson 正常循环只有 \(2K\) 个状态。其余状态需要结合具体实现考虑恢复策略。

20. 工程中的实际意义

计数器广泛用于:

从物理实现看,计数器包含触发器、组合反馈逻辑和时钟网络。更宽的同步二进制计数器会让高位翻转条件包含更多低位,可能形成较长组合路径;脉动计数器则把延迟放到级联时钟边沿上。二者都不是“零延迟的数字方块”。

计数器也是功耗活跃的模块。\(Q_0\) 每拍翻转,低位活动率很高;时钟本身持续驱动全部触发器。第 23 章会从动态功耗和时钟门控角度重新审视这一点。

21. 本章知识链

寄存器:在边沿保存 Q
        ↓ 加入组合反馈 F(Q,X)
下一状态结构:Q+ = F(Q,X)
        ├─ 加一逻辑 → 同步二进制计数器 → 2 的幂分频
        ├─ 终点检测 → 模 N 计数器 → 周期使能/终点脉冲
        ├─ 前级作时钟 → 脉动计数器 → 累计延迟与暂态码
        └─ 移位反馈 → 环形/Johnson 计数器 → 相位与规则序列
                              ↓
下一章:寄存器到寄存器路径、建立/保持约束与最高频率

22. 本章小结

  1. 计数器由寄存器和下一状态组合逻辑构成,统一写成 \(Q^+=F(Q,X)\)
  2. \(K\) bit 同步二进制计数器连续计数时满足 \(Q^+=(Q+1)\bmod2^K\)
  3. \(i\) 位翻转条件为 \(T_i=EN\prod_{k=0}^{i-1}Q_k\),D 输入为 \(D_i=Q_i\oplus T_i\)
  4. \(N\) 计数器至少需要 \(\lceil\log_2N\rceil\) bit,并应定义未使用状态的行为。
  5. 终点计数 \(TC\) 的时刻和含义必须由接口明确规定。
  6. 二进制计数器第 \(i\) 位频率为 \(f_{clk}/2^{i+1}\),前提是连续计数。
  7. \(N\) 终点脉冲的重复率可为 \(f_{clk}/N\),但它不等于 50% 占空比分频时钟。
  8. 同步计数器共享一个时钟;脉动计数器用前一级输出驱动后一级,延迟会累计。
  9. 环形计数器需要正确初始化,\(K\) bit 正常独热循环有 \(K\) 个状态。
  10. Johnson 计数器反馈末位反相值,\(K\) bit 正常循环有 \(2K\) 个状态。

23. 练习

基础题

  1. 用一句话说明计数器与普通并行寄存器的结构差别。
  2. 写出 3 bit 二进制加一计数器的完整状态循环。
  3. 同步计数器中的“同步”具体指什么?
  4. 5 个状态至少需要多少个二进制状态位?
  5. 什么是终点计数 \(TC\)?它一定是寄存输出吗?
  6. 为什么不应使用普通与门直接把 \(CLK\)\(EN\) 组合成新时钟?

分析与计算题

  1. 4 bit 同步加一计数器初始为 1110,连续三个边沿均使能。写出各边沿后的状态。
  2. 3 bit 同步计数器初始 010,四个边沿的 \(EN\)1、1、0、1。写出状态序列。
  3. 写出 4 bit 同步二进制计数器的 \(T_0\)\(T_1\)\(T_2\)\(T_3\)
  4. 一个模 10 计数器至少需要多少 bit?哪些位模式未用于正常十进制循环?
  5. 模 6 计数器当前状态为 101\(EN=1\)。下一状态与 \(TC=EN\cdot(Q=5)\) 分别是什么?
  6. 64 MHz 连续二进制计数器的 \(Q_0\)\(Q_2\)\(Q_5\) 频率分别是多少?
  7. 一个模 5 计数器每五拍产生一个、宽度为一个输入周期的终点脉冲。其重复频率和占空比分别是多少?
  8. 6 级脉动计数器每级最大延迟为 40 ps,估算最坏稳定时间。
  9. 4 bit 环形计数器从 0010 开始,按本章反馈方向写出接下来四个状态。
  10. 3 bit Johnson 计数器从 000 开始,写出返回 000 前的全部状态。

综合题

  1. 为一个模 4 同步计数器写出“同步复位优先、其次使能、否则保持”的下一状态关系。
  2. 设计一个“每 8 个主时钟周期产生一次单周期使能脉冲”的模块。说明计数状态、输出条件和为什么输出不必作为新时钟。
  3. 比较同步二进制计数器、脉动计数器、环形计数器和 Johnson 计数器的时钟连接、状态数量及主要风险。
  4. 某 3 bit 模 6 计数器因故进入 111。给出一种自恢复规则,并说明它最迟何时回到正常循环。

24. 练习答案

展开第 13 章练习答案

题 1

普通并行寄存器从外部装入数据;计数器在寄存器前加入组合反馈逻辑,由当前状态自动计算下一状态。

题 2

000→001→010→011→100→101→110→111→000

题 3

所有状态位由同一个时钟的同一种有效边沿启动更新,而不是逐级用前一位输出作时钟。

题 4

\[ K=\lceil\log_2 5\rceil=3. \]

题 5

\(TC\) 是表示当前达到规定终点或即将回卷的输出条件,其准确含义由接口定义。它可以是当前状态的组合译码,也可以另加触发器成为寄存脉冲。

题 6

\(EN\) 在时钟有效电平期间变化或出现毛刺时,普通与门可能在新时钟上制造额外边沿或窄脉冲,使触发器误采样。

题 7

按模 16 加一,状态依次为 1111、0000、0001

题 8

010→011→100→100→101,所以四个边沿后的状态依次为 011、100、100、101

题 9

\[ T_0=EN, \]

\[ T_1=ENQ_0, \]

\[ T_2=ENQ_1Q_0, \]

\[ T_3=ENQ_2Q_1Q_0. \]

题 10

\(K=\lceil\log_2 10\rceil=4\) bit。正常使用 00001001,未使用 10101111,即十进制 10~15。

题 11

当前为 5 且使能,下一状态回到 000\(TC=1\)

题 12

\[ f_{Q_0}=64/2=32\ \text{MHz}, \]

\[ f_{Q_2}=64/8=8\ \text{MHz}, \]

\[ f_{Q_5}=64/64=1\ \text{MHz}. \]

题 13

重复频率为 \(f_{clk}/5\)。每五个周期中只有一个周期为高,因此占空比为 \(1/5=20\%\)

题 14

\[ t_{settle,max}\approx6\times40\ \text{ps}=240\ \text{ps}. \]

题 15

\([Q_3^+,Q_2^+,Q_1^+,Q_0^+]=[Q_0,Q_3,Q_2,Q_1]\)

0010 → 0001 → 1000 → 0100 → 0010

接下来四个状态为 0001、1000、0100、0010

题 16

3 bit Johnson 更新关系为 \([Q_2^+,Q_1^+,Q_0^+]=[\overline{Q_0},Q_2,Q_1]\)

000 → 100 → 110 → 111 → 011 → 001 → 000

返回前共有 6 个正常状态,符合 \(2K=6\)

题 17

设状态为 2 bit:

\[ Q^+= \begin{cases} 0, & RST=1,\\ (Q+1)\bmod4, & RST=0,\ EN=1,\\ Q, & RST=0,\ EN=0. \end{cases} \]

题 18

使用 3 bit 模 8 同步计数器,状态从 0 数到 7。定义

\[ pulse=EN\cdot(Q=7). \]

连续使能时,pulse 每 8 拍为高一个周期。下游寄存器继续接主时钟,并把 pulse 接到时钟使能端;这样系统保持同一时钟域,不需要把组合脉冲当作新时钟。

题 19

结构 时钟连接 \(K\) bit 正常状态数 主要注意点
同步二进制 共享主时钟 \(2^K\) 高位下一状态逻辑可能变长
脉动计数器 前级输出作后级时钟 \(2^K\) 累计延迟、暂态码、派生时钟
环形计数器 共享主时钟 \(K\)(独热初始化时) 全零锁死、初始化
Johnson 共享主时钟 \(2K\) 正常循环外状态的恢复

题 20

可规定 \(Q\in\{6,7\}\)\(EN=1\)\(Q^+=0\)。因此从 111 出发,在下一个有效计数边沿后进入 000;若 \(EN=0\) 时设计为保持,则必须等到下一次 \(EN=1\) 的有效边沿。

25. 自测清单

若第 2~3 项不稳定,请手写 000111 的每次加一,并圈出每拍翻转的位。若第 6 项不稳定,请分别画出“每 5 拍一个窄脉冲”和“周期为 5 拍的方波”,比较它们的高电平持续时间。若第 8 项不稳定,请把 0111→1000 拆成逐级延迟的中间码。

26. 下一章衔接

本章已经会用寄存器和组合反馈逻辑构成自动运行的时序模块,但还没有回答“组合逻辑最晚必须在什么时候算完”。第 14 章《同步时序设计与时序约束》会沿着图 13-1 的反馈路径,加入 \(t_{cq}\)、组合逻辑最大/最小延迟、建立时间和保持时间,计算允许的时钟周期、最高频率与时序裕量。