5. 时序逻辑设计¶
章节导引
本页从《计算机系统基础讲义》拆分而来,保留原章节锚点,方便从旧总览页和旧链接跳转。
学习目标¶
理解带状态电路如何存储历史,并能把简单需求建模成 FSM 或寄存器传输。
前置知识¶
组合逻辑、基本时钟概念和有限状态机直觉。
建议用时¶
建议 6–8 小时:存储元件 2 小时,FSM 2–3 小时,寄存器/计数器 2–3 小时。
练习建议¶
设计一个小序列检测器;列出状态转移表;解释 setup/hold 违例的后果。
参考资料与引用边界¶
- 整理者:Lumner。
- 课程来源:根据
SYS/目录下的课件整理;本章对应课件:SYS/Lec05_Sequential Logic.pptx。 - 原始讲义文件:
note/SYS_计算机系统基础讲义.md。 - 引用边界:这是公开学习笔记,不替代课程正式教材、教师课件或考试要求;外部引用时请注明来自本网站整理版。
5.1 时序逻辑模型¶
时序电路由组合逻辑和存储元件组成:
flowchart LR
I["输入"] --> C["组合逻辑"]
S["当前状态"] --> C
C --> O["输出"]
C --> N["下一状态"]
N --> M["存储元件"]
M --> S
CLK["时钟"] --> M
状态转移:
输出函数:
同步时序电路只在时钟边沿附近观察输入并改变状态。异步电路行为取决于输入在连续时间中的变化顺序,分析更困难。
5.2 反馈、稳定与存储¶
组合逻辑如果引入反馈,就可能形成存储或振荡:
- 反馈路径保持原输出时,电路可“记住”状态。
- 反馈路径中有反相器时,可能不稳定并振荡。
锁存器和触发器就是受控反馈结构,用来可靠存储状态。
5.3 SR Latch、D Latch 与 Flip-Flop¶
SR latch 可由交叉耦合 NAND 或 NOR 构成。它有 set、reset、hold 行为,但存在非法输入组合。
D latch 通过把 SR 输入约束为互补,避免非法状态:
Latch 是电平敏感,可能在时钟有效电平期间多次透传。Flip-flop 是边沿触发,只在时钟边沿采样输入,更适合同步设计。
常见触发器:
| 类型 | 输入 | 行为 |
|---|---|---|
| D FF | D | 边沿到来时 Q <- D |
| JK FF | J,K | 00 保持,01 reset,10 set,11 翻转 |
| T FF | T | 0 保持,1 翻转 |
5.4 触发器时序参数¶
| 参数 | 含义 |
|---|---|
setup time ts |
时钟边沿前输入必须稳定的时间 |
hold time th |
时钟边沿后输入必须继续稳定的时间 |
clock-to-Q delay tpd,FF |
时钟边沿到输出变化的延迟 |
pulse width tw |
时钟脉冲宽度 |
对于从一个触发器到另一个触发器的路径:
课件中使用 slack 写法:
要正确工作,所有路径都应满足 tslack >= 0。
例:时钟 250 MHz,则周期 tp = 4 ns。若 tpd,FF = 1.0 ns,边沿触发器 ts = 0.3 ns:
5.5 时序电路分析流程¶
给定时序电路,分析步骤:
- 写出输出方程、触发器输入方程和下一状态方程。
- 列带状态的真值表:输入为外部输入和当前状态,输出为外部输出和下一状态。
- 列出电路状态。
- 画状态图。
- 分析外部行为。
- 验证正确性、自启动能力和时序约束。
状态表包含:
| 区域 | 含义 |
|---|---|
| Present State | 当前状态变量 |
| Input | 外部输入组合 |
| Next State | 下一拍状态 |
| Output | 当前输出 |
5.6 Moore 与 Mealy¶
| 模型 | 输出依赖 | 状态图标注 | 特点 |
|---|---|---|---|
| Moore | 仅状态 | 标在状态内 | 输出稳定,常需要更多状态 |
| Mealy | 状态和输入 | 标在边上 | 状态少,输出可能更快但更易受输入毛刺影响 |
记忆技巧:Moore is More,Moore 机通常状态更多。
5.7 状态等价与化简¶
两个状态等价,当且仅当对于每个可能输入序列,它们产生完全相同的输出序列。等价状态可以合并,减少状态数和触发器/逻辑成本。
判定思路:
- 对每个输入符号,输出必须相同。
- 对每个输入符号,下一状态必须相同或等价。
5.8 时序逻辑设计流程¶
flowchart TD
A["规格说明"] --> B["建立状态图 / 状态表"]
B --> C["状态赋值"]
C --> D["选择触发器类型"]
D --> E["求触发器输入方程"]
E --> F["求输出方程"]
F --> G["优化"]
G --> H["技术映射"]
H --> I["验证功能、时序、自启动"]
状态赋值需要给每个抽象状态分配唯一二进制码。若有 m 个状态,最少需要:
未使用状态数:
状态赋值会影响下一状态方程、输出方程和电路复杂度。经验规则:
- 相同输入下有相同下一状态的当前状态,尽量赋相邻码。
- 同一当前状态在相邻输入下的下一状态,尽量赋相邻码。
- 相同输出的状态,尽量赋相邻码。
- 初始状态或最常用状态可赋 0。
5.9 例:序列检测器 1101¶
需求:输入串中每出现一次 1101,输出 1,允许重叠。
Mealy 状态含义:
| 状态 | 已识别的最长前缀 |
|---|---|
| A | 无有效前缀 |
| B | 1 |
| C | 11 |
| D | 110 |
状态转移:
stateDiagram-v2
[*] --> A
A --> A: 0/0
A --> B: 1/0
B --> A: 0/0
B --> C: 1/0
C --> D: 0/0
C --> C: 1/0
D --> A: 0/0
D --> B: 1/1
D --1/1--> B 的原因:识别到 1101 后,最后一个 1 同时也是下一次匹配的前缀 1。
若使用 Moore 机,需要额外状态 E 表示“完整序列已发生且输出 1”。
5.10 未使用状态与自启动¶
当状态编码数量大于实际状态数,会出现 unused states。电路上电、复位异常或噪声可能让 FSM 进入未使用状态。
处理策略:
| 策略 | 含义 |
|---|---|
| reset | 上电或错误时强制进入初始状态 |
| self-starting | 所有非法状态最终回到合法状态 |
| error state | 进入非法状态后停在错误状态并报告 |
| don't care 优化 | 面积小,但需验证非法状态行为 |
若非法状态互相循环,机器可能“卡死”。工程中不能只看合法状态图,还要检查完整编码空间。
5.11 寄存器与寄存器传输¶
寄存器是一组触发器,用于存储多位二进制值。寄存器常用于处理器中的临时数据保存,比主存更快。
带使能的触发器和寄存器:
图像说明:带 EN 的 D 触发器与 4 位寄存器
原课件包含 ./sys_notes_assets/register_enable.png。公开仓库当前不附带这张图片;本节保留文字化说明,阅读时可把它理解为“带 EN 的 D 触发器与 4 位寄存器”的结构示意。
寄存器传输操作由三部分描述:
- 系统中的寄存器集合。
- 对寄存器数据执行的微操作。
- 控制这些操作发生顺序的控制信号。
常见微操作:
| 类型 | 例子 |
|---|---|
| Transfer | R2 <- R1 |
| Arithmetic | R3 <- R1 + R2 |
| Logic | R3 <- R1 XOR R2 |
| Shift | R1 <- R1 << 1 |
控制表达式写在左侧:
含义:当 K1 = 1 时执行该传输。
5.12 总线结构¶
寄存器之间传输数据可使用:
| 结构 | 特点 |
|---|---|
| 专用 MUX | 每个寄存器输入有自己的选择器 |
| 单总线 | 多个源通过共享 MUX 或三态驱动连接总线 |
| 三态总线 | 同一时刻只能一个源驱动总线 |
| 多总线 | 支持更多并行传输,硬件更复杂 |
三态总线必须保证不会有多个输出同时驱动,否则会造成总线冲突。
5.13 移位寄存器¶
移位寄存器可以把存储位向左或向右移动。基本串行右移寄存器:
加入 MUX 后可支持:
- 保持。
- 左移。
- 右移。
- 并行装载。
典型模式表:
| S1 | S0 | 操作 |
|---|---|---|
| 0 | 0 | 保持 |
| 0 | 1 | 右移 |
| 1 | 0 | 左移 |
| 1 | 1 | 并行装载 |
5.14 计数器¶
计数器按固定状态序列前进。用途包括:
- 时间基准。
- 事件计数。
- 位数/步骤计数。
- 程序计数器 PC。
类型:
| 类型 | 特点 |
|---|---|
| Ripple counter | 低位触发高位,非真正同步,低功耗但延迟逐级累加 |
| Synchronous counter | 所有触发器共用时钟,组合逻辑产生下一状态 |
| Modulo-N counter | 按 N 个状态循环 |
| BCD counter | 十进制 0 到 9 循环 |
Ripple counter 最坏延迟约为:
同步计数器可用 incrementer 生成下一状态,但 carry chain 也可能变成长路径;可用并行 gating 或 lookahead 优化。
设计 modulo-N counter 时应避免“suicide counter”:异步检测终止状态后立即清零可能产生窄脉冲和时序风险。更稳妥方法是在终止状态前一拍同步 load/clear。