学习 › 第 12 讲
时序图、毛刺与静态冒险
阅读约 8 分钟 · bitGateLab 团队
在纸面上,逻辑门是瞬间响应的;而实际上每个门都要花上几纳秒。这个差别在真值表里几乎从不重要,但在时序图里却很要紧:两条延迟不同的路径可能产生虚假的脉冲,称为毛刺(glitch),它会让计数器在不该计数时前进一步,或者让锁存器在不该动作时被触发。本文将带你学习读时序图、计算延迟,并用卡诺图发现和消除静态冒险。
怎样读时序图
时序图把每个信号画成一条线,在共同的水平时间轴上升高(1)或降低(0)。在任意时刻作一条假想的竖线,就能读出所有信号的值。输入的跳变沿是原因;输入沿与它引起的输出变化之间的距离就是延迟。在带时钟的电路中,要读取每个有效时钟沿之前那一刻的值,因为触发器正是在那时采样。
传播延迟与关键路径
传播延迟是从输入变化到由此引起的输出变化之间的时间,在各自跳变的 50 % 点之间测量。通常区分两个值:
- tPLH:输出由低变高时的延迟。
- tPHL:输出由高变低时的延迟。
在 5 V 供电的 74HC 系列中,简单逻辑门的延迟在 10 ns 量级,并且会随着容性负载的增大和电源电压的降低而变长。
电路的延迟是从任一输入到输出之间最慢那条路径的延迟,这条路径称为关键路径。计算方法是把每条路径上各个门的延迟相加,取其中最大的一个。
例:F = A·B + A·C,其中 tNOT = 5 ns,tAND = 10 ns,tOR = 10 ns。
- B 或 C 的路径:AND + OR = 20 ns。
- A 经过上方 AND 门的路径:AND + OR = 20 ns。
- A 经过反相器的路径:NOT + AND + OR = 25 ns。
关键路径是 A 经过反相器的那一条,为 25 ns。任何输入变化之后,F 稳定下来所需的时间都不会超过这个值。
毛刺与静态冒险
静态 1 冒险是指:在某次输入变化期间输出本应保持为 1,却可能短暂地跌到 0。静态 0 冒险则相反:输出本应保持为 0,却出现一个短暂的 1 尖峰。当一个变量和它的反变量经由延迟不同的路径到达输出时,这两种冒险都会出现。
取上一个例子的电路,令 B = C = 1。从逻辑上讲,F = A + A = 1 恒成立。但是当 A 从 1 降到 0 时,A·B 这一项会在 A·C 接通之前先关断,因为 A 必须先经过反相器。
毛刺的时间过程(B = C = 1,A 在 t = 0 下降):
- t = 5 ns:反相器使 A 上升。
- t = 10 ns:A·B 的 AND 门输出下降(它响应的是 A 在 t = 0 的变化)。
- t = 15 ns:A·C 的 AND 门输出上升(它响应的是 A 在 t = 5 的变化)。
- 在 10 到 15 ns 之间,OR 门的两个输入都为 0。OR 门在 10 ns 之后响应:从 t = 20 到 t = 25 ns,F 为 0。
毛刺的宽度等于两条路径的延迟之差:5 ns,即反相器的延迟。如果 A 上升,A·B 在 t = 10 接通,A·C 在 t = 15 关断;在这段时间里两者都为 1,不会出现毛刺。
还有动态冒险:输出本应只变化一次,却变化了三次或更多次(例如 1 → 0 → 1 → 0)。它出现在多级逻辑中,即同一个变量有三条或更多条延迟不同的路径时。
用卡诺图发现并消除冒险
在与或式的卡诺图中,当两个取值为 1 的格子相邻,却分别被不同的圈覆盖,并且没有任何一个圈同时盖住它们时,就存在静态 1 冒险。从一个格子转到另一个格子意味着只改变一个变量,而在这一变化过程中,电路要从一项“跳”到另一项。
解决办法是增加共识项(也就是教材中常说的冗余项):一个同时盖住这两个格子的额外的圈。从逻辑上看它是多余的(不改变真值表),但它能在跳变期间使输出保持为 1。
例:F = A·B + A·C。
- A·B 覆盖 ABC = 110 和 111 两格。A·C 覆盖 001 和 011。
- 011 和 111 两格相邻(只有 A 变化),却位于不同的圈中:这就是我们前面看到的 B = C = 1 时的冒险。
- 同时盖住这两格的圈是 B·C,即 A·B 与 A·C 的共识项:去掉在一项中以原变量出现、在另一项中以反变量出现的那个变量,再把剩下的部分相乘。
- 无冒险的电路:F = A·B + A·C + B·C。当 B = C = 1 时,B·C 这一项始终为 1,OR 门的输出就不可能再下降。
对于或与式,推理是对偶的:找出位于不同圈中的相邻的 0,并增加共识和项来消除静态 0 冒险。例如,F = (A + B)·(A + C) 在 B = C = 0 时存在冒险,增加因子 (B + C) 即可纠正。
常见错误
- 以为真值表正确的电路就不会出错:真值表完全不反映跳变期间的行为。
- 化简时因为“多余”而去掉共识项,而该电路驱动的却是时钟或复位信号。
- 把电路中所有门的延迟都加起来,而不是只加最慢那条路径上的延迟。
- 以为共识项能消除两个输入同时变化时的毛刺:它只能覆盖单个变量的变化。
在模拟器中试一试
在时序图中,你可以看到这个尖峰,以及加上共识项之后它是如何消失的。
- 放置一个反相器、两个 AND 门和一个 OR 门,搭出 F = A·B + A·C。
- 固定 B = 1,C = 1,把 A 接到一个可以切换的输入,或接到一个慢速时钟信号。
- 打开时序图,把 A 从 1 变到 0,多做几次;观察跳变时刻的 F,看是否出现短脉冲或毛刺提示。
- 增加第三个 AND 门实现 B·C,并把它接入 OR 门。
- 重复改变 A,观察 F 保持为 1。
练习
- 找出 F = A·C + B·C 的静态冒险,并写出无冒险的版本。
答案
A·C 覆盖 100 和 110;B·C 覆盖 011 和 111。110 和 111 两格相邻(C 变化)却在不同的圈中,此时 A = B = 1。共识项:A·B。F = A·C + B·C + A·B。
- 在练习 1 的电路中,tNOT = 4 ns,tAND = 8 ns,tOR = 8 ns,A = B = 1,毛刺出现在 C 的哪种跳变上?何时出现?持续多久?
答案
C 在 t = 0 下降时:B·C 在 t = 8 下降,C 在 t = 4 上升,A·C 在 t = 12 上升。在 8 到 12 ns 之间 OR 门看到两个 0,所以 F 从 t = 16 到 t = 20 ns 为 0:持续 4 ns。C 上升时没有毛刺。
- 按练习 2 的延迟,F = A·C + B·C 的关键路径是哪一条?
答案
从 C 经过反相器:4 + 8 + 8 = 20 ns。
- 对于 F = (A + B)·(A + C),当 B = C = 0 时输出应为何值?可能出现什么样的毛刺?
答案
当 B = C = 0 时,F = A·A = 0。A 变化时可能出现一个短暂的 1 尖峰(静态 0 冒险)。增加因子 (B + C) 即可消除。