想象一下,你书桌上贴着一张“记忆便利贴”:正面写上1,反面写上0,这就是数字电路里的一个比特。但便利贴不会自己翻面,必须靠某个规则在某个时刻翻动它。数字电路里的触发器,就是这张“带规则的便利贴”,而时钟信号就像教室里的铃声——每响一次,所有便利贴按照约定好的规则更新一次。这篇文章要讲的就是四种便利贴:SR、JK、D、T。它们分别像“双按钮记录仪”“防呆升级版”“拍立得相机”和“旋转翻页门”,各有个性,各有用途。理解它们,你就能读懂CPU里的寄存器、计数器、状态机,看懂数字世界是怎么“记住”信息的。
触发器是数字系统最基础的“记忆细胞”。无论你是做AI算法还是AI硬件,理解SR/JK/D/T触发器的工作原理,是读懂寄存器堆、时钟分频和状态机设计的第一步,也是从“写代码”走向“懂硬件”的必经台阶。
目录
可视化演示
展示SR/JK/D/T四种触发器的真值表、状态转换与时钟波形,交互切换查看各触发器的核心特性指标。
本节配有交互动效(进入视口后自动加载,约 3KB)。
SR触发器:基本RS锁存器 SET(S)和RESET(R)输入控制输出Q和Q\'的置位与复位 S=1且R=1为非法状态两个输出同时为0 Q(next)=S+R\'·Q(curr) SR触发器是所有触发器的基础但存在非法状态限制
基础概念:便利贴、铃声与规则表
想象你书桌上有一张“记忆便利贴”,正面写1,反面写0,这就是一个比特。但便利贴不会自己翻面,必须有人按约定去翻。在数字电路里,触发器就是这张带规则的便利贴,而时钟信号是教室里的铃声——每次铃声一响,便利贴按规则更新一次。如果铃声一直不响,便利贴就安静地保持原样。
数字电路分两类:组合逻辑像菜谱,输入定了输出就定,没有任何记性;时序逻辑则像记账本,输出不仅看当前输入,还看以前记下过什么。触发器是时序逻辑最基本的记忆单元。你后面见到的寄存器、计数器、状态机,都是一片片“便利贴”拼起来的。
触发器有两个稳定状态,我们用 Q 表示当前状态(现态),用 Q^{n+1} 表示铃声响起后进入的新状态(次态)。所有触发器的行为都可以写成一张“翻面规则表”,也就是特性方程。注意,这里的上标 n 和 n+1 表示时钟周期的序号,不是乘方。
所以,任何一种触发器本质上都是一台“指令 + 状态 → 新状态”的机器。接下来,我们逐个认识四种最著名的规则表。
- 现态 Q^n便利贴当前朝上的一面,代表电路此刻记住的数值。
- 次态 Q^{n+1}时钟铃声响起后,便利贴将要变成的新状态。
- 输入 X外界送给触发器的指令集合。SR 有两个输入,D 只有一个。
- 函数 f具体的翻面规则,由触发器内部的逻辑门连接方式决定。
SR触发器:双按钮记录仪的禁忌
最早的“智能便利贴”配了两个按钮:S(Set)和 R(Reset)。按 S,纸片翻到正面(1);按 R,纸片翻到反面(0);两个都不按,保持原样。但说明书上有一条警告:两个按钮同时按是违规操作,后果自负。这就是 SR 触发器给人的第一印象。
SR 触发器通常由两个与非门或两个或非门首尾相接组成。两个输入组合出四种情况:置 1、置 0、保持、禁止。其中“两个同时为 1”会引发两个输出端互相拉扯,最终状态不确定,因此必须用约束条件来禁止。
它的特性方程为:
SR 触发器结构简单,功能直观,但那条“不许同时按”的告诫逼着工程师们设计更聪明的纸片。于是,JK 触发器登场了。
- 置位条件 S=1, R=0代入后 Q^{n+1}=1,纸片无条件翻到正面。
- 复位条件 S=0, R=1\bar{R}=0,结果被归零。
- 保持条件 S=0, R=0Q^{n+1}=Q^n,纸片不动。
- 约束条件 SR=0若 S=R=1,真实电路会同时置 1 和置 0,输出不确定,所以禁止。
JK触发器:防呆升级版
工程师觉得“不能同时按两个按钮”太憋屈,于是把按钮改成两个旋钮 J 和 K:只拧 J 就置 1,只拧 K 就置 0,两个都不拧就保持,两个同时拧就翻面。JK 触发器是 SR 触发器的完美升级:没有禁止态,功能最全。
实际电路里,JK 触发器常用主从结构实现:内部藏着“草稿本”主触发器和“正本”从触发器。高电平期间先把结果写在草稿上,时钟下降沿再把草稿誊到正本,这样能避免在一个时钟周期里输出反复翻转的“空翻”现象。
JK 触发器的特性方程为:
JK = SR + 翻转,既补上了“禁止态”的短板,又保留了完整的功能。它是教科书里功能最全的触发器,也是理解状态机的基础。
- 置位 J=1, K=0结果恒为 1。
- 复位 J=0, K=1结果恒为 0。
- 保持 J=0, K=0原状态原样传递。
- 翻转 J=1, K=1输出等于现态的非。
D触发器:拍立得相机
有时我们不需要两个按钮,只想要一台“拍立得相机”。D 触发器就是这台相机:镜头对着输入 D,快门由时钟控制。快门按下的瞬间,把 D 的模样印在相纸上;拍完以后,光线再怎么变,照片都定格不变。也就是说,D 触发器在时钟有效沿到来时,把输入值“拍”下来保存。
D 触发器只有一个输入,没有任何约束条件,结构在四种触发器里最简单,因此成为现代芯片的绝对主力。CPU 里的寄存器堆、流水线寄存器,几乎全是用 D 触发器搭的。
它的特性方程简洁到极致:
“按下快门那一瞬,留住的是此刻的光线。”D 触发器用最小的代价完成了数据快照,是数字世界里最可靠的拍立得。
- 输入 D要保存的 1 位数据,来自组合逻辑或外部总线。
- 时钟采样上升沿或下降沿到来瞬间,相机的“快门”打开,读取当前 D。
- 输出保持边沿之后的新状态锁定为采样到的 D,直到下一个有效沿。
T触发器:旋转门与翻页器
想象一扇旋转门:转一次,门从“开”变成“闭”,再转一次又变回“开”。T 触发器的输入 T 就是“转不转”的指令:T=1 时,每个时钟脉冲都翻一次;T=0 时,门锁死不动。如果你把 T 永远接 1,就得到一个纯粹的“翻转器”,常记作 T' 触发器。
T 触发器可以由 D 触发器或 JK 触发器改装而成。它的核心价值在于计数:每来一个脉冲,状态变一次。N 个 T 触发器串联起来,就能数到 2^N,非常适合做计数器和分频器。
它的特性方程是异或运算:
旋转门永远是“转一联动一下”,T 触发器是计数器最省心的积木。下次看到时钟分频器,不妨想想那扇旋转门。
- T=0 保持门不转,维持原状态。
- T=1 翻转门转一次,状态取反。
- 异或等价变换从“两路选择”到“异或门”的化简。
- T' 固定翻转T 恒等于 1 时,每个时钟都翻转,等价于分频器。
触发方式:何时记一笔是关键
光有记事本还不够,得规定“哪一刻记账”。有的本子全天开放,只要在开放时间内随时可改,这是电平触发;有的本子只在铃声响起的那个瞬间记账,这是边沿触发;还有更讲究的,先在草稿上写,等铃声落定再誊到正本,这是主从触发。三种方式各有脾气,选错了就会出错。
电平触发在时钟高电平或低电平期间一直响应输入,好处是窗口宽,坏处是容易把信号抖动也照单全收。边沿触发只在上升沿或下降沿的瞬间采样,抗干扰能力强,因此现代芯片普遍采用边沿触发。主从触发由主、从两个触发器组成,先接收后输出,经典代表是主从 JK 触发器。
主从 JK 在 CLK=1 期间,主触发器不断跟随输入变化;CLK 下降沿到来时,从触发器把主触发器的内容锁存到输出。这种结构避免了整个高电平期间输出的“空翻”,但也带来了“一次翻转”现象:在 CLK=1 期间输入多次变化时,只有最后一次能被可靠地送到输出。设计人员需要控制好输入的有效时刻。
触发方式就像记账时“何时下笔”:同样是触发器,采样的时刻不同,结果可能完全不同。写硬件代码时,你关心的 posedge clk 或 negedge clk,正是在表达“选哪种快门”。
典型应用:从便利贴到寄存器与计数器
单张便利贴只能记 1 个 bit,但把 8 张便利贴并排钉在一起,就能记一个字节。这就是寄存器。把旋转门式的 T 触发器串成一串,每扇门每响一次翻一次,就能做出计数器、分频器——记忆纸条由此变成真正的计算工具。
D 触发器最常用来做寄存器,因为它保存数据没有禁忌;T 触发器天生适合计数;JK 触发器在复杂状态机里足够灵活。N 个 D 触发器并排共享时钟,就是 N 位寄存器;N 个 T 触发器级联,上一级输出作为下一级时钟,就构成 N 位二进制异步计数器。
分频电路计算很简单:
一排排记忆纸条各司其职:寄存器存数据、计数器数脉冲、分频器调节奏。数字芯片复杂的时序行为,就这样由简单的便利贴组织起来。
- N 位寄存器N 个 D 触发器共享时钟,同一拍锁存 N 位数据。
- T 触发器级联上级输出作为下级时钟,每级翻转频率减半。
- 分频公式N 级串联后总频率为输入频率除以 2^N。
选型对比:挑一张合适的便利贴
回到文具店,你选哪种便利贴?SR 是复古款,功能直观但要小心“双键同按”;JK 是功能王,什么情况都能应付;D 是销量冠军,简单可靠;T 是计数专用玩具。选哪个,取决于你要把它贴在哪儿。
工程选型没有绝对最优,关键在于面积、功耗和时序安全。现代 ASIC 设计中,绝大多数时序逻辑都用 D 触发器实现,因为综合工具对 D 触发器的时序分析最成熟,面积和功耗也最可控。JK 触发器更多出现在教材和特殊计数器设计中,SR 触发器则只在小型电路里作为学习原型使用。
四种触发器的特性对比非常清晰:
| 类型 | 置 1 | 置 0 | 保持 | 翻转 | 约束 |
|------|------|------|------|------|------|
| SR | S=1 | R=1 | S=R=0 | 不支持 | SR≠1 |
| JK | J=1 | K=1 | J=K=0 | J=K=1 | 无 |
| D | D=1 | D=0 | 不支持 | 不支持 | 无 |
| T | 不支持 | 不支持 | T=0 | T=1 | 无 |
选型建议:做寄存器选 D,做分频计数选 T,做状态机选 JK 或 D,做基础学习从 SR 入门。最稳妥的组合是“D 触发器 + 边沿触发 + 统一时钟”,这几乎是现代数字设计的默认答案。
到这里,四种“记忆便利贴”的性格都清楚了。搭电路时,你就能像挑文具一样,顺手又踏实。
AI 应用场景
场景一:AI 芯片里的寄存器堆
阶段:数据存储与中间结果暂存
解决的问题:AI 模型推理时,每一层的激活值、权重参数都需要在计算单元之间快速搬运。传统方式用组合逻辑直接传递,数据容易丢失且时序混乱;用 D 触发器构成寄存器堆,可以在同一时钟沿将所有中间结果“拍”进存储,稳定供给下一层计算。
具体案例:在 GPU 或 NPU 中,一个 32 位寄存器堆由 32 个 D 触发器并排构成。每个时钟周期,计算单元把卷积结果写入寄存器堆,下一个周期再送到激活函数模块。如果其中任何一个触发器没有按要求锁存数据,整个推理流水线就会出现错误预测。
场景二:AI 加速器的时钟分频
阶段:时钟生成与功耗管理
解决的问题:AI 芯片不同模块需要不同频率的时钟,例如核心计算单元需要高频时钟,而外设接口只需要低频时钟。用软件模拟分频会浪费 CPU 资源;用 T 触发器级联做硬件分频器,则可以稳定高效地产生 2^N 分频时钟。
具体案例:某边缘 AI 芯片的 MCU 主频为 96MHz,需要 1MHz 的 UART 接口时钟。设计人员用 7 级 T 触发器串联实现 128 分频,得到 750kHz 作为接口时钟,再用计数校正得到接近 1MHz 的时钟。整个过程只消耗少量门电路,功耗极低。
场景三:AI 推理控制器的状态机
阶段:控制流调度
解决的问题:AI 推理过程包含“读指令→取数据→计算→写回”等多个阶段,需要状态机来精确切换。用 JK 或 D 触发器实现 FSM,可以在每个时钟沿把当前状态锁存,保证状态转移不混乱。
具体案例:NVIDIA GPU 的指令调度器中,状态机用多个 D 触发器保存当前流水线阶段。当计算单元发出“完成”信号时,触发器在下一个上升沿把状态切换到“写回阶段”,同时清空数据通路。这种设计让 AI 训练可以像流水线一样高效推进。
Python 演示
def sr_next(s, r, q): if s == 1 and r == 0: return 1 if s == 0 and r == 1: return 0 if s == 0 and r == 0: return q return None # 禁止态 def jk_next(j, k, q): if j == 1 and k == 0: return 1 if j == 0 and k == 1: return 0 if j == 1 and k == 1: return 1 - q return q def d_next(d, q): return d def t_next(t, q): return 1 - q if t == 1 else q def run_sequence(name, trigger_fn, input_sequence, num_inputs): print("--- %s ---" % name) q = 0 for item in input_sequence: if num_inputs == 1: inp = (item,) q = trigger_fn(inp[0], q) else: inp = item q = trigger_fn(inp[0], inp[1], q) print("在输入 %s 下,Q -> %d" % (str(inp), q)) print() if __name__ == "__main__": sr_seq = [(1, 0), (0, 0), (0, 1), (1, 1)] jk_seq = [(1, 0), (0, 1), (1, 1), (1, 1)] d_seq = [1, 0, 1, 0] t_seq = [1, 1, 0, 1] run_sequence("SR触发器", sr_next, sr_seq, 2) run_sequence("JK触发器", jk_next, jk_seq, 2) run_sequence("D触发器", d_next, d_seq, 1) run_sequence("T触发器", t_next, t_seq, 1)
if s == 1 and r == 0: return 1SR 触发器的置位规则:S 有效时不管原来是什么都置 1。if s == 0 and r == 1: return 0复位规则:R 有效时无条件置 0。return None # 禁止态当 S=R=1 时,SR 电路输出不确定,用None表示“非法”。if j == 1 and k == 1: return 1 - qJK 触发器最关键的“翻转”逻辑,对应音频里“同时拧两个旋钮就翻面”。def d_next(d, q): return dD 触发器不需要看现态,直接跟随输入。return 1 - q if t == 1 else qT 触发器:T=1 翻面,T=0 保持。if __name__ == "__main__":保证脚本可以直接运行,也能被其他模块导入。
常见误区
误区我看到 D 触发器的特性方程是 Q^{n+1}=D,就觉得既然 D 是 1,Q 就应该立刻变成 1;D 变成 0,Q 也应该立刻变成 0,不然怎么叫“跟随输入”呢?
正解这误解了“跟随”的时机。D 触发器只在时钟有效边沿到达的那一瞬采样输入,之后输出一直保持这个采样值,直到下一个有效沿。可以把 D 触发器想象成拍立得相机:只有快门按下那一刻,画面才被印在相纸上;外界光线再怎么变,照片都不会变。
为何常见:因为初学时看真值表往往只看“输出和输入相等”,忽略了时钟的作用,于是把组合逻辑的“实时跟随”错套到了时序逻辑上。
误区SR 触发器两个输入看起来可以随便组合,S=1、R=1 时只要让两个输出都变成 1 不就行了?我写代码时直接返回 1 就好了。
正解真实电路里,当 S=1、R=1 时,两个与非门或或非门会互相拉扯,最终状态取决于制造工艺和信号到达时间,无法预测。特性方程里虽然会算出 1,但那只是形式推导,实际工程必须把 S=R=1 当作非法输入来禁止。就像红灯和绿灯同时亮的十字路口,交警手册里必须写“不许同时亮”。
为何常见:初学者把真值表当作纯数学表格,忽略了触发器内部反馈环路带来的物理冲突,总以为“按公式算就行”。
误区JK 触发器能置位、能复位、能保持、能翻转,功能最全面,那工程上设计芯片应该全用 JK 触发器,比 D 触发器厉害多了。
正解功能丰富不一定代表工程最优。D 触发器除了功能简单之外,面积更小、功耗更低、时序约束最清晰,综合工具对它的支持也最成熟。现代 ASIC 设计里,寄存器堆和流水线几乎清一色用 D 触发器,而不是功能最全的 JK。挑工具要看场景,不是看参数表上谁的功能多。
为何常见:在教科书对比表里,JK 的“能力范围”看起来最大,容易让人误以为“越全能越好”,忽略了面积、功耗、时序收敛这些工程更看重的指标。
误区只要时钟是高电平,D 触发器就应该一直跟随 D 变化;所以我在一个高电平周期里给 D 变了三次,Q 也应该跟着变三次。
正解电平触发确实在整个有效电平期间都敏感,因此容易把输入抖动也吸收进来;但边沿触发只在电平跳变的那一瞬间采样,其余时间完全不看输入。现代同步电路几乎都用边沿触发。你见过旋转门吗?它只在刷卡的那一瞬转一下,而不是你站在刷卡区整段时间里都转个不停。
为何常见:因为很多教学图里只画了“高电平期间 D=1、Q 变 1”,却没有强调“只有上升沿那一刻采样”,导致大脑自动把它理解成“高电平期间都响应”。
误区主从触发器有“草稿”和“正本”两层保护,应该能把输入端的多次变化都记录下来,怎么会限制为“翻转一次”?
正解主从 JK 触发器在 CLK=1 期间,主触发器持续跟随输入;但到了 CLK 下降沿,从触发器只把主触发器瞬间的值锁存到输出。如果高电平期间输入端发生多次变化,主触发器会一直追,最终下降沿锁存的是最后一次变化,中间的变化全部丢失。这就是“一次翻转”现象的本质——不是只允许翻转一次,而是只有最后有效的那次翻转能被记录。
为何常见:大家容易觉得“多级结构就一定是无懈可击的缓存”,忽略了主从结构本质上还是“在某个瞬间采样”,并没有实现真正的“多次记录”。
面试题
Q1. SR 触发器在哪种输入组合下会进入禁止态?
- A.S=0, R=0
- B.S=0, R=1
- C.S=1, R=0
- D.S=1, R=1← 正确答案
答案:D。S=1、R=1 时,触发器的两个输出会互相拉扯,状态不确定;特性方程虽然能写出 1,但真实电路是矛盾的。其他三种组合分别对应保持、置 0、置 1,都是合法状态。
Q2. D 触发器的特性方程是?
- A.Q^{n+1}=D← 正确答案
- B.Q^{n+1}=\bar{D}
- C.Q^{n+1}=Q^n
- D.Q^{n+1}=\bar{Q^n}
答案:A。D 触发器的行为就是“时钟沿到达时把输入存下来”,所以次态等于输入 D。其余选项分别对应取反、保持、翻转,都不是 D 触发器的定义。
Q3. JK 触发器中,当 J=1 且 K=1 时,时钟有效沿后 Q 的状态会?
- A.保持
- B.置 1
- C.翻转← 正确答案
- D.置 0
答案:C。JK 触发器在 J=K=1 时的行为是“状态翻转”,即 0 变 1、1 变 0。这正好补上了 SR 触发器的禁止态,成为 JK 最显著的特性。
Q4. T 触发器接成 T'(T 恒为 1)后,每个时钟脉冲的作用是?
- A.输出恒为 1
- B.输出恒为 0
- C.输出保持不变
- D.输出状态翻转一次← 正确答案
答案:D。T' 触发器的输入永远是 1,每来一个时钟脉冲,输出就取反一次,相当于二分频器。输出恒为 1 或 0 与 T 触发器的翻转本质不符。
Q5. 主从 JK 触发器的“一次翻转”现象指的是?
- A.CLK=1 期间多次输入变化只有最后一次有效← 正确答案
- B.触发器一生只能翻转一次
- C.输出只能在下降沿翻转一次
- D.输入信号只能变化一次
答案:A。主从 JK 在 CLK=1 期间主触发器不断跟随输入,但下降沿锁存的是最后那一刻的状态,中间的变化不会被记录。所以叫做“一次翻转”——不是硬件限制,而是采样特性。
Q6. 要设计一个 N 位二进制计数器,最省事的触发器选择是?
- A.N 个 D 触发器
- B.N 个 T 触发器← 正确答案
- C.N 个 SR 触发器
- D.一个 JK 触发器
答案:B。T 触发器每来一个脉冲翻转一次,天然适合计数;N 个 T 触发器级联就能数到 2^N。D 触发器需要加额外反馈逻辑才能计数,SR 触发器约束太多,单个 JK 触发器只能构成 1 位计数器。
Q7. 输入时钟为 8MHz,经过 3 级 T 触发器分频后,输出频率是?
- A.2MHz
- B.1MHz← 正确答案
- C.2.67MHz
- D.4MHz
答案:B。每级 T 触发器输出频率除以 2,所以 3 级是 2^3=8 分频,8MHz 除以 8 等于 1MHz。选项中其他值都对应错误的分频系数。
Q8. 关于电平触发与边沿触发,下列说法正确的有?
- A.电平触发在整个有效电平期间都可能响应输入← 正确答案
- B.边沿触发只在跳变瞬间采样← 正确答案
- C.边沿触发的抗干扰能力通常更强← 正确答案
- D.电平触发一定比边沿触发速度快
答案:ABC。电平触发窗口长,容易吸收噪声;边沿触发只在上升沿或下降沿瞬间采样,抗干扰更强。速度快慢取决于具体电路,不能简单说电平触发一定更快,因此 D 错。
Q9. 下列哪些触发器转换关系是成立的?
- A.JK 触发器可以接成 T 触发器← 正确答案
- B.D 触发器可以接成 T 触发器← 正确答案
- C.T 触发器可以接成 D 触发器← 正确答案
- D.SR 触发器可以接成 JK 触发器
答案:ABC。JK 和 D 都可以通过反馈逻辑变成 T 触发器;T 触发器也可以加组合逻辑变成 D 触发器(把 D 和当前 Q 异或后作为 T 输入)。SR 触发器缺少翻转功能,很难直接等价成 JK,因此 D 不成立。
Q10. 在 ASIC 设计中,为什么寄存器阵列大多使用 D 触发器而不是 JK 触发器?
- A.D 触发器面积更小、时序约束简单← 正确答案
- B.JK 触发器不能保存数据
- C.D 触发器不需要时钟
- D.JK 触发器一定更耗电
答案:A。工程上优先考虑面积、功耗和时序收敛。D 触发器结构简单、无约束条件,综合工具支持成熟,所以成为寄存器阵列的主流。JK 功能更全但面积功耗代价更大,且并非“一定更耗电”,B、C 本身也错误。