← 返回博客时序逻辑

掌握时序逻辑:D 锁存器详解与仿真

D 锁存器把带门控的 SR 核心变成单输入存储器。推导其方程、理解透明性,并认识符号隐藏的时序限制。

DennyDenny
阅读约需 8 分钟
Chalkboard feature illustration for “掌握时序逻辑:D 锁存器详解与仿真”

**要点速览:**D 锁存器存储一个比特,并遵循 Qnext=(ED)+(E‾Q)Q_{next}=(E D)+(\overline{E}Q)。Enable 为高电平时,Q 会在传播延迟后跟随 D;Enable 为低电平时,Q 保持原值。使用 D 与 D‾\overline D 的门控,可以避免普通数据输入同时断言置位与复位;但物理锁存器仍有建立/保持时间要求,并可能在关闭边沿附近进入亚稳态。

时序逻辑通常从 SR 锁存器开始。它的两项独立控制允许一种无效的同时断言组合。带门控的 D 锁存器从一个数据输入及其补量推导出这两项控制,消除正常工作中的该组合,并明确规定新数据可以进入的时间。

D_LATCH 元件图

拆解 D_LATCH:它是什么,为什么重要

D_LATCH 的核心,是一只从 SR 结构派生的电平敏感存储元件。在布尔模型下,输入门控使 Set 与 Reset 互斥。它位于组合逻辑与边沿触发存储之间:逻辑门只取决于当前输入,锁存器则可以保留先前数值。

该元件包含两个主要输入与两个输出:

  • **D(Data):**决定锁存器应存储哪个数值(0 或 1)的单一输入。
  • **E(Enable):**通常标为“E”或“G”(Gate),这个输入像控制开关,决定锁存器何时关注 D 输入。
  • **Q:**反映已存数据的主要输出。
  • **Q‾\overline{Q}:**已存数据的互补(反相)输出。

其行为由 Enable 信号状态决定,分为两种不同工作模式。当 E=1E = 1 时,锁存器处于透明模式,输出 Q 会直接跟随 D 输入状态;D 变化时,Q 几乎立即随之变化。当 E=0E = 0 时,锁存器进入锁存模式。Q 输出完全忽略 D 输入,并保持 E 从 1 变为 0 前最后拥有的数值。

探索 D_LATCH 行为

技术规格与真值表

要掌握 D_LATCH,必须越过符号表面,理解支配其状态转换的逻辑。真值表根据当前输入,明确规定 Q 的下一状态(QnextQ_{next})。注意 E 为 0 时,D 输入无关,用“X”表示“不关心”。

E(Enable)D(Data)QnextQ_{next}操作
0XQQ保持(锁存)
100复位(透明)
111置位(透明)

特征方程

可以用 D_LATCH 特征方程从数学上表达这种行为。这条方程是电路工作的正式定义,也是大型时序设计进行布尔化简的重要基础。

Qnext=(E⋅D)+(E‾⋅Q)Q_{next} = (E \cdot D) + (\overline{E} \cdot Q)

下面从第一性原理推导。D_LATCH 内部是一只带门控的 SR 锁存器,其中:

  • S=E⋅DS = E \cdot D
  • R=E⋅D‾R = E \cdot \overline{D}

SR 锁存器的特征方程为 Qnext=S+R‾⋅QQ_{next} = S + \overline{R} \cdot Q。代入后:

Qnext=(E⋅D)+(E⋅D‾)‾⋅QQ_{next} = (E \cdot D) + \overline{(E \cdot \overline{D})} \cdot Q

应用德摩根定律:(E⋅D‾)‾=E‾+D\overline{(E \cdot \overline{D})} = \overline{E} + D。于是:

Qnext=(E⋅D)+(E‾+D)⋅Q=(E⋅D)+(E‾⋅Q)+(D⋅Q)Q_{next} = (E \cdot D) + (\overline{E} + D) \cdot Q = (E \cdot D) + (\overline{E} \cdot Q) + (D \cdot Q)

由于 (E⋅D)(E \cdot D) 已经覆盖 D 与 Q 均相关的情况,布尔化简会根据一致定理吸收 (D⋅Q)(D \cdot Q) 项,留下简洁结果:

Qnext=(E⋅D)+(E‾⋅Q)Q_{next} = (E \cdot D) + (\overline{E} \cdot Q)

把它拆成不同逻辑部分:

  • E⋅DE \cdot D 项表示透明性:Enable 为高电平时,输出变为 D 的当前值。
  • E‾⋅Q\overline{E} \cdot Q 项表示记忆:Enable 为低电平时,输出维持当前状态 QQ。
  • 这条方程实际上隐藏着一只多路选择器:Enable 信号在新数据与已存数值之间作出选择。

底层逻辑:从 SR 到 D

可以把 D_LATCH 看成一只经过巧妙改造的“带门控 SR_LATCH”。观察内部门结构,会发现 D 输入直接连接到“Set”侧,反相后的 D 输入(经 NOT 门)连接到“Reset”侧。这保证电路启用时,S 与 R 始终相反。

  • S=E⋅DS = E \cdot D
  • R=E⋅D‾R = E \cdot \overline{D}

当 E=1E=1 时,D=1D=1 产生 Set,D=0D=0 产生 Reset,因此普通数据路径无法同时发出两项命令。当 E=0E=0 时,两项控制均取消断言,核心保持原值。真实逻辑门并不会同时切换;接近关闭时刻的 D 与 Enable 转换可能违反时序。所以 D 锁存器能够避免 SR 真值表错误,却不能消除亚稳态。

SR_LATCH 元件图

常见陷阱:透明性的危险

D_LATCH 最大的优势——透明性——同时也是复杂高速系统中最显著的弱点。许多学生从简单电路转向 CPU 设计时,都会在这里踩坑。

由于 Enable 信号保持高电平的整个期间,输出 Q 都跟随输入 D,D 线上的任何噪声、毛刺或意外信号变化都会直接传到输出。这称为电平敏感行为。

可将 Enable 信号类比为窗口。当 E=1E=1 时,窗口保持透明,D 输入的全部变化(包括毛刺)都会实时反映到输出;当 E=0E=0 时,窗口关闭,输出保持关闭前最后采样的状态。

**透明性在实际设计中为何危险:**考虑一套系统,一只 D_LATCH 的输出穿过组合逻辑,又反馈到同一只或另一只锁存器的输入。Enable 为高电平时,任何输出变化都会立刻穿过逻辑抵达输入,随后再次改变输出。这会在组合逻辑中形成反馈路径,并可能导致:

  1. 在单一使能窗口内发生非预期的多次状态变化。
  2. 毛刺传播:数据线上的瞬态尖峰穿过电路到达 Q,破坏下游电路。
  3. 时序不可预测:最终锁存值取决于 Enable 在哪一个准确时刻下降,验证工作因此变得极其困难。

许多同步设计采用 D 触发器,其对外可见的捕获与时钟边沿相关。其他高性能设计会有意使用两相锁存器借用时间。两种选择都不能免除时序分析,而是分别定义不同的建立、保持、透明性与时钟约束。

示波器验证:观察信号

理解 D_LATCH 时序需要观察波形。在 DigiSim.io 中,OSCILLOSCOPE 是分析这些时序关系的重要工具。

把 OSCILLOSCOPE 连接到 E、D 与 Q 引脚后,会观察到几项关键行为:

  1. **传播延迟(tpdt_{pd}):**物理模型或延迟感知模型会显示透明期间,从 D 变化到 Q 响应之间的时间。理想逻辑仿真器可能不模拟该延迟。
  2. **锁存时刻:**仔细观察 E 从 1 降到 0 时的 Q 线。D 在那个准确微秒内的数值会由 Q 保持,无论之后 D 如何变化。
  3. **毛刺捕获:**E 为高电平时快速切换 D,会看到这些脉冲映射到 Q。E 为低电平时切换 D,OSCILLOSCOPE 上的 Q 线则始终保持平坦稳定。

打开示波器演示

现实应用:面包板之外

D_LATCH 并非只有学术价值,而是每天使用的设备架构中随处可见的主力元件。

1. CPU 流水线寄存器

流水线在不同级之间放置状态,使不同指令能够同时占据不同级。根据时钟方法,这些边界可能采用边沿触发器,也可能采用交替的锁存器相位。基于锁存器的流水线可以跨边界借用时间,但必须谨慎控制透明性、非重叠与保持时序。

2. 地址解复用(Intel 8086 示例)

为节省集成电路物理引脚,Intel 8085 与 8086 等早期微处理器使用复用的地址/数据总线。在机器周期的一部分时间,引脚承载存储器地址;另一部分时间则传输数据。

工程师使用外部 D_LATCH(例如著名的 74LS373 八路透明锁存器)为这些信号“解复用”。处理器先把地址放在总线上,再产生一个称为 **ALE(Address Latch Enable,地址锁存使能)**的脉冲。D_LATCH 捕获地址并为存储芯片保持它,从而释放处理器引脚,让它们随后发送或接收数据。没有 D_LATCH,CPU 就需要两倍数量的引脚,芯片会更大也昂贵得多。

带示波器的 D 锁存器模板

在 DigiSim.io 上构建 D_LATCH

除理论分析外,接线验证也有助于建立直观认识。下面的构造使用两只 AND 门、两只 NOR 门与一只 NOT 门。

逐步构建

  1. **放置逻辑门:**把两只 AND、两只 NOR 与一只 NOT 门拖到画布上。
  2. **设置输入:**加入两只 INPUT_SWITCH 元件,一只标记为“Data”,另一只标记为“Enable”。
  3. 输入逻辑:
  • 把“Data”连接到上方 AND 门。
  • 把“Data”连接到 NOT 门,再把 NOT 输出接到下方 AND 门。
  • 把“Enable”连接到两只 AND 门的第二个输入。
  1. 存储核心:
  • 把上方 AND 门输出连接到一只 NOR 门的输入。
  • 把下方 AND 门输出连接到第二只 NOR 门的输入。
  • 交叉耦合: 将上方 NOR 门的输出连接到下方 NOR 门的输入,再将下方 NOR 门的输出反馈到上方 NOR 门的输入。
  1. **输出:**把一只 OUTPUT_LIGHT 连接到下方 NOR 门输出。这就是 Q。

SimCast 体验

DigiSim.io 的 SimCast 功能可以慢速播放信号传播过程。由此可观察 Enable 信号如何控制数据通路:Data 上的高电平到达输入 AND 门后,只有在 Enable 同样为高电平时才会继续传播。

课程中的相关主题

以下相关主题有助于进一步理解 DigiSim.io 中的数字逻辑:

D_LATCH 是 DigiSim.io 结构化学习路径中的关键节点,标志着分析对象从当前组合逻辑关系扩展到由历史输入决定的状态。

最后的思考:迈向存储的第一步

D 锁存器把双稳态反馈变成受控的电平敏感存储。它防止普通 D 输入同时请求置位与复位,但透明性与关闭边沿时序仍是设计的核心问题。

继续阅读 D 触发器,了解边沿触发存储如何改变接口;也可以直接打开 D 锁存器元件参考。

将想法变成真正可运行的电路。