概要: SR 锁存器是最简单的存储元件,但两个输入都为 1 时存在禁止状态。JK 触发器利用内部反馈(、)把 J=K=1 重新定义为翻转,并使用主从时钟结构防止环绕竞争振荡,从而解决这项问题。
加法器、多路复用器等组合电路只根据当前输入产生输出。时序逻辑加入记忆:触发器会跨越时钟周期保持状态。本指南比较两种基础时序元件——SR 锁存器与 JK 触发器,并说明 JK 设计如何消除 SR 的关键缺陷。
组合逻辑与时序逻辑
加法器和多路复用器等组合电路会在传播延迟后,产生由当前输入值决定的输出。物理输入必须始终被驱动到有效电平;“没有输入”不是一种特殊操作,悬空输入在电气上没有确定值。
时序电路增加了一项关键属性:状态。输出不只取决于当前输入,还取决于输入历史,也就是具有记忆。触发器可以处于 Q=0 或 Q=1,并会一直保持,直到明确收到改变命令。这正是计算成为可能的原因:没有状态,就没有寄存器、计数器、程序计数器和 CPU。
SR 锁存器:记忆的起点
SR 锁存器(置位—复位锁存器)是最简单的存储元件,由两个交叉耦合的或非门(或与非门)构成。它有两个输入——S(置位)和 R(复位),以及两个互补输出 Q 和 。

SR 锁存器真值表
| S | R | Q(下一状态) | 动作 |
|---|---|---|---|
| 0 | 0 | Q(不变) | 保持(记忆) |
| 0 | 1 | 0 | 复位(清零) |
| 1 | 0 | 1 | 置位(存入 1) |
| 1 | 1 | ? | 无效(禁止) |
SR 锁存器特征方程
其行为可正式描述为:
约束 是 SR 锁存器的根本弱点:只有 S 与 R 不同时为 1 时,方程才有效。违反约束会产生禁止状态——两个输出都变成 0,释放输入后的最终状态由非确定性的竞争决定。

为什么禁止状态很危险
当 S=R=1 时,两个或非门都被强制输出 0,所以 Q = = 0,形成逻辑矛盾。两个输入同时回到 0 时,两个门都会争先输出 1。胜负取决于纳秒级的传播延迟差异、温度和制造公差。结果不可预测,最坏情况下输出会进入亚稳态,也就是既不是有效 0、也不是有效 1 的中间电压。
JK 触发器:完整解决方案
JK 触发器正面处理 SR 锁存器的禁止状态。它不把 留作未定义,而是将其重新定义为翻转:每个时钟边沿都使输出取反。这一项创新把有缺陷的存储元件变成数字设计中最灵活的触发器之一。

JK 触发器真值表
| J | K | Q(下一状态) | 动作 |
|---|---|---|---|
| 0 | 0 | Q(不变) | 保持 |
| 0 | 1 | 0 | 复位 |
| 1 | 0 | 1 | 置位 |
| 1 | 1 | (取反) | 翻转 |
JK 触发器特征方程
对给定当前状态,反馈让置位与复位请求彼此互斥: 门控 J 项, 门控 K 项,从而消除 SR 的禁止输入组合。但反馈本身并不能防止电平敏感 JK 设计中的环绕竞争;主从或边沿触发时序才会把每次采样事件限制为一次外部可见转换。

主从架构
早期 JK 设计采用电平触发,因而引入环绕竞争条件:如果时钟脉冲保持高电平足够久,翻转后的输出会反馈并在同一个脉冲内再次引起翻转,导致失控振荡。
解决方案是串联两个 SR 锁存器的主从架构:
- 主锁存器: 时钟为高时捕获输入,其输出与从锁存器隔离。
- 从锁存器: 时钟转为低时捕获主锁存器输出,此时外部 Q 输出才真正改变。
由于主、从锁存器从不同时透明,输出每个时钟周期只能改变一次。现代实现使用边沿触发更高效地达到同样效果,但理解主从概念,可以说明 JK 触发器为什么需要时钟,以及它为什么不会发生环绕竞争。
深入理解环绕竞争条件
环绕竞争值得仔细研究,因为它直观说明时钟策略为何如此重要。
在 J=K=1(翻转模式)的简单电平触发 JK 锁存器中,过程如下:
- 时钟变为高电平,输出从 0 翻到 1。
- 新输出 Q=1 反馈到输入门。
- 时钟仍为高,逻辑门看到新状态并再次翻转,Q 从 1 变回 0。
- 只要时钟继续为高,这个循环就会重复。
输出以逻辑门传播延迟决定的频率振荡,本质上变成环形振荡器。时钟下降时最终处于哪个状态,取决于脉宽与门延迟的精确关系,所以行为不确定。
DigiSim.io 使用的边沿触发 JK 触发器会完全消除这项问题。触发器只在时钟转换的瞬间采样 J 与 K。输出改变并反馈时,采样窗口已经关闭。
激励表:用触发器进行设计
设计计数器或状态机等时序电路时,要从期望状态转换反向推导所需输入。此时激励表不可或缺。
SR 锁存器激励表
| (当前) | (期望) | S | R |
|---|---|---|---|
| 0 | 0 | 0 | X |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | X | 0 |
(X = 无关项)
JK 触发器激励表
| (当前) | (期望) | J | K |
|---|---|---|---|
| 0 | 0 | 0 | X |
| 0 | 1 | 1 | X |
| 1 | 0 | X | 1 |
| 1 | 1 | X | 0 |
JK 激励表中有大量无关项。每种转换都有一个无关项;相比之下,SR 表中的无关项更少,而且仍必须执行 约束。这些额外无关项允许在设计驱动触发器的组合逻辑时进行更多布尔化简,是真实设计中减少门数的一项实质优势。
综合比较
| 特性 | SR 锁存器 | JK 触发器 |
|---|---|---|
| 输入 | S(置位)、R(复位) | J、K、时钟 |
| S=R=1 / J=K=1 | 无效(竞争条件) | 翻转(有明确定义) |
| 触发方式 | 电平敏感(异步) | 边沿触发(同步) |
| 是否需要时钟? | 否(基础 SR 锁存器) | 是 |
| 特征方程 | ||
| 禁止状态 | 存在(S=R=1) | 已消除 |
| 激励表中的无关项 | 较少 | 较多(更利于优化) |
| 环绕竞争风险 | 不适用(无时钟) | 由边沿触发消除 |
| 实现规模 | 核心锁存器为两个交叉耦合门 | 取决于实现;主从与边沿触发形式需要额外存储和门控 |
| 主要用途 | 控制状态保持、开关消抖 | 计数器与教学状态机设计 |
| 能否构建其他触发器类型? | 有限 | 可以(通用) |
边沿触发:时钟的作用
现代触发器采用边沿触发,只在时钟转换的精确时刻改变状态。这与随时响应输入的电平敏感 SR 锁存器根本不同。

边沿触发提供三项关键保证:
- 明确的采样事件: 在满足建立与保持约束时,于指定边沿捕获输入。
- 时间过滤: 不与采样窗口重叠的数据毛刺不会被捕获;时钟毛刺与边沿附近的数据变化仍然危险。
- 可组合性: 多个触发器可以共享时钟,并在各自的时钟到 Q 延迟之后更新,从而协调多位状态。
在 SR 与 JK 之间转换
JK 触发器被视为“通用”触发器,可以模拟其他触发器类型。理解这些转换有助于深入掌握两种元件。
从 SR 转换为 JK: 添加反馈 Q 与 的与门:
反馈保证 J=K=1 时,S 与 R 中只有一个有效,具体取决于当前状态。这样既产生翻转行为,又从结构上阻止 SR 禁止状态。
从 JK 转换为 D: 把 D 接到 J,把 接到 K。
从 JK 转换为 T: 把 J 与 K 短接为单一 T 输入。
构建计数器:JK 触发器的代表性应用
当 J=K=1 时,JK 触发器在每个时钟边沿翻转,自然适合作为二进制计数器构件。把四个 JK 触发器串联,让每个 Q 输出驱动下一级时钟,就得到一个从 0000 数到 1111 的 4 位行波计数器。
行波计数器(异步)
在行波计数器中,每个触发器的 Q 输出驱动下一级触发器的时钟输入。每一级触发下一阶段,计数变化沿链路“波动”:
- FF0 在每个系统时钟边沿翻转(频率 = )。
- FF1 在每次 FF0 转换时翻转(频率 = )。
- FF2 在每次 FF1 转换时翻转(频率 = )。
- FF3 在每次 FF2 转换时翻转(频率 = )。
输出 Q3 Q2 Q1 Q0 表示一个每个时钟周期加 1 的 4 位二进制数。代价是每一级都会增加传播延迟,所以高位比低位更晚稳定。每个时钟边沿后的一小段时间内,计数器输出可能显示短暂的错误数值。高速应用中这种行波延迟可能造成问题,因此更常选用所有触发器共用同一时钟的同步计数器。
同步计数器
同步计数器中所有触发器共用系统时钟,每个触发器的 J、K 输入由当前状态的组合逻辑驱动。对于 3 位同步加计数器:
- FF0:J0=K0=1(始终翻转)
- FF1:J1=K1=Q0(仅 Q0=1 时翻转)
- FF2:J2=K2=Q0 Q1(仅 Q0 与 Q1 都为 1 时翻转)
所有级都采样同一个时钟边沿,消除了时钟逐级传播的行波依赖。输出仍有时钟到 Q 延迟,组合使能逻辑也有延迟,不同位不必在完全相同的物理瞬间转换。



设计示例:使用激励表
为展示激励表的实际价值,考虑使用 JK 触发器设计一个简单 2 位计数器,按 0、1、2、3、0、1……循环计数。
第 1 步:状态表。 列出每种组合的当前状态与期望下一状态。
| 当前 Q1 | 当前 Q0 | 下一 Q1 | 下一 Q0 |
|---|---|---|---|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 0 |
第 2 步:应用激励表。 为每个触发器确定所需 J 与 K 输入。
对 FF0(Q0),状态转换依次为 0->1、1->0、0->1、1->0。根据 JK 激励表,所有情况下 J0=1、K0=1。因此 J0=K0=1,FF0 始终翻转。
对 FF1(Q1),状态转换依次为 0->0、0->1、1->1、1->0。使用激励表得到 J1=0/K1=X、J1=1/K1=X、J1=X/K1=0、J1=X/K1=1。通过卡诺图可得 J1=Q0、K1=Q0。
结果: 2 位同步计数器需要 J0=K0=1、J1=K1=Q0。除触发器本身外,不需要额外逻辑门,只需一根从 Q0 连接到 FF1 的 J、K 输入的导线。大量无关项让这次化简非常直接,也体现了选择 JK 而不是 SR 的具体优势。
应用总结
| 应用 | 元件 | 原因 |
|---|---|---|
| 开关消抖 | SR 锁存器 | 简单、不需要时钟,第一个触点动作即可置位 |
| SRAM 概念 | 交叉耦合双稳态反馈 | 高密度 SRAM 通常使用交叉耦合反相器加访问晶体管,而不是封装式 SR 锁存器 |
| 二进制计数器 | JK 触发器 | 翻转模式自然完成计数 |
| 分频器 | JK 或 T 触发器 | 每一级把时钟二分频 |
| 状态机(FSM) | JK 触发器 | 无关项有利于化简逻辑 |
| CPU 寄存器 | D 触发器 | 数据捕获最简单,没有禁止状态 |
| 移位寄存器 | D 触发器 | 在各级之间移动串行数据 |
实践验证
在 DigiSim.io 中尝试以下电路:
- SR 锁存器: 用两个或非门构建并测试全部四种输入组合,仔细观察禁止状态。
- JK 翻转模式: 将 J=K=1 并接入时钟,通过示波器观察 Q 在每个边沿翻转。
- 3 位行波计数器: 串联三个处于翻转模式的 JK 触发器,把 Q 输出连接到示波器并观察二进制计数模式。
- SR 到 JK 转换: 用 SR 锁存器、两个与门和时钟构建 JK 触发器,验证 J=K=1 会产生确定的翻转,而不是禁止状态。
- 激励表练习: 使用 JK 触发器设计模 6 计数器,用激励表推导每个触发器的 J、K 输入逻辑。



