📖 名词溯源:latch 与 flip-flop latch(锁存器)本意是「门闩、插销」——门闩一旦落下,就「锁」住当前状态,非常形象。而触发器(flip-flop)这个词据说来自早期电路「啪嗒啪嗒」来回翻转的声音。习惯上,latch 是电平触发的,flip-flop 是边沿触发的,区别就在下一节。
🎯 本章学习目标
- 理解为什么计算机必须「记忆」,以及记忆和组合逻辑的本质区别。
- 理解「反馈」:输出绕回输入如何产生记忆。
- 掌握 SR 锁存器和 D 触发器的原理。
- 理解寄存器(多个触发器)与时钟信号的作用。
6.1为什么需要记忆
想想加法器的工作方式:你给它 A 和 B,它给你一个结果。但如果你想把「3+5 的结果 8」先存起来,过一会儿再拿它去加 2,组合逻辑做不到——因为输入一撤,输出立刻消失。
计算机真正在做的事情,是一连串有先后顺序的运算:先把上一步的结果存住,再用它做下一步。没有「记忆」,就只能算一步忘一步,什么都干不成。所以我们需要一类能把状态保持住的电路——这就是 时序逻辑电路(sequential logic)。
核心思想 时序逻辑 = 有记忆的组合逻辑。它的输出不仅取决于当前输入,还取决于「历史状态」。有了它,计算机才能「算一步、记一步、接着算」。
把「算一步忘一步」的窘境再推演具体一点。假设要算 (3 + 5) × 2,拆成两步:第一步算 3+5;第二步拿结果乘 2。对纯组合电路来说,第二步开始时第一步的「8」已经无处可寻——加法器的输出线上现在只剩空气。唯一的补救办法是把「8」抄到一个能保住它的地方,等第二步要用时再抄回来。这个「抄下来、存得住」的过程,就是记忆的全部使命:让「先后」成为可能。凡是多步骤的任务——累加、计数、逐条执行程序——都依赖它。可以说,没有记忆,就没有「步骤」这个概念,只剩「当场一次性算完」的静态函数。
「状态」(state)这个词也值得多说一句。记忆电路保存的不只是一个孤零零的 0 或 1,而是系统走到哪一步的完整进度:程序执行到第几条指令、计数器数到几、一个按钮流程走到第几步。工程师把这些统称为「状态」,把整个系统的运转看成「状态一步一步迁移」的过程——这套视角叫状态机(finite state machine),它是读懂数字系统行为的总纲,本节先埋个名字,后面的计数器、CPU 指令周期都是它的实例。
还要澄清一个容易混淆的问题:计算机里明明有内存条、硬盘,记忆不是早就有了吗?——它们和本章要造的「记忆」是同一使命、不同层次的三种物理解法。触发器(本章)靠电反馈自锁,快如闪电但一个要占好几个晶体管,只做少量「手边」记忆;内存(第 9 章)靠电容存电荷,密度高但会漏电要刷新;硬盘(第 10 章)靠磁畴翻转,断电也在但慢。速度、容量、成本三者不可兼得,工程就用「分层」来各取所长——这个金字塔,等学完第 9、10 章你会看得更完整。
📐 例题 1 哪些任务绕不开「记忆」?
下面四个需求,哪些必须用时序逻辑(有记忆)才能实现,哪些纯组合逻辑就够了?
① 输入两个开关量,输出「是否都接通」;
② 统计按钮被按下的总次数并显示;
③ 把 4 位二进制翻译成七段数码管的亮灭;
④ 电梯到达楼层后记住「当前在几层」,用于决定下一步方向。
思路 判断标准只有一条:输出是否只取决于「现在」的输入。若是,组合逻辑够用;若输出还依赖「过去发生了什么」,就必须记忆。
解 ① 当前两个开关的状态一查即得,与历史无关 → 组合逻辑(一个与门)。
② 「总次数」是历史累积量——第 10 次按下的显示值取决于之前按过 9 次 → 必须记忆(计数器,6.5 节)。
③ 亮灭只由「现在输入的这 4 位」决定 → 组合逻辑(译码器,5.6 节)。
④ 「当前在几层」显然要跨时刻保持 → 必须记忆(寄存器存当前楼层)。
结论:②④ 必须时序,①③ 组合即可。
答:②④ 必须用记忆。 ⚠ 易错点:③ 容易被误判——「显示」看起来像有状态,但它的输出纯粹由当下输入决定,转瞬即变也无所谓;判断时盯住「输出是否依赖历史」,别被「看起来复杂」迷惑。
再举一个你以后会天天见的状态:CPU 里有个寄存器叫程序计数器(Program Counter,PC),它记住的正是「程序执行到第几条指令」。每执行完一条,PC 加一;遇到跳转,PC 改写成新地址——程序的「进度」全靠它扛着。假如 PC 没有记忆,CPU 每拍都要问「我从哪儿来」——整个「按顺序执行」的体系立刻崩塌。所以下一章讲冯·诺依曼结构时,你会看到「存储程序」四个字的分量,一半就压在这些能记状态的电路身上。
航空工程师对本节其实再熟悉不过:机载设备的「自检测」(BIT)要在上电后按步骤推进,每一步的结果都要存进状态字;测试台要「记住」上次设定的量程。凡是带「流程」二字的系统,都活在时序逻辑的世界里。
6.2反馈:让输出「绕回」输入
怎么凭空造出记忆?关键在于一个反直觉的操作:把输出的一部分,接回输入。这叫 反馈(feedback)。
直觉上,这好像会造成「死循环」。但如果我们用的是两个交叉耦合的非门(或与非门),神奇的事情就发生了:
为什么它能「记住」?因为这是一个有自洽解的环路:
- 如果 Q = 1,那么它右边的非门输出 Q̄ = 0,这个 0 又喂回左边,维持 Q = 1……稳定。
- 反过来,Q = 0 也是一个稳定状态。
它有两个稳定状态,而且没人动它,它就永远待在当前状态——这就是「记住了一位」。这种「两个稳定状态」的电路,正是第一章说的 bit 的物理化身。
🧠 一句话记忆 记忆 = 反馈。把输出绕回输入,电路就「自锁」在一个状态上,不动它就不变。
为什么这个「循环」不是死循环?用代数把它写出来最服人。两个非门的方程联立:
逐一代入验证:取 Q=1,则 Q̄ = NOT(1) = 0,代回第一式 Q = NOT(0) = 1——自洽 ✓。再取 Q=0,则 Q̄ = 1,代回 Q = NOT(1) = 0——同样自洽 ✓。所以这个方程组恰有两个自洽解:Q=1 和 Q=0。「死循环」的恐惧来自「永远算不完」;而这里每绕一圈都回到同一个值,绕一千圈结果不变——绕圈恰恰是它「不变」的原因。用方程的语言说:反馈环不是没完没了的求值,而是一个联立方程组,解出来的两个不动点,就是两种可保持的状态。
那会不会卡在 Q=0.5 这种「中间解」?理想数字模型里不会(只有 0、1 两级),但真实的模拟电路里有一个危险地带:两个非门都工作在高增益的线性区时,「Q 半高不低」在数学上也是一种瞬时平衡——这叫亚稳态(metastable state)。好比一支笔竖立在笔尖上:理论上能立住,一阵微风就倒。上电瞬间,电路可能恰好悬在中间,要靠器件噪声把它「踹」进 0 或 1 的山谷才消停——倒向哪边是随机的。这就是真实系统必须有复位电路(上电时强制把关键触发器压到已知状态)的原因:与其赌运气,不如开机就把所有状态钉在确定值上。航空电子对上电初始化的严格要求,根源就在这里。
📐 例题 2 交叉耦合非门的逐门自洽验证
图 6-1 的环路中,左非门输入 Q̄、输出 Q;右非门输入 Q、输出 Q̄。请分别从 Q=1 和 Q=0 两个假设出发,沿环路走两圈,验证两个状态都自洽;再问:从 Q=0.5(假想的中间值)出发会发生什么?
思路 自洽 = 绕环一圈后回到出发点。对每个假设,依次过两个非门,看回到起点时的值是否与假设一致;中间值要结合真实电路的高增益来讨论。
解 假设一:Q=1 → 右门输出 Q̄ = NOT(1) = 0 → 左门输出 Q = NOT(0) = 1,回到 1 ✓。绕第二圈仍是 1 → 状态保持。
假设二:Q=0 → 右门 Q̄ = 1 → 左门 Q = NOT(1) = 0,回到 0 ✓,同样保持。
假设三:Q=0.5(理想模型不存在,但真实电压可以)→ 若两门都还在放大区,Q̄ ≈ 0.5,再绕回 Q 仍 ≈ 0.5——瞬时平衡。但任何噪声都会被环路放大:0.5 向上偏一点,绕一圈后偏差被放大再放大,几纳秒内就跌进 0 或 1 的山谷,就像竖立的笔一碰就倒。
答:Q=1 与 Q=0 都自洽(这就是「记住了一位」的两个值);中间值是站不稳的亚稳态,最终随机落定,因此真实系统要靠复位电路保证确定的初始值。 ⚠ 易错点:别把「自洽」误读成「振荡」——振荡是值绕圈变化停不下来,自洽是绕圈后值不变,一字之差、天壤之别。
把这个双稳态结构放到物理世界里找类比,最贴切的是山谷里的小球:两个山谷(状态 0 和 1)、中间一道山脊(亚稳态)。小球待在任一谷底都安稳(记忆保持),想换个谷得用力推过山脊(写入操作),推一半撒手它会滚回原谷(抗小扰动),推过了脊线才落进新谷(写入成功)。后面 SR 锁存器的 S/R 端,干的就是「推球过脊」的活。
有趣的是,「双稳态」并不是电的专利,机械世界早就用它存状态:墙上的拨杆开关扳到上是「开」、扳到下是「关」,松手后靠机构自锁在上位或下位——这是一个标准的机械双稳态,不加外力永远停得住,这就是「机械记忆」;而按钮开关松手即回弹,它只有稳态没有保持,什么也记不住。驾驶舱面板上的大量双位拨杆开关(比如设备通断、模式选择),本质上就是一套机械版 SR 锁存器:你拨过去的动作是「写入」,机构自锁是「保持」。把这套直觉平移到电路:非门环是「机构」,S/R 是「拨杆」,Q 是「当前档位」——记忆不神秘,只是把「能停下来的状态」做进了物理结构里。
最后把「反馈」的纪律说清楚,这是个硬规矩:组合逻辑严禁出现反馈环。奇数个非门首尾相连(3 个、5 个……),环路里没有稳定解,信号每绕一圈翻转一次,永不停歇——电路变成一台高频振荡器,输出再无规律可言。有趣的是,工程师后来把这种「毛病」变废为宝:用奇数个门搭环做环形振荡器,数一数振荡频率,就反推出单个门的延迟——芯片测试就是这么量 τ 的。而时序逻辑的反馈之所以不炸,靠的是环路里有能停下来的机制(双稳态);「有控制的反馈」与「失控的振荡」,一线之隔,区别就在环里有没有不动点。
6.3SR 锁存器:最原始的一位记忆
两个非门能「记住」,但你没法改变它。要能写入,需要把非门换成带输入端的或非门,就有了 SR 锁存器(SR latch,S=Set 置位,R=Reset 复位)。
它有两个输入:
- S(Set)= 1:把状态「设成 1」(Q=1)。
- R(Reset)= 1:把状态「清零」(Q=0)。
- S、R 都为 0:保持,维持原状态不变——这就是「记住」。
| S | R | 行为 |
|---|---|---|
| 0 | 0 | 保持原状态(记忆) |
| 1 | 0 | 置位:Q = 1 |
| 0 | 1 | 复位:Q = 0 |
| 1 | 1 | 禁止(状态不确定) |
这张行为表不是凭空规定的,可以从或非门逐门推出来。两个或非门交叉耦合:上门输入 R 与 Q̄、输出 Q;下门输入 S 与 Q、输出 Q̄(或非门:任一输入为 1,输出即为 0)。逐档验证:
- 置位(S=1,R=0):下门被 S=1 强制输出 Q̄ = 0;上门两个输入 R=0、Q̄=0,于是 Q = NOR(0,0) = 1。置位成功 ✓。之后若 S 回到 0,Q=1 继续压着下门,Q̄ 保持 0,Q 保持 1——这就是「写入后保持」的全过程。
- 复位(S=0,R=1):对称地,上门被 R=1 压成 Q=0,下门 NOR(0,0)=1 得 Q̄=1。复位成功 ✓。
- 保持(S=0,R=0):两个门都「没被强压」,输出靠交叉反馈互相锁死——之前是 1 就保持 1,是 0 就保持 0。
- 禁止(S=1,R=1):两个门同时被强压,Q=0 且 Q̄=0——互补关系被破坏(Q 和 Q̄ 应当永远相反)。更糟的是同时撤回 00 时:两个门都想从 0 变 1,谁先翻取决于两个门纳秒级的制造差异——结果不可预测。所以这档被标为「禁止」。
SR 锁存器已经能「记住」了,但它有个别扭之处:两个输入都要管,而且 S=R=1 是非法状态。工程师想要一个更简单、更不易出错的记忆单元——这就是 D 触发器。
📐 例题 3 SR 锁存器波形追踪:五拍操作序列
一个或非门 SR 锁存器,初始状态 Q=0。输入 (S, R) 按时间依次为:(1,0) → (0,0) → (0,1) → (0,0) → (1,0)。请逐拍写出每拍结束时的 Q 值,并说明第 2、4 拍电路在干什么。若最后再补一拍危险的 (1,1) 并随即回到 (0,0),会发生什么?
思路 按行为表逐拍翻译:(1,0) 置位、(0,1) 复位、(0,0) 保持;(1,1) 禁止。每拍看「这一拍的输入」决定「这一拍结束时」的 Q。
解 逐拍推导:
第 1 拍 (1,0):置位 → Q = 1;
第 2 拍 (0,0):保持 → Q = 1(这就是「记住」——写入的 1 被锁住);
第 3 拍 (0,1):复位 → Q = 0;
第 4 拍 (0,0):保持 → Q = 0(同样锁住);
第 5 拍 (1,0):置位 → Q = 1。
五拍结束 Q = 1,序列 Q = 1, 1, 0, 0, 1。
补拍的 (1,1):Q 与 Q̄ 同时被压成 0;随即回到 (0,0) 的瞬间,两个门「赛跑」抢着变 1,谁先谁后由器件偏差决定——Q 可能是 1 也可能是 0,不可预测。
答:Q 依次为 1、1、0、0、1,第 2、4 拍电路在「保持」(记忆的核心档);(1,1) 后立即回 (0,0) 会导致 Q 不确定。 ⚠ 易错点:容易把 (0,0) 误当成「清零」——它恰恰是「保持」;清零是 (0,1)。记忆口诀:哪个端为 1 就执行哪个动作,全 0 才「按兵不动」。
顺带把工程师的第三种语言介绍给你:波形图(时序图,timing diagram)。真值表描述「所有可能的输入组合」,波形图则按时间轴展示信号随拍变化的全过程——横轴是时间,每行一个信号,高高低低画出方波。例题 3 的五拍操作画成波形图,就是两行输入波形加一行 Q 波形:置位脉冲一拉高,Q 跟着变 1,脉冲撤走 Q 依然稳在 1——「写入」「保持」在图上一目了然。芯片手册里的时序图还要在波形上标注建立时间、保持时间等极限参数;读懂数字电路的时序图,和读懂机械图纸的剖面图一样,是行业基本功。
这里补一个实物辨析,读别的教材或芯片手册时你一定会撞见:SR 锁存器还有个「孪生兄弟」——与非门版。把两个交叉耦合的门换成与非门,行为完全「对偶」:因为与非门是「任一输入为 0,输出即为 1」,所以置位/复位变成低电平有效——S̄=0 置位、R̄=0 复位,两输入全 1 时保持,全 0 才是禁止档(正好与或非门版相反)。CMOS 工艺里与非门结构最简单、最省晶体管,所以真实芯片内部多用与非门版,电路图上把输入端画一个小圆圈表示「0 有效」。两个版本行为表对偶、记忆本质完全相同——认出小圆圈,翻译成「低有效」,就不会被手册绕晕。
SR 锁存器在工程里最经典的用途之一是按钮消抖。机械触点闭合时会弹跳几毫秒,直接接组合逻辑会数出「按了七八次」。改用一个双触点按钮:常闭点接 R(一直把锁存器压在 0),按下瞬间常开点接 S(置位)——弹跳期间触点在 S、R 之间来回跳,但每一跳都是「保持」或「置位」,绝不会有第二次翻转:抖动被双稳态「吃」掉了。驾驶舱面板上的灯光告警按一下点亮、确认后复位,用的正是这一手。小小的锁存器,解决了纯组合逻辑永远解决不了的问题——这也正是 6.1 节结论的又一次验证。
6.4D 触发器:时钟同步的记忆单元
D 触发器(D flip-flop,D=Data 数据)是数字电路里最常用的记忆单元。它只有一个数据输入 D,外加一个关键的新东西——时钟(clock,记作 CLK)。
D 触发器的行为极其简单,一句话:在时钟「跳变」的那一瞬间,把 D 的值抄进 Q,并一直保持到下一次跳变。
核心思想:边沿触发 D 触发器不是「随时」响应输入,而是只在时钟的上升沿(从 0 跳到 1 的瞬间)才「拍照」存下 D 的值。其余时间,任凭 D 怎么变,Q 都纹丝不动。这就像「每到整点拍一张照」,把连续变化的世界切成了一帧帧静止的瞬间。
为什么「边沿触发」如此重要?因为它给电路带来秩序:所有触发器都听同一个时钟的号令,在同一个瞬间一起更新,避免了「你变我变、乱成一团」的竞争。这台「节拍器」,是后面 CPU 按部就班工作的基础。
🧠 一句话记忆 D 触发器 = 一个数据口 + 一个时钟口;时钟上升沿一到,就把 D「拍」进 Q。
D 触发器是怎么从 SR 锁存器「长」出来的?一步步看,这是「接口工程」的绝佳范例。SR 锁存器的毛病有两个:要管两个输入、有禁止档。第一刀改造:把 S 端直接接 D,把 D 经一个非门接到 R 端。这样一来 S 和 R 永远恰好相反——要么 (1,0) 置位,要么 (0,1) 复位,禁止档 (1,1) 从物理上被焊死了(D 不可能同时是 0 和 1)。行为表瞬间瘦身成一句话:「D 是什么,Q 就变成什么」。一个非门,消灭了一整类错误操作——用组合逻辑包装时序单元,让非法状态无从发生,这个思路后面还会反复出现。
但这一刀之后还剩一个隐患:S 和 R 什么时候「生效」没有约定,D 线上的毛刺、抖动会随时写坏记忆。第二刀改造就是请进时钟:先看不用时钟、简单加一个「使能门」的版本——电平触发的 D 锁存器:CLK=1 期间输出 Q透明地跟随 D(像导线直通),CLK=0 时保持。它能记住,但「透明」是个大麻烦:在 CLK=1 的整个窗口里,输出就是输入的镜像——如果这个输出经过一段组合逻辑又绕回自己的输入(比如计数器结构「下一拍的新值 = 当前值加一」),窗口期间信号可能穿透组合逻辑再穿回输入,再次触发更新,一个时钟周期内自己写自己好几轮,数据彻底失控。这个故障模式叫「穿透」,它是电平锁存做同步系统的死穴。解决之道:把「窗口」从一整段压扁成一瞬间——只在上升沿开门拍一张照。工程上的经典实现是主从结构:两级锁存器串联,时钟相位恰好相反,主级开窗时从级关闭、主级关门的一瞬从级开门——数据像接力一样一棒传一棒,任凭窗口多长都不可能穿透两级。边沿触发,不是玄学,是两道门闩的接力。
📐 例题 4 D 触发器波形追踪:五个上升沿
一个上升沿触发的 D 触发器,初始 Q=0。时钟共有 5 个上升沿,各上升沿时刻 D 的取值依次为 1、0、1、1、0。此外已知第 2、3 沿之间 D 曾短暂跳到 1 又跳回 0,第 4、5 沿之间 D 曾抖到 0。请写出每个上升沿之后 Q 的值,并判断抖动是否影响结果。
思路 边沿触发的规则只有一条:只在上升沿那一瞬间看 D。两个上升沿之间 D 怎么折腾,一律不管。逐沿抄写即可。
解 沿 1:D=1 → Q=1;沿 2:D=0 → Q=0(此后 D 跳 1 回 0,Q 不理);沿 3:D=1 → Q=1;沿 4:D=1 → Q=1(此后 D 抖到 0,Q 不理);沿 5:D=0 → Q=0。五拍下来 Q 序列 = 1, 0, 1, 1, 0,与各沿时刻的 D 一一对应;两次中间抖动全部被「非沿不理」的规则挡在门外。
用 Python 把「只在沿上抄写」的规则写成循环,模拟这五个沿:
clock_edges = [1, 0, 1, 1, 0] # 每个上升沿时刻 D 上的值
Q = 0
for d in clock_edges:
Q = d # 上升沿一到,把 D 抄进 Q
print(f"沿到:D={d} → Q={Q}")
运行输出五行:沿到:D=1 → Q=1……直到 D=0 → Q=0,与手工追踪一致。
答:Q 依次为 1、0、1、1、0;两次抖动均不影响——边沿触发「只看瞬间」,天然抗窗口内的噪声。 ⚠ 易错点:数上升沿别数成「高电平」——第 1 拍 CLK 变高后一直持续到下个沿,别把「CLK=1 的整段」当成「可以采样的一整段」;触发器眼里只有沿,没有电平段。
真实器件的边沿没有数学上的「一瞬间」那么理想,于是有了两条重要的时序纪律,读芯片手册、做板级设计都会遇到:建立时间(setup time)——数据必须在上升沿到来之前提前稳定一小段时间;保持时间(hold time)——数据在上升沿之后还必须再稳一小段时间。两个窗口都是皮秒到纳秒级,但一旦违反,触发器就可能采到「半截数据」甚至掉进亚稳态。所以高速数字设计的报告里,工程师花大量时间核对的就是这两个参数——记忆单元虽好,喂它的数据要「端稳了再上菜」。
看电路图时再教认一个符号约定:触发器的方框图上,时钟输入脚边画一个小三角,表示「边沿触发」;若是电平触发的锁存器,则不画三角(或用输入名 CLK 直接标注)。同样,输入输出脚上的小圆圈表示「低电平有效」。以后你翻任何一张数字电路图,先看圈和三角,器件脾气就猜得八九不离十——符号是工程师之间的速记,这两个记号是最常用的两个。
把本节的两个词最后对齐一次(呼应前面的名词溯源):latch 与 flip-flop 在中文里常混称「锁存器/触发器」,严格区分是——latch 电平触发(开窗期间透明,适合做缓存的暂存、总线隔离),flip-flop 边沿触发(只在沿上拍一帧,是同步系统的标准记忆单元)。CPU 里的寄存器一律用后者;前面按键消抖那种「不进同步系统」的场合,前者更省。
6.5寄存器:触发器并排成「字」
一个 D 触发器只能存 1 个 bit。要把 8 个、32 个、64 个 bit 一起存起来,只要把相应数量的 D 触发器并排,共用同一个时钟——这样它们就在同一瞬间一起更新。这就是 寄存器(register)。
寄存器是 CPU 的「工作台」:CPU 内部的累加器、指令寄存器、程序计数器,本质都是寄存器。它们暂存正要运算的数据,是运算器和存储器之间的高速中转站。第 8 章讲 CPU 时,你会看到它们如何协同。
🧠 一句话记忆 寄存器 = 一排触发器,一次存一个字。它是 CPU 里最常见的「记忆」。
并排存字只是寄存器最基础的一种组织方式。给同一排触发器补一点「相邻接线」,就长出两个极有用的品种:移位寄存器——把每个触发器的 Q 接到右邻的 D,数据每来一拍就整体挪一位,像生产线上的托盘;计数器——把每位的翻转接到下一位的时钟上,低位每翻满一轮高位才动一格,像里程表的进位齿。别小看这两条接线,串行通信(数据一位一位排队走)和定时/分频(频率逐级减半),全靠它们。
讲计数器之前,先补齐一块拼图——JK 触发器。它是对 SR 锁存器「禁止档」的一次漂亮改造:把 S、R 改名为 J、K,前三档行为照旧(J=1 置位、K=1 复位、全 0 保持),唯独「双 1」这一档被重新定义成翻转(toggle):J=K=1 时,每来一个时钟沿,Q 就翻成相反值。为什么 SR 的死穴到了 JK 手里就活了?关键在边沿触发的配合——时钟沿来的一瞬,Q̄ 的当前值恰好告诉电路「该翻向哪边」,反馈信息现成可用,永远不会像 SR 那样两门抢跑。于是「禁止档」摇身一变成了最实用的功能档,工程师再不用战战兢兢地绕开双 1。
有了 JK,T 触发器就是顺手的事:把 J、K 并联接成一个输入端 T——T=0 时 J=K=0(保持),T=1 时 J=K=1(翻转)。换句话说,T 触发器 = 只用「翻转/保持」两档的 JK,它是造计数器、分频器的最小单元。
计数器里最常用的单元叫 T 触发器(T=Toggle,翻转):T=1 时每逢时钟沿,Q 就翻成相反值(1 变 0、0 变 1)。它的妙处在「翻两次回原点」——一整圈恰好两个时钟周期,于是输出频率正好是时钟的一半。把多个 T 触发器串成链,前一级的 Q 喂后一级的时钟,频率就一路减半、减半、再减半:
📐 例题 5 4 位右移寄存器:逐拍追踪
一个 4 位右移寄存器(新数据从最高位 Q3 进入,整体向低位方向挪,最低位被「挤掉」),初值 Q3Q2Q1Q0 = 1011,串行输入端接下来依次送入 1、0、0、1。请写出每拍之后的 Q3Q2Q1Q0,并问:四拍之后,最初存放在 Q0 的那个 1 去哪了?
思路 右移规则写成算式:每拍 (Q3, Q2, Q1, Q0) ← (Din, Q3, Q2, Q1)。逐拍代换即可。
解 第 1 拍(入 1):Q = 1,1,0,1 = 1101;
第 2 拍(入 0):Q = 0,1,1,0 = 0110;
第 3 拍(入 0):Q = 0,0,1,1 = 0011;
第 4 拍(入 1):Q = 1,0,0,1 = 1001。
最初 Q0 的那个 1,在第 1 拍就被挤出寄存器、消失在「移出端」——移位寄存器不解存旧数据,装的是「最近 4 拍的输入」。
答:四拍后 Q3Q2Q1Q0 = 1001,恰好等于串行输入序列 1,0,0,1 从高位到低位的排列;被移出的旧位不再保留。 ⚠ 易错点:移位方向别搞反——本题「右移」指数据向 Q0 方向挪、新位进 Q3;有的教材定义相反,先看清约定再动笔。
📐 例题 6 分频链:3.5 GHz 降到多少?
某测试仪内部有一个 3.5 GHz 的时钟源,经过一条 4 级 T 触发器分频链(图 6-4 结构)。求末级输出频率;若要降到 1 Hz 量级方便计数,大约还需要几级?
思路 每级二分频:n 级链输出 f/2ⁿ。逐级算清楚再除。
解 4 级:f = 3500 MHz ÷ 2⁴ = 3500 ÷ 16 = 218.75 MHz。若要降到 1 Hz 量级:3500 MHz = 3.5×10⁹ Hz,需要 2ⁿ ≥ 3.5×10⁹;2³² ≈ 4.3×10⁹,2³¹ ≈ 2.1×10⁹,所以 n = 32 级即可把 3.5 GHz 分到约 0.81 Hz——即 32 级输出 f/2³² ≈ 0.81 Hz,32 级满打满算刚好进 1 Hz 量级(下一节 32768 Hz 晶振的经典案例是它的整数友好版)。
答:4 级分频后为 218.75 MHz;降到 1 Hz 量级需 32 级左右。 ⚠ 易错点:分频是除以 2 的幂,不是除以级数——4 级是 ÷16 不是 ÷4;另外「几级」算的是 2ⁿ ≥ 目标倍数里的 n,要用 2 的幂逐次比较。
移位寄存器为什么值得一条生产线?因为它一肩挑起串行与并行的相互翻译:远距离传数据(线缆昂贵、接头易坏)时让 bit 排队单线进出——串行;机器内部处理(一次算 64 位)时要全员并列——并行。串行进来的位流用移位寄存器收满 8 拍,再并行输出给 CPU 一次读走(串入并出);CPU 写好的 8 位数据并行装入,再一位一位排队送上总线(并入串出)。航空数据总线、USB、以太网,凡是「线少路长」的场合全是串行的天下,而每一次串并转换,幕后都是这一排触发器在推位。这个「并行快但费线、串行省线但排队」的取舍,是贯穿计算机体系结构的母题。
6.6时钟信号:数字电路的心跳
把全片所有的 D 触发器都连到同一根时钟线上,让它们步调一致地更新——这个节拍信号,就是数字电路的心跳。
时钟通常由一块石英晶体振荡器产生。石英有一种奇妙的物理性质叫 压电效应:给它电压它会微微变形,去掉电压它又弹回来,这个「机械振动」反过来又会诱发出电信号,形成一个非常稳定的振荡频率。它就像一块「电子节拍器」,每秒振动几十亿次,给 CPU 报时。
📖 名词溯源:为什么叫「时钟」 数字电路里的「时钟」(clock)和墙上的钟同名,不是巧合——它确实在「报时」。每一次「滴答」(一个时钟周期),电路就完成一次状态更新。所谓 CPU 的「主频 3.5 GHz」,意思就是这块石英每秒「滴答」35 亿次。
时钟频率越高,电路每秒能完成的动作就越多——但也不能无限快,因为每个动作都需要一点时间让电信号跑到位(下一章会讲到「时钟周期」和「频率」的关系)。
核心思想 时钟让千亿个触发器同步起舞。它把「连续流动的电」切成「一帧帧离散的状态」,是数字系统「有条不紊」的根源。你电脑里所有井然有序的动作,背后都是这颗石英在打拍子。
🧠 一句话记忆 时钟 = 心跳,触发器 = 听心跳一起动的记忆细胞;频率 = 心跳有多快。
把频率和周期的关系用一个公式钉死,它是本章所有定量计算的钥匙:
📐 例题 7 频率与周期换算三连
(a)3.5 GHz 的 CPU 主频,一个时钟周期多长?(b)2.4 GHz 呢?(c)一块 100 MHz 的老式微控制器呢?另外:某操作固定占用 5 个时钟周期,在 2 GHz 的时钟下需要多少纳秒?
思路 全部套 T = 1/f,注意单位换算:1 GHz = 10⁹ Hz;1 ns = 10⁻⁹ s,所以「Hz 取 10⁹、周期就是 ns」——频率用「十亿」为单位时,周期的单位恰好是纳秒。
解 (a)T = 1/(3.5×10⁹) s = (1/3.5) ns ≈ 0.286 ns。
(b)T = 1/2.4 ns = 0.4167…≈ 0.417 ns(1÷2.4 = 5/12,0.4167 循环)。
(c)T = 1/(100×10⁶) = 0.01 μs = 10 ns。
占 5 个周期:t = 5 × (1/2 ns) = 5 × 0.5 = 2.5 ns(2 GHz 的周期是 0.5 ns)。
答:0.286 ns;0.417 ns;10 ns;5 拍 @ 2 GHz = 2.5 ns。 ⚠ 易错点:GHz 到 ns 是「10⁹ 对 10⁻⁹」,千万别把 1/2.4 算成 0.42 后随手四舍五入丢精度——先约分数(5/12)再化小数,工程报告里保留 3 位有效数字。
现在可以揭晓一个经典数字了:32768。电子表、主板上的实时时钟(RTC)几乎都用 32.768 kHz 的石英晶振——为什么偏偏是这个数?因为它等于 2¹⁵:一块很小的石英按这个频率振动,再接上 15 级 T 触发器分频链(2¹⁵ = 32768),末端经过 15 级分频恰好得到精确的 1 Hz——1 秒一拍、一拍一秒,秒再累计成分、时、日。用 2 的幂当基准,让「分频到整数」变成可能:换任何「漂亮」的数(比如 30000 Hz)都除不出干净的 1 Hz。
📐 例题 8 实时时钟:32768 Hz 是怎么炼成的
某实时时钟模块用 32768 Hz 晶振。(a)验证 32768 = 2¹⁵;(b)需要几级二分频得到 1 Hz?(c)若晶振换成 65536 Hz,几级到 1 Hz?(d)顺带一问:为什么不用 100 kHz 这种「整数」晶振?
思路 二分频链的输出 = f/2ⁿ,令 f/2ⁿ = 1 即 2ⁿ = f。逐次翻倍验证。
解 (a)2¹⁰ = 1024,2¹⁵ = 1024×32 = 32768 ✓。
(b)2ⁿ = 32768 = 2¹⁵ → n = 15 级。
(c)65536 = 2×32768 = 2¹⁶ → 16 级。
(d)100 kHz 除以 2 的任何次幂都不是整数(100000 = 2⁵×3125,3125 是奇数),永远得不到干净的 1 Hz,还得再补一堆分频/计数逻辑——不如直接选 2 的幂当基准,一步到位。
答:32768 = 2¹⁵;15 级到 1 Hz;16 级;选 2 的幂是为了「纯二分频」就能精确到秒。 ⚠ 易错点:分频级数 n 与 2ⁿ 别写反——是 2 的「15 次」幂,不是 32768 级;分解 100000 = 2⁵×3125 时注意 3125 是奇数,除不尽才是「不干净」的原因。
时钟还有一位低调的「安全卫士」角色——看门狗定时器(watchdog timer):它本质就是一个计数器,程序必须周期性地「喂狗」(清零计数);一旦程序跑飞、卡死,忘了喂,计数器溢出就触发复位,系统自动重启。航空电子、工业控制里的看门狗,正是「时序逻辑」在替系统兜底——用最朴素的计数器,守护最要命的可靠性。
最后留一个辨析收尾:是不是所有电路都靠同一根时钟?理论上可以不靠——「异步电路」不用全局时钟,靠握手信号推进,省电但设计极难验证,实践中极少使用。今天的数字系统几乎清一色「同步设计」:一根(或几根)全局时钟统一切拍。但不同器件各有各的时钟(CPU 一根、硬盘一根、总线一根),信号跨时钟域交界时,「A 的沿」可能恰好落在「B 的采样窗中间」——亚稳态再次登场。工程上用「两级触发器同步器」(数据先过两个串接的 D 触发器再使用)来化解。你只需先记住结论:同步域内秩序井然,跨域交接必须设卡——细节留给后续课程。
辨析:时钟偏斜 vs 时钟抖动——同是「时钟不准」,病根不同 读时序报告时这两个词最容易混。偏斜(skew)是空间病:同一个时钟沿经过长短不一的布线,到达不同寄存器的时间不同——寄存器 A 的拍子已经敲响,寄存器 B 的锤子还在路上。它直接吃掉建立/保持时间的余量:发送端与接收端的沿错开多少,数据窗口就被挤掉多少,最坏情况高速设计会因此采错数据。抖动(jitter)是时间病:同一条时钟线上,每个沿相对理想位置的偏移忽早忽晚(噪声、电源波动、温度都在贡献),拍长变得忽长忽短——它同样在压缩建立时间余量,只是来源是「本尊不稳」而非「各地不齐」。一句口诀分清:偏斜是「各地快慢不齐」,抖动是「本尊忽早忽晚」。对策也分两路:治偏斜靠时钟树综合——时钟布线长成一棵尽量对称的树,让每个分支等长、各处同时敲响;治抖动靠锁相环(PLL)滤掉相位噪声、还给系统一颗干净的参考拍。主频越提越高、一拍越缩越窄,偏斜加抖动在拍子里占的比重就越大——这正是下一章主频冲不上去的又一重物理原因。
本章小结
- 计算机需要「记住」中间结果,因此需要时序逻辑(有记忆的电路)。
- 反馈(输出绕回输入)是产生记忆的关键,两个非门交叉耦合即有两个稳定状态。
- SR 锁存器用 S/R 置位复位;D 触发器在时钟上升沿「拍照」存下 D。
- 寄存器 = 多个触发器并排,一次存一个字。
- 时钟(石英压电振荡)让所有触发器同步更新,是数字电路的心跳。
读完本章,你应该能……
- 说出时序逻辑与组合逻辑的本质区别(有无记忆)。
- 解释「反馈」如何让两个非门自锁出两个稳定状态。
- 说出 SR 锁存器 S、R 输入各自的作用。
- 解释 D 触发器「边沿触发」为什么能带来秩序。
- 说清寄存器与时钟信号的原理和作用。
- 从 SR 锁存器推到 D 触发器:说清「非门消禁止态」与「时钟收权」两步改造。
- 用 T = 1/f 完成主频与周期的换算(GHz ↔ ns)。
- 解释 32768 Hz 晶振为什么能纯分频得到精确 1 Hz。
- 描述移位寄存器和 T 触发器分频链的工作方式。
思考题
1. 两个交叉耦合的非门为什么能「记住」状态?它有几个稳定状态?
提示:互相锁住,Q=1/Q̄=0 或 Q=0/Q̄=1,两个稳定状态,不动就不变。
2. SR 锁存器里,S=0、R=0 时电路在做什么?为什么 S=R=1 是禁止的?
提示:S=R=0 是保持(记忆);S=R=1 会冲突、状态不确定。
3. D 触发器为什么只在「时钟上升沿」动作,而不是随时响应?
提示:边沿触发让所有触发器同步更新,避免竞争和混乱。
4. 石英晶体凭什么能「报时」?「CPU 主频」指的是什么?
提示:压电效应产生稳定振荡;主频 = 每秒时钟周期数(心跳次数)。
5. 电平触发的 D 锁存器(CLK=1 期间透明跟随)为什么不适合做同步系统?边沿触发是怎么根治这个问题的?
提示:CLK=1 的窗口期内,输出经组合逻辑绕回输入会造成「穿透」——一个周期里自己写自己好几轮;边沿触发把窗口压成一瞬,主从结构用两级锁存接力实现。
6. 电子表的晶振为什么是 32768 Hz?请用 2 的幂解释它如何精确得到 1 Hz。
提示:32768 = 2¹⁵,15 级 T 触发器分频链(每级 ÷2)末端正好 1 Hz;换非 2 的幂(如 100 kHz)永远除不出干净的 1 Hz。
7. 一个 4 位右移寄存器初值 1011,串行输入依次为 1、0、0、1,四拍之后内容是什么?被移出寄存器的数据去哪了?
提示:逐拍右移得 1101 → 0110 → 0011 → 1001;最初低位的数据逐拍被「挤出」移出端,移位寄存器保存的只是「最近 4 拍的输入」。
8. 把 D 触发器的 Q̄ 端接回自己的 D 端,输出会怎样?三级这样的电路级联、输入 8 MHz 时钟,末级输出频率是多少?
解析:Q̄ 接回 D,每个时钟沿都让触发器读入「当前的相反值」,于是 Q 以时钟频率的一半翻转——一只触发器就是一台 ÷2 分频器。三级级联逐级减半:8 → 4 → 2 → 1 MHz。这也解释了它为什么天然是「1 位计数器」:n 级级联就是模 2n 计数器,第 6 题电子表的 32768 = 2¹⁵ 正是 15 级 ÷2 链。
9. 跨时钟域信号若只经一级触发器采样,亚稳态失败率约 10⁻⁴/次;串上第二级后为什么近似降到 10⁻⁸/次?两级各自扮演什么角色?
解析:第一级照样会亚稳态(概率不变),但它多争取到一整拍的「恢复时间」——按指数规律,电平在这一拍里回到稳定的概率极高;第二级采样时,第一级几乎总是已经稳定。把两次失败近似看成独立事件相乘:(10⁻⁴)² = 10⁻⁸。第一级「趟雷」,第二级「保险」,代价只是信号晚两拍到达——对低速握手信号而言,这笔交易非常划算。