Note

组合逻辑只看”现在”,时序逻辑(sequential logic)则记得”过去”——输出不仅取决于当前输入,还取决于到达当前状态所经历的那串输入。这种记忆能力是寄存器、计数器乃至整个计算机的根基。本章以多谐振荡器为纲,讲透锁存器与触发器的演进、单稳/无稳电路,最后落到寄存器与计数器两大应用。

24.1 引言:三类多谐振荡器

时序逻辑的积木通常是一类叫多谐振荡器(multivibrator)的电路。它们都有两个互为反相的输出 Q 与 ,因此只有两个可能的输出状态()。按两个状态的”稳定度”分类:

类型状态数行为别名
双稳态(bistable)两个都稳定停在当前状态直到输入触发翻转锁存器/触发器
单稳态(monostable)一稳 + 一亚稳触发后进入亚稳态,定时后自动返回一次触发(one-shot)
无稳态(astable)两个都亚稳在两态间往复振荡数字振荡器

双稳态最重要、用途最广,我们先从它讲起。

24.2 双稳态(Bistables)

24.2.1 S–R 锁存器

把两个反相器接成环(图 24.1),若 则第二个反相器输出 0、又反馈回来维持 ——两个稳定状态,即”再生开关”(regenerative switching)。但它无法被控制,实用价值有限。把反相器换成两输入 NOR 门就得到可控版本:NOR 门一个输入接 0 时相当于反相器,于是 S–R 都为 0 时电路处于记忆模式,保持原状态:

  • R(Reset)置 1(S 保持 0): 被复位为 0, 变 1;R 回 0 后继续记忆;
  • S(Set)置 1(R 保持 0): 被置位为 1;
  • S = R = 1 禁止:两输出同时为 0,不再互为反相,双稳态失效。

这就是 S–R 锁存器(S–R latch)。用两个 NAND 门也能构成,但 NAND 是”一个输入接 1 时相当于反相器”,因此其记忆模式对应两输入都为 1,置位/复位是低电平有效——输入记作 。信号名上有横线(或符号上有小圆圈)即表示低电平有效(active low),反之为高电平有效(active high)。

以高电平有效的 NOR 版为例,把功能整理成表:

SR动作Q
00记忆(保持原态)不变
01复位0
10置位1
11禁止(两输出同 0)

低电平有效的 NAND 版把上表的 0/1 全部反过来读即可: 记忆、 置位、 复位。

Note

从”环”的角度看,S–R 锁存器就是第 22 章正反馈思想的直接产物:两个门的输出互相反馈、互相加强,使电路被”锁”进某个稳定态。需要时用输入打破平衡,不需要时输入归零,电路靠正反馈自己记住状态——这就是记忆的本质。

图 24.1:再生开关电路(两个反相器成环)

图 24.3:S–R 锁存器的两种实现(NOR / NAND)

图 24.5:S–R 锁存器的输入输出波形

看波形图有个技巧:S 已经为 1 时再动 S 无效果(Q 已是 1);R 已为 1 时同理。只有能引起翻转的那次跳变才重要。S–R 锁存器本质上是最简单的电子存储器——记住”哪个输入最后有效”,计算机存储器的基石就在这里。

应用一:开关消抖(debouncing)。机械开关闭合时触点会弹跳几毫秒,逻辑门看到的是一串 0/1 交替,计数器会把一次闭合计成三次。解法:改用单刀双掷(changeover)开关接低电平有效 S–R 锁存器——触点弹跳时电路只在”置位模式”与”记忆模式”之间来回,输出 Q 纹丝不动。

应用二:防盗报警器。门窗传感器开关串联后把 S 输入短接到地(全关闭时),复位开关平时把 R 短接到地。布防时先按一下复位(Q=0,警铃关);任一门窗打开→S 抬高→Q 置 1 报警;即便门窗随后关上,电路锁存在报警态,直到再次打开复位开关才解除——这正是”记忆”的价值。

24.2.2 门控 S–R 锁存器

常需要”只在某些时刻才允许输入生效”。在锁存器前加两个 NAND 门作闸门,第三个输入使能(EN):EN 为低时 恒为高,锁存器被迫处于记忆模式,无视 S、R;EN 为高时电路恢复为普通高电平有效 S–R 锁存器。

24.2.3 D 锁存器(transparent D latch)

把门控 S–R 锁存器的 S、R 换成单个数据输入 D 及其反相,就得到 D 锁存器:

  • EN 高:Q 跟随 D(透明,transparent);
  • EN 低:Q 保持 EN 变低瞬间的 D 值(记忆)。

它就是模拟采样保持门的数字等价物。注意 D 锁存器彻底消灭了”禁止输入”:D 与 永远互补,不可能出现 S、R 同时有效的情况,真值表也简化为只有两行。D 锁存器常成组封装成 4 位(四锁存器)或 8 位(八锁存器)器件,用于存储一个字——这也解释了为何”用 D 型器件存数据”是主流:一个数据输入 + 一个使能/时钟,语义最简单

24.2.4 边沿触发与 D 触发器

要精确控制状态改变的时刻,可以让器件只在时钟(clock)信号的上升沿或下降沿动作——这叫边沿触发(edge-triggered),此类器件习惯称触发器(flip-flop)。上升沿触发的叫正边沿触发,下降沿的叫负边沿触发。S–R 触发器、D 触发器就是对应锁存器的边沿触发版:符号上用三角形表示时钟输入,再加小圆圈表示负边沿触发。

图 24.11:正边沿触发 D 触发器的波形示例

24.2.5 J–K 触发器

J–K 触发器是最常用的双稳态。J、K 两个输入类似 S、R:J=1(K=0)置位、K=1(J=0)复位、都不激活时记忆。区别在于两者同时激活时——S–R 中这是被禁止的模糊态,J–K 中却定义为翻转(toggle):每个触发沿到来时 Q 取反。这一改动让 J–K 无禁止输入、功能最全。功能表(在时钟触发沿采样):

JK触发沿后的动作
00保持(记忆)
01复位 Q=0
10置位 Q=1
11翻转

由于是边沿触发器件,J、K 的取值只在触发沿瞬间有意义——看波形图时要沿着每个时钟沿画虚线、标注该时刻 J、K 的状态和对应动作。

J–K 的万能性还体现在能扮演其他触发器(图 24.13):直接当 S–R 用;J 接 D、K 接 变成 D 触发器;J、K 并接成一个 T 输入就得到 T(翻转)触发器——T=0 时保持,T=1 时每个时钟翻转。

图 24.12:负边沿触发 J–K 触发器(符号与波形)

24.2.6 异步输入

J、K 这类只在时钟沿起作用的输入叫同步输入。许多器件另配异步输入PRESET(预置)CLEAR(清除),可无视时钟直接置 1 或清 0,通常低电平有效。各家厂商命名不一(DC SET/DIRECT SET 等),看数据手册时要留心。它们最常见的用途有三处:系统上电时把计数器/寄存器初始化为已知状态;像 24.8.2 那样做模 N 计数器的提前归零;以及秒表、报警器里由按键直接清零或复位整个电路。注意异步输入”不讲理”——它随时能改写触发器状态,与同步逻辑的节拍无关,用多了会破坏电路的时序设计纪律,应仅用于初始化和复位类场合。

24.2.7 传播延迟与竞争

双稳态由门构成,同样有传播延迟 。考虑两个边沿触发器件共用同一时钟、且前者的输出是后者的输入:时钟沿到来时两者同时响应,若后者足够快,它会在前者输出变化之前锁定旧值;否则锁到新值——结果取决于两者”赛跑”,输出不确定。这就是竞争条件(race condition)。与第 23 章组合逻辑的竞争冒险不同,时序电路里的竞争会污染存储的状态本身,后果更严重。边沿触发器件的设计对策是规定建立/保持时间(setup/hold time):时钟事件前后输入必须各稳定一段时间,把”赛跑窗口”关死在数据手册的时序参数里。

24.2.8 主从(脉冲触发)触发器

另一对策是主从(master/slave)触发器:两个双稳态串联,时钟为高时锁存器接收输入、从锁存器保持;时钟变低时主锁存、从锁存器把主的状态搬到输出。整个器件”时钟高电平期间采样、时钟下降沿更新输出”。主从版本的 S–R、D、J–K 都有,符号上标 并省略时钟三角。电路设计保证主锁存器的延迟大于时钟反相器的延迟,使从锁存器恰在主锁存器使能之前被禁用——彻底避免竞争。

对照三种双稳的符号语言:锁存器的使能端没有三角;边沿触发器在时钟端加三角(负沿再加圈);主从器则不画三角、改标 。看懂符号就能立刻区分器件的响应类型。

Success

三类双稳态一句话:锁存器(latch)电平敏感、边沿触发器(flip-flop)只认时钟沿、主从(master/slave)高电平采样低电平输出。J–K 的杀手锏是 J=K=1 时翻转——没有禁止态。

Warning

别把”锁存器”与”触发器”混为一谈:电平敏感的 D 锁存器在使能期间是透明的,输入抖动会一路穿透到输出;边沿触发 D 触发器只在时钟沿采一次样。要求严格同步的场合(如计数器、移位寄存器)必须用触发器。

24.3 单稳态(Monostables)

在图 24.1 的双稳态上,给其中一个门加上 RC 定时网络,就把一个稳定态变成了亚稳态:触发脉冲 T 到来时 拉低,因电容电压不能突变, 被拉低使 Q 置 1;此后 维持 ,同时电容经 R 充电, 指数上升,达到门的开关电压时电路自动翻回稳态。输出脉冲宽度 由 R、C 和门阈值决定——这就是单稳态触发器(monostable / one-shot):每触发一次输出一个定宽脉冲。

实用中多用专用 IC。按对再次触发的响应分两类:

  • 不可重触发(non-retriggerable):输出脉冲期间忽略新的触发;
  • 可重触发(retriggerable):脉冲期间再触发会延长输出脉冲。

想象一连串密集的触发脉冲:不可重触发型只在第一个脉冲处输出一个定宽脉冲,其余全部忽略,输出是”一进一出”的等宽脉冲;可重触发型则每次触发都重新计时,只要触发间隔短于脉宽,输出就一直保持高——相当于一个”信号在吗”的看门狗。选用哪一种取决于应用:定时/延时用不可重触发,检测信号丢失/按键超时用可重触发更方便。脉宽 通常由外接 R、C 设定,数据手册给出对应公式。

24.4 无稳态(Astable)与定时器

给两个门各加一个 RC 网络(图 24.22),两个状态都成了亚稳态: 充电到阈值→门 2 翻转→ 开始充电→门 1 翻转→循环往复。无需任何输入,电路在两态间持续振荡,Q 与 输出周期性脉冲——数字振荡器。若两边的 ,输出即方波。振荡周期由 RC 值与门阈值共同决定。

图 24.22:简单无稳态电路

无稳态也可用两个单稳态接成环构成:第一个的脉冲后沿触发第二个,第二个的后沿又触发第一个。更通用的器件是集成定时器(如经典的 555),外接一两个无源元件即可配置成单稳或无稳,内部结构不必关心,数据手册即说明书。

24.5/24.6 寄存器(Registers)

存储寄存器:把若干 D 主从触发器并排、共用时钟,就构成一个字长的寄存器。图 24.25 用 4 个 D 触发器做 4 位寄存器;实际产品常是单片 8 位寄存器,可级联加长。位编号从 0(LSB)开始、最高位画在左边,与书写数字的习惯一致。

寄存器承载着计算机里两类完全不同的任务:一类是参与运算的工作区——处理器的累加器(accumulator)就是典型的寄存器,数据读进、运算、写回都经它;另一类是海量存储——现代计算机用成千上万个寄存器阵列保存程序与数据。两类电路的共同点都是”时钟到来时把输入字锁进 D 触发器阵列”。

图 24.25:4 位存储寄存器

24.7 移位寄存器(Shift registers)

把 D 触发器串联、共用移位脉冲(时钟),每个时钟脉冲把整个寄存器内容右移一位,串行输入端的比特依次”涟漪”进来(图 24.28)。4 个移位脉冲后,4 位串行数据就以并行字的形式出现在 上——串并转换。数据从一端进、另一端出,加并联载入逻辑即可做并串转换

具体做法是给每一级加一个数据选择器(二选一,控制信号记作 ,高选 A 低选 B):控制线(移位/载入,shift/load)为高时各级 D 接上一级的 Q(移位模式);为低时接并行输入线(载入模式)。再用类似选择器让每级可从左邻或右邻取数,还能做出双向移位寄存器。注意一个细节:移位时数据从一端进、另一端”漏出”——若只做并串转换而不在乎寄存器旧内容,这些溢出位自然丢弃;若要连续传输,就把最后一级的串行输出接回下一片寄存器的串行输入,级联加长。

图 24.28:简单移位寄存器及其波形

应用:串行通信。发送端移位寄存器并行载入数据、按本地时钟串行移出;接收端另一个移位寄存器接收串行流并还原成并行字。优点是长距离传输只需两根线(数据 + 时钟),而不是每位一根;接收端自行恢复时钟的方案甚至只需一根线(第 26 章详述)。

Success

移位寄存器记法:串联移位 = 串进并出(串并转换);加载数选 = 并进串出(并串转换)。判断移位方向就看每一级的 D 从左邻还是右邻取数。

24.8 计数器(Counters)

计数器既可数事件,也可数时钟”节拍”来计量时间——从石英表到计算机,一切定时与排序应用的底座。

24.8.1 纹波计数器(Ripple counter)

把若干负边沿触发 J–K 触发器的 J、K 都接 1(变成 T 触发器),每级的 Q 接下一级的时钟(图 24.30):每个时钟下降沿 翻转一次,输出频率是时钟的一半; 的下降沿翻转,又是 的一半……所以它同时也是分频器(每级二分频)。

图 24.30:简单纹波计数器

前几个时钟脉冲下各输出的状态一目了然(记 ):

脉冲数
00000
10001
20010
30011
40100
50101

到第 16 个脉冲回到 0000,完成一个模 16 循环——输出位权恰好是 8、4、2、1,与二进制计数完全一致。

把各输出的 0/1 排列起来看: 恰好是所收脉冲数的二进制编码——计数器!由于信号沿触发器链逐级传播、各位依次变化,这种结构叫纹波计数器,也属异步计数器(asynchronous)。4 级电路从 0 数到 15 再归零,即模 16(modulo-16)计数器;n 级即模

读纹波计数器的波形图有个诀窍:沿着每个下降沿从左往右看——时钟的下降沿让 翻转; 的下降沿让 翻转;以此类推。各位翻转时刻并不对齐(这正是”纹波”这个名字的来历),但只要等到最后一级翻完,整个 4 位输出就是正确的二进制计数值。这也解释了为什么读数必须避开”传播中”的时段(见 24.8.5)。

经典应用:数字手表用 32,768 Hz 的晶体振荡器(,正是为了方便分频),接 15 级二分频得到 1 Hz 驱动显示。

24.8.2 模 N 计数器(Modulo-N counters)

级数只能给出 的模,想数到任意 N 就要提前归零:做一个 级计数器(),再加检测电路,数到 N 时把所有触发器清零。模 10 的叫十进制计数器(decade counter),输出 0000–1001 的 BCD 计数器叫 BCD 计数器。检测”数到 10”(二进制 1010)只需一个两输入 NAND 门检测位 1 和位 3 同时为高(注意位从 0 数起)——NAND 输出变低、触发各触发器的 CLEAR、计数器归零、RESET 随即恢复。

图 24.33:十进制计数器电路与波形

Warning

模 N 计数器有个隐蔽细节:检测到 N 后要先短暂进入 N 状态再归零(如十进制计数器会在 1010 上停留纳秒级时间)。若下游电路直接接各级输出,这个毛刺可能被误读;对毛刺敏感的场合应改用同步设计或提前译码(检测 N−1)。

24.8.3/24.8.4 减法与可逆计数器

把后续各级的时钟改从 (而不是 Q)取,同样的电路就变成减法计数器(down counter):数到 0 后回到 15。再借鉴 24.7 的数据选择器,用 up/down 控制线选择每级时钟取自 Q 还是 ,即得可逆(up/down)计数器

应用实例:光电鼠标的增量编码器输出两路相位相差 90° 的方波。左移时信号 1 超前信号 2,右移时相反。把信号 1 接计数器时钟、信号 2 接 up/down 端:观察信号 1 的下降沿上信号 2 的电平即可判别方向——左移计数、右移减数,计数器读数就是绝对位置。

24.8.5 纹波计数器的传播延迟问题

级联触发器的延迟是累加的:n 级纹波计数器要 才能稳定。若在此期间读数,各位新旧混杂、读出乱码;若时钟脉冲快到上一轮还没传完,计数器任何时刻都读不对——这是纹波计数器速度的根本上限。

24.8.6 同步计数器(Synchronous counters)

解法:所有触发器共用同一个时钟,同时翻转。那谁该翻谁不该翻?观察二进制加 1 的规律:

  • :每个时钟都翻 → J=K=1;
  • :当 为高时翻 → J=K=
  • :当 都高时翻 → J=K=
  • :当前三级都高时翻 → J=K=

由于各触发器在时钟沿同时响应,而门控信号由前级输出产生、有天然延迟,恰好保证 J、K 输入在翻转瞬间是稳定的。级数多了与门输入数会爆炸,可改用级联式接法:本级的门控信号 = 上一级门控信号 AND 上一级输出(图 24.39),每级结构相同、可无限扩展。同步计数器同样能做加减、可逆、模 N;代价是电路复杂,换来的是高得多的时钟频率和”时钟后稍等即可安全读数”。

图 24.38:同步四位计数器

Success

同步计数器规则口诀:第 k 位翻不翻,看低 k 位是否全 1 恒翻)。异步 vs 同步:纹波省门但逐级延迟累加,同步费门但全体同时翻转

24.8.7 集成计数器

实际设计直接选用集成计数器:二进制/十进制/BCD、加/减/可逆、4–14 位等规格齐全,多数支持清零与预置,并可级联——纹波式的把最高位当下一级时钟;同步式提供专用级联信号。数字秒表就是典型综合应用:晶振分频出 1 Hz,个位(模 10)+ 十位(模 6)计秒、再计分,各接 BCD→七段译码器;启停用一个 S–R 双稳态门控振荡信号,清零按钮接各计数器的直接复位端。

回看秒表方案里的两个工程细节:其一,用 S–R 锁存器(而非直接按键)产生启/停信号,既消除了开关抖动又让启停状态被”记住”;其二,门控晶振信号带来的最多半周期误差,经 32,768 分频后仅约 30 μs,相对 1 秒的显示分辨率完全可忽略——先估算误差量级,再决定要不要用复杂方案,是工程判断的典型示范。

关键要点

  • 时序逻辑有记忆:输出取决于当前输入与历史次序。
  • 多谐振荡器三类:双稳(两稳态)、单稳(一稳一亚稳,one-shot)、无稳(两亚稳,数字振荡器)。
  • 双稳态分:锁存器(电平敏感)、边沿触发器、脉冲触发(主从)触发器;按功能又分 S–R、D、J–K、T 型。
  • S–R 锁存器 S=R=1 禁止;J–K 用”翻转”化解了这一模糊态。
  • 异步输入(PRESET/CLEAR)不受时钟约束。
  • 传播延迟会引起竞争;边沿触发器件用保持时间、主从结构应对。
  • 寄存器 = 触发器阵列,存储一个字;移位寄存器实现串并/并串转换。
  • 纹波(异步)计数器逐级延迟累加,速度受限;同步计数器共时钟、按”低 k 位全 1 则第 k 位翻转”规则动作。
  • 模 N 计数器 = 计数器 + 数到 N 检测归零。

Warning

三个易错点:把 D 锁存器当 D 触发器用在同步系统里(透明期会漏数据);纹波计数器在翻转过程中读数得到乱码(要等 或改用同步计数器);模 N 检测用多位 AND/NAND 时忘了位编号从 0 开始(10 = 1010,检测的是位 1 和位 3)。