
一、引言为什么数字电路需要记忆能力在学习组合逻辑电路时我们已经熟悉了加法器、译码器、编码器、数据选择器这些经典模块。它们有一个共同特征任意时刻的输出只取决于该时刻的输入电路内部不存在对历史状态的保存。输入一旦变化输出立即跟随变化电路本身没有任何“记忆”。这类电路被称为组合逻辑电路它们解决的是“当下由什么决定”的问题却无法回答“过去发生过什么”的问题。然而现实中的数字系统几乎都离不开记忆。当 CPU 执行加法指令时需要一个地方保存加法的结果当有限状态机在多个状态之间跳转时需要记住当前处于哪一个状态当串行数据逐位到达时需要把前面已经收到的位先存下来。这些需求都指向同一种基本电路单元——触发器。触发器Flip-Flop简称 FF是能够稳定保存一位二进制信息的最基本时序单元也是从组合逻辑走向时序逻辑的关键桥梁。一个触发器能够保存二进制数 0 或 1并且在没有新的控制信号到来之前其输出保持不变。这个看似简单的功能实际上支撑起了整个现代数字系统的地基。寄存器、计数器、移位寄存器、状态机、存储器阵列归根结底都是由大量触发器按一定规则组合而成。可以毫不夸张地说没有触发器就没有今天能够执行复杂程序的处理器。触发器之所以能够记忆本质上是利用了电路中的反馈。把输出信号的一部分送回输入电路就能在多个稳定状态之间自我维持而不是像组合逻辑那样只能被动跟随输入。理解“反馈”和“双稳态”这两个概念是理解一切触发器的基础。本文将从最原始的基本 RS 触发器入手一步一步推导出同步触发器、D 触发器、JK 触发器、T 触发器再深入解析主从结构与边沿触发结构最后系统讲解触发器的逻辑功能转换、动态时序参数以及在实际工程中的应用。全文力求做到概念准确、推导完整、图表充分帮助读者建立起对触发器完整而扎实的认识。二、时序逻辑电路基础2.1 从组合逻辑到时序逻辑数字逻辑电路按照是否具有记忆能力可以分为组合逻辑电路和时序逻辑电路两大类。组合逻辑电路的输出完全由当前输入决定可以用一组布尔表达式直接描述。例如一个二输入与门输出 Y 等于 A 与 B只要知道当前 A 和 B 的值就能唯一确定 Y 的值而无需知道 A、B 之前曾经取过什么值。组合逻辑电路内部不存在存储元件也没有从输出到输入的反馈通路。时序逻辑电路则不同。时序逻辑电路的输出不仅取决于当前输入还取决于电路的历史状态。一个最简单的例子是计数器计数器当前输出的计数值是从上电以来所有时钟脉冲累计的结果。要知道计数器下一时刻输出什么必须知道它当前已经计到了哪里。因此时序逻辑电路中必然包含能够保存状态的存储元件这种存储元件通常是触发器或由触发器构成的寄存器组。时序逻辑电路可以抽象为两个部分组合逻辑部分和存储部分。组合逻辑部分接收外部输入和存储部分反馈回来的现态计算出次态以及对外输出存储部分在时钟信号的控制下把计算得到的次态保存起来供下一个周期使用。这种“现态—次态”的闭环结构使得电路的行为在时间上呈现出递推演化的特征。简单地说组合逻辑解决的问题是“输入是什么、输出就是什么”而时序逻辑解决的问题是“在何时、以何种条件、从当前状态转移到下一状态”。2.2 状态、现态与次态状态是时序逻辑电路中最核心的概念。一个时序电路在某一时刻所处的状态由它的全部存储单元共同决定。对于单个触发器来说它只有一个存储位因此它的状态只有两种要么是 0要么是 1。触发器的状态通常用它的正常输出端 Q 来表示。同时触发器还提供互补输出端 Q读作 Q 非其值与 Q 相反即当 Q 为 1 时 Q 为 0当 Q 为 0 时 Q 为 1。在分析触发器的功能时通常需要区分两个不同时刻的状态。一个是“现态”指在当前控制信号和时钟信号到来之前触发器已经稳定保持的输出值一般记作 Q(n) 或直接写作 Q。另一个是“次态”指在控制信号和时钟信号作用之后触发器将要进入的新输出值一般记作 Q(n1)。触发器的逻辑功能本质上就是描述输入信号、现态 Q(n) 与次态 Q(n1) 三者之间的确定关系。例如对于某一种触发器当输入置位信号有效时无论现态是 0 还是 1次态都必然为 1当输入复位信号有效时次态必然为 0当输入保持信号有效时次态等于现态。把所有这些情况罗列出来就构成了触发器的功能表而用逻辑表达式写出来就得到了触发器的特性方程。功能表和特性方程是描述触发器逻辑功能最常用的两种工具。2.3 双稳态结构与反馈触发器能够记忆状态根源在于它的内部存在一个双稳态结构。双稳态结构最简单的形式就是用两个非门首尾相接构成的反馈环。假设第一个非门的输出是 Q第二个非门的输出是 Q。如果 Q 为 1那么第二个非门输入为 1输出 Q 为 0Q 反馈到第一个非门的输入使第一个非门输出 Q 保持为 1。反之如果 Q 为 0那么 Q 为 1反馈又使 Q 保持为 0。可以看到这个反馈环存在两个自洽的稳定状态一旦电路落入其中任何一个状态便能够长期维持这就是记忆的物理基础。当然单纯的两个非门构成的反馈环没有办法从外部改变状态因此也不具备实用价值。实用的触发器在这个双稳态核心之上增加了输入控制电路使得外部信号能够在特定条件下打破原来的稳定状态把电路切换到另一个稳定状态。输入控制电路通常由与门、或门、与非门、或非门等基本门电路构成。它接收外部输入信号和时钟信号产生对双稳态核心的置位或复位控制从而决定触发器下一步进入哪个状态。一个完整的触发器在结构上可以看作三个层次最内层是双稳态存储核心负责保存状态中间层是输入控制逻辑负责根据外部输入产生对存储核心的驱动信号最外层是输出缓冲它提供 Q 和 Q 两个互补输出并增强驱动能力使触发器能够带动后续的负载。理解这个三层结构有助于我们把各种复杂的触发器原理图化繁为简。三、基本 RS 触发器3.1 RS 触发器的命名与构成RS 触发器是最基本的触发器形式也是学习所有后续触发器的人口。其中 R 是 Reset复位的缩写S 是 Set置位的缩写。顾名思义S 输入负责把触发器置为 1R 输入负责把触发器清为 0。基本 RS 触发器没有时钟控制输入信号一旦有效输出立刻响应因此它是一种异步触发器也常被称为 RS 锁存器。用两个与非门可以实现基本 RS 触发器。把第一个与非门的输出 Q 接到第二个与非门的一个输入端把第二个与非门的输出 Q 又接到第一个与非门的一个输入端形成交叉反馈。剩下的两个自由输入端分别作为 S 输入和 R 输入。这里输入符号带撇表示它们低电平有效。也就是说对于与非门构成的 RS 触发器输入为 0 时才表示该信号有效。分析这个电路的关键在于把握与非门的特性与非门只要有一个输入为 0输出就必然为 1只有当所有输入都为 1 时输出才为 0。下面逐种情况分析。第一种情况S 等于 0、R 等于 1。此时第一个与非门因 S 输入为 0输出 Q 被强制为 1第二个与非门的两个输入是 R 等于 1 和 Q 等于 1因此输出 Q 为 0。触发器被置位为 1。第二种情况S 等于 1、R 等于 0则第二个与非门输出 Q 被强制为 1进而使第一个与非门输出 Q 为 0触发器被复位。第三种情况S 等于 1、R 等于 1两个输入都无效触发器的两个输出保持原来的互补状态不变电路处于保持状态。需要特别警惕的是第四种情况S 和 R 同时为 0。此时两个与非门各有输入为 0于是 Q 和 Q 都被强制为 1。这首先破坏了 Q 与 Q 应当互补的约定。更严重的是如果此时 S 和 R 同时从 0 恢复为 1两个与非门的输出究竟谁先稳定下来将完全取决于两个门的传输延迟差异。由于制造工艺和走线长度不可能完全一致这个结果在实际中无法预先确定可能得到 Q 等于 1也可能得到 Q 等于 0。因此S 和 R 同时有效是一种必须严格避免的非法输入组合。与非门 RS 触发器的约束条件可以表述为S 与 R 不能同时为 0。3.2 或非门构成的 RS 触发器RS 触发器也可以由两个或非门交叉耦合构成。或非门构成的 RS 触发器采用高电平有效输入S 为 1 时置位R 为 1 时复位。当 S 和 R 同时为 0 时保持原状态当 S 为 1、R 为 0 时第一个或非门输出 Q 被强制为 0进而使第二个或非门输出 Q 为 1触发器被置位当 S 为 0、R 为 1 时触发器被复位当 S 和 R 同时为 1 时两个或非门输出都被强制为 0破坏互补关系并且当输入同时回 0 后状态同样无法确定。因此或非门 RS 触发器的约束条件是 S 和 R 不能同时为 1。对比两种实现方式可以看出与非门和或非门构成的双稳态核心在输入有效电平上正好相反。选择哪一种结构取决于控制信号的极性。在实际芯片中引脚名称上带横线或撇号通常就表示低电平有效数据手册中会明确标注。初学者在面包板实验中经常把有效电平搞反导致电路工作异常这一点需要特别留意。3.3 RS 触发器的功能表与特性方程基本 RS 触发器的功能表可以用下表表示。表中 S、R 表示高电平有效形式的输入适用于或非门构成的 RS 触发器对于与非门构成的低有效形式只需把输入取反理解即可。SR现态 Q(n)次态 Q(n1)功能0000保持0011保持01任意0复位清零10任意1置位11任意不定禁止出现由功能表可以写出基本 RS 触发器的特性方程Q(n1) 等于 S 加上 R 乘 Q(n)同时满足约束条件 S 乘 R 等于 0。这个方程的含义是当 S 为 1 时不论现态如何次态直接为 1当 S 为 0 且 R 为 1 时次态被清为 0当 S 和 R 都为 0 时次态等于现态即保持。约束条件 S 乘 R 等于 0 正是禁止 S 和 R 同时为 1 的数学表达。特性方程是连接功能表与电路设计的桥梁。在后续章节中我们会看到每一种触发器都有自己的特性方程比如 D 触发器的 Q(n1) 等于 D、JK 触发器的方程中含有 J、K 与现态的组合、T 触发器的方程则表现为异或关系。熟练掌握这些特性方程是进行时序电路分析和设计的基本功。3.4 基本 RS 触发器波形分析绘制波形图是检验是否真正理解触发器的重要手段。假设一个或非门 RS 触发器的初始状态为 Q 等于 0、Q 等于 1。在某一时刻给 S 端加一个高电平脉冲同时 R 端保持低电平。根据特性方程S 有效后 Q 立即变为 1随后即使 S 脉冲结束回到 0由于 R 仍为 0触发器进入保持状态Q 维持为 1不会回落。过一段时间后再给 R 端一个高电平脉冲同时 S 保持 0此时 Q 被清为 0之后同样保持。从波形中可以看到两个重要特征第一输入脉冲结束后输出并不会自动改变而是保持在被置位或被复位的状态这正是记忆能力的体现第二如果波形中出现了 S 和 R 同时为 1 的时段那么从这一刻起之后的输出状态就不可预测了绘制波形时应在该处标注“不定”。这提醒设计者在使用 RS 触发器时必须通过外部逻辑保证 S 和 R 不会同时有效。基本 RS 触发器虽然结构简单但它在工程上并非只有教学意义。它可以直接用作按键消抖电路的核心、手动复位电路、开关去抖电路等。由于它不受时钟控制响应速度很快适合那些不需要同步、只需要一个简单的二值记忆的场景。当然其异步特性也带来了难以统一调度的缺点这正引出了下一章同步触发器的设计动机。四、同步触发器引入时钟信号4.1 基本 RS 触发器的局限基本 RS 触发器存在一个明显缺陷输入端的变化会随时直接影响输出。对于一个单独的触发器来说这未必是坏事但在一个包含大量触发器的系统中如果每个触发器都随时响应输入系统就很难保证所有触发器在统一的节拍下同时动作。设想一个 8 位寄存器如果每一位输入到达的时间有早有晚那么这 8 个触发器就会先后翻转中间出现一段乱码状态。若后续电路在此期间读取寄存器就会得到错误数据。要解决这个问题就必须给触发器增加一个时间基准让所有触发器在同一个控制信号下统一动作。这个统一的时间基准就是时钟信号。时钟信号Clock常记作 CP、CLK是一个周期性跳变的方波或近似方波信号它在整个系统中同步地为所有时序元件定节拍。引入时钟后触发器只有在时钟允许的时刻才能根据输入更新状态时钟不允许时无论输入怎样变化触发器都保持原状态不变。这样全系统的触发器就可以像阅兵方阵一样在同一口令下同时迈步。4.2 同步 RS 触发器的结构同步 RS 触发器又称钟控 RS 触发器是在基本 RS 触发器的基础上改造而成的。其思路很简单在 S 输入端和 R 输入端之前各加一个与门两个与门共同受时钟 CP 控制。具体来说S 与 CP 做与运算后送到基本 RS 触发器的置位端R 与 CP 做与运算后送到复位端。这样只有当 CP 等于 1 时S 和 R 的值才能通过与门传入内部当 CP 等于 0 时两个与门输出都被封锁为 0内部基本 RS 触发器的两个有效输入都无效状态保持不变。同步 RS 触发器的工作规律可以概括为当 CP 等于 0 时无条件保持当 CP 等于 1 时按照 RS 组合执行置位、复位或保持。它的逻辑功能与基本 RS 触发器相同只是多了一层时钟门控。约束条件依然是 S 和 R 不能在 CP 有效期间同时为 1否则在 CP 有效期间输出仍然会出现不确定的竞争冒险。同步 RS 触发器还带出了一个新的观察维度触发方式。它属于电平触发在 CP 高电平的整个持续时间内输入都是有效的输出都可以被改变。这与后面即将学习的边沿触发形成鲜明对比。4.3 空翻问题及其危害同步 RS 触发器虽然解决了统一节拍的问题却又引入了一个新的严重问题这就是空翻。所谓空翻是指在一个时钟有效电平期间触发器的输出发生了不止一次的翻转。造成空翻的原因主要有两类。第一类是输入信号在高电平期间多次变化每变化一次都可能使输出跟着变化一次。第二类是输出状态的变化反过来影响输入控制逻辑形成内部反馈使得触发器在一个时钟周期内连续翻转。空翻的危害非常直接。一个理想触发器应当在每个时钟周期最多更新一次状态这是时序电路可靠工作的基本前提。如果触发器的输出在一个周期内多次跳变后续电路便无法判断数据究竟何时有效计数器和移位寄存器的功能也会完全混乱。空翻实际上暴露了电平触发的固有矛盾只要门是打开的噪声和反馈就可能反复进出。解决空翻有两条路径一条是主从结构用两级触发器错开采样和输出另一条是边沿触发把采样窗口压缩到时钟跳变的那一瞬间。五、D 触发器5.1 从 RS 触发器到 D 触发器RS 触发器有两个数据输入端使用时必须时刻留意约束条件稍不谨慎就可能进入不确定状态。工程上更受欢迎的做法是彻底消除非法输入让使用者无需为输入组合担心。D 触发器正是为了满足这一需求而设计的。D 触发器只有一个数据输入端 D其中 D 是 Data数据或 Delay延迟的缩写。它的逻辑十分简单在时钟有效时输出 Q 跟随输入 D用公式表达就是 Q(n1) 等于 D。D 触发器可以直接从同步 RS 触发器改造而来。做法是在输入端增加一个反相器让同一个数据输入 D 一路直接送到 S 端另一路经过反相后送到 R 端。当 D 等于 1 时S 为 1、R 为 0触发器置位当 D 等于 0 时S 为 0、R 为 1触发器复位。由于 S 和 R 永远互为反相二者不可能同时为 1非法组合被从结构上根除了。这也是 D 触发器被称为“无约束触发器”的原因。D 触发器的功能表非常简洁在时钟有效沿如果 D 为 0 则次态为 0如果 D 为 1 则次态为 1在时钟无效期间保持。与 RS 触发器和 JK 触发器相比D 触发器的输入自由度较小但换来的是极高的可靠性和使用简便性这使得它成为现代数字集成电路中应用最多的触发器类型。5.2 锁存器与触发器的概念辨析在学习 D 触发器时初学者经常会遇到 D 锁存器和 D 触发器这两个容易混淆的概念。严格来说D 锁存器是电平敏感的当使能端有效如高电平时输出透明跟随输入 D 变化当使能端无效时输出锁存保持之前的值。D 锁存器可以被称为电平触发的 D 触发器。而通常所说的 D 触发器若不特别说明往往指边沿触发的 D 触发器它只在时钟跳变边沿极短的时间内采样输入并更新输出其余时间保持稳定。两者在使用上的区别十分显著。电平触发的锁存器在使能有效期间是“透明”的输入端一个毛刺就可能直接传到输出端而边沿触发器只在边沿前后很窄的窗口内关心输入对电平期间的干扰不敏感。因此在同步时序设计中优先使用边沿触发器。锁存器在少数特定场合仍有价值例如用于总线数据的暂时保持、时钟门控单元以及某些低功耗设计中的锁存结构。但在通用寄存器、状态机等场合使用边沿 D 触发器是更稳妥的选择。5.3 边沿 D 触发器的功能表与特性方程一个典型上升沿触发的 D 触发器其行为可以描述如下在时钟上升沿到来之前的建立时间内输入 D 需要保持稳定在上升沿到来的瞬间触发器把 D 的值采样并锁存到内部从这次上升沿之后到下一次上升沿之前无论 D 怎样变化输出 Q 都不再改变。因此 D 触发器的特性方程为 Q(n1) 等于 D。时钟事件输入 D次态 Q(n1)功能说明上升沿00采样到 0 并输出上升沿11采样到 1 并输出非上升沿任意保持输出不变D 触发器的特性方程 Q(n1) D 是全部触发器中最简单的一个。它不需要现态参与也不存在约束条件这给电路设计带来了极大便利。在状态机设计中如果我们已经求得次态表达式就可以直接把次态表达式接到 D 输入端从而用一个 D 触发器实现对应的状态存储。这种“次态即输入”的直观关系正是 D 触发器在现代数字系统中占据主导地位的重要原因。5.4 D 触发器的 Verilog 描述下面使用 Verilog 描述一个带异步复位端的上升沿 D 触发器。异步复位表示复位信号不依赖时钟边沿一旦有效就立即清除输出。module dff_async_reset ( input wire clk, // 时钟信号 input wire rst_n, // 低有效异步复位 input wire d, // 数据输入 output reg q // 数据输出 ); always (posedge clk or negedge rst_n) begin if (!rst_n) q 1b0; // 异步复位优先 else q d; // 上升沿采样 D end endmodule这段代码中敏感列表包含时钟上升沿 posedge clk 和复位下降沿 negedge rst_n。当 rst_n 为低电平时不管时钟处于什么状态输出都被清零当 rst_n 无效时在每个时钟上升沿把输入 d 的非阻塞赋值到输出 q。非阻塞赋值符 是时序逻辑描述的规范写法它能保证仿真行为与真实寄存器的边沿采样行为一致。这段代码所描述的电路行为与前述边沿 D 触发器的逻辑完全对应。5.5 二分频与 D 触发器的基本应用把 D 触发器的 Q 输出端反馈接到它自己的 D 输入端可以构成一个二分频器。假设初始 Q 为 0此时 Q 为 1D 亦为 1第一个时钟上升沿到来时Q 采样到 1输出翻转为 1此时 Q 变成 0D 也变成 0第二个时钟上升沿到来时Q 采样到 0输出又翻回 0。如此反复输出 Q 每两个时钟周期完成一次完整翻转其频率恰好为时钟频率的一半。这个简单电路是构建异步计数器的基础模块也是理解 T 触发器的直观入口。六、JK 触发器6.1 JK 触发器的设计动机D 触发器虽然彻底消除了约束条件但它在功能上也付出了代价一个数据位只能表达“赋 0”或“赋 1”无法直接表达保持和翻转这些更高层的操作。在状态机设计中有时我们希望触发器保持当前值不变有时希望它在条件满足时翻转这些需求用 D 触发器虽然也能间接实现但需要额外的组合逻辑配合不够直接。JK 触发器就是为了提供一套完整而直接的触发功能而设计的。JK 触发器有两个输入端 J 和 K其功能恰好覆盖了保持、置位、复位、翻转四种基本操作。它在 RS 触发器的基础上引入了输出到输入的反馈使得原本在 RS 触发器中禁止出现的“两个输入同时有效”组合在这里被赋予了翻转的语义。这样JK 触发器就成为一种功能完备的触发器学术界常称其为全功能触发器因为其他任何类型的触发器都可以由 JK 触发器加少许外部连线转换而来。6.2 JK 触发器的功能表JK 触发器的逻辑规则如下。当 J 等于 0、K 等于 0 时无论现态为 0 还是 1次态都等于现态即保持。当 J 等于 0、K 等于 1 时无论现态如何次态被清为 0即复位。当 J 等于 1、K 等于 0 时次态被置为 1即置位。当 J 等于 1、K 等于 1 时次态等于现态的取反即翻转。完整功能表如下JK现态 Q(n)次态 Q(n1)功能0000保持0011保持0100清零0110清零1001置 11011置 11101翻转1110翻转可以看到JK 触发器的四种输入组合都没有被浪费每一种都对应一个确定的功能不存在非法状态。这比 RS 触发器完整比 D 触发器灵活是它在教学和中小规模逻辑设计中长期占据重要地位的原因。6.3 特性方程与激励表由功能表可以推导出 JK 触发器的特性方程Q(n1) 等于 J 乘 Q(n) 加上 K 乘 Q(n)。这个方程可以从直观上理解。当 J 为 1 时第一项 J 乘 Q(n) 表示只要现态为 0就可以把次态推到 1当 K 为 1 时第二项 K 乘 Q(n) 中的 K 为 0说明只要现态为 1次态就被拉向 0当 J 和 K 同时为 1 时现态为 0 则由第一项得 1现态为 1 则由第二项得 0表现为翻转当 J 和 K 同时为 0 时次态等于现态保持成立。在时序电路设计中正问题是由输入求次态特性方程已经给出答案。但很多时候我们需要解反问题为了实现从某个现态到指定次态的跳变输入端 J 和 K 应当取什么值。描述这种反问题对应关系的表格就是激励表。JK 触发器的激励表如下现态 Q(n)次态 Q(n1)JK000x011x10x111x0表中 x 表示无关项即该输入取 0 或 1 都不影响结果。例如要把现态 0 保持在 0只需让 J 为 0K 任意K 取 0 时是保持K 取 1 时也是清零都能得到次态 0。这种无关项的存在为逻辑化简提供了额外自由度设计者可以选择使逻辑表达式最简的取值从而减少门电路数量。这也正是 JK 触发器在传统状态机设计中备受青睐的原因之一。6.4 JK 触发器的 Verilog 描述下面给出一个带同步复位端的 JK 触发器行为描述。同步复位表示复位信号只在时钟边沿到来时才被采样执行。module jkff_sync_reset ( input wire clk, input wire rst_n, // 低有效同步复位 input wire j, input wire k, output reg q ); always (posedge clk) begin if (!rst_n) q 1b0; else if (j k) q ~q; // J1,K1 翻转 else if (j) q 1b1; // J1,K0 置位 else if (k) q 1b0; // J0,K1 清零 else q q; // J0,K0 保持 end endmodule代码中的 是逻辑与运算符表示 J 和 K 同时为高电平时执行翻转分支。在代码块中小于号、大于号和与符号均按 HTML 规范进行了转义。这段行为描述与功能表完全吻合复位优先级最高其次依次判断翻转、置位、清零最后默认保持。掌握这种用硬件描述语言表达触发器功能的方法对于后续把状态机设计转化为可仿真、可综合的代码非常有用。七、T 触发器与 T 触发器7.1 T 触发器的功能T 触发器是 Toggle翻转触发器的缩写它只有一个控制输入 T。当 T 等于 0 时输出保持当 T 等于 1 时每个有效时钟沿到来输出翻转一次。T 触发器的特性方程为 Q(n1) 等于 T 异或 Q(n)。当 T 为 0 时异或结果等于现态保持当 T 为 1 时异或结果等于现态的取反翻转。可以看出T 触发器相当于 JK 触发器在 J 等于 K 条件下的特例把 JK 触发器的 J 端和 K 端接在一起作为 T当 T 为 1 时 J 和 K 同时为 1执行翻转当 T 为 0 时 J 和 K 同时为 0执行保持。T 触发器的功能表如下T现态 Q(n)次态 Q(n1)功能000保持011保持101翻转110翻转7.2 T 触发器与计数功能如果 T 触发器固定接成 T 等于 1即控制端始终有效那么触发器在每个有效时钟边沿都会无条件翻转一次。这种固定翻转的触发器称为 T 触发器也常被称为计数触发器。一个 T 触发器的输出频率恰好是输入时钟频率的一半因此它是天然的二分之一分频器。T 触发器可以由 D 触发器把 Q 反馈到 D 端实现也可以由 JK 触发器把 J 和 K 都接高电平实现。回顾前面 D 触发器二分频电路的例子其实那就是一个由 D 触发器实现的 T 触发器。把多个 T 触发器级联前一级的输出作为后一级的时钟就可以得到多位异步二进制计数器。每一级都把频率减半整体输出自然按照二进制规律递增从而完成计数功能。这种结构简单直观是理解计数器原理的最佳模型。八、主从触发器8.1 主从结构的提出同步触发器在时钟高电平期间存在空翻问题直接影响系统的可靠性。主从触发器的设计目标是将输入采样和输出更新两个动作在时间上分开从而保证输出在一个时钟周期内最多变化一次。它采用两级触发器串联的结构第一级称为主触发器第二级称为从触发器。在一个时钟电平期间由主触发器负责采样输入在另一个时钟电平期间再把主触发器的状态传递给从触发器输出。由于从触发器在整个采样期间始终保持原输出不变只有到传递时刻才更新输出端的空翻就被消除了。8.2 主从 JK 触发器的工作过程以主从 JK 触发器为例。当 CP 等于 1 时主触发器打开接收 J、K 输入并更新其内部状态此时从触发器被封锁输出 Q 保持不变。当 CP 由 1 跳变到 0 时主触发器被封锁从触发器打开把主触发器的状态传递到输出 Q。因此主从 JK 触发器在 CP 下降沿完成状态的最终更新整个时钟周期内输出只在下降沿变化一次。需要指出的是主从结构并没有完全消除输入在采样期间变化的影响。在 CP 等于 1 的高电平期间主触发器是透明的J、K 输入的变化仍然会改变主触发器的状态。特别是主从 JK 触发器存在所谓的“一次变化”问题当主触发器在某个时钟高电平期间已经发生过一次状态翻转后由于反馈的存在即使 J、K 随后恢复主触发器的状态也可能无法再回到原来的状态从而在下降沿传递时输出错误结果。因此使用主从 JK 触发器时通常要求 J、K 输入在 CP 等于 1 的整个期间保持稳定。这一问题在教材中常被作为主从结构的典型缺陷来分析。8.3 主从结构与边沿结构的比较主从触发器把采样和输出分到时钟的两个电平相位实现了输出每周期最多更新一次这是对同步触发器的重要改进在 TTL 中小规模集成电路时代曾大量使用。但它仍有两个不足一是抗干扰能力有限主触发器在整个采样电平期间都可能受输入变化的影响二是内部两级串联带来较大的传输延迟限制了工作速度。边沿触发器则直接在时钟跳变的极短瞬间完成采样对电平期间的大部分干扰不敏感结构也相对紧凑。因此在高速与高可靠应用中边沿触发结构逐渐取代主从结构成为现代集成触发器的主流。九、边沿触发器9.1 边沿触发的基本思想边沿触发器的核心思想非常简洁把采样窗口压缩到时钟信号跳变的那一极短瞬间。它利用时钟跳变时电路内部门延迟的微小差异构造出一个宽度极窄的采样脉冲。触发器只在这个窄脉冲存在的瞬间读取输入其余时间输入通路被封锁输入的任何变化都无法影响输出。这样一来每个时钟周期输出最多变化一次同时电平期间的干扰也被挡在门外。实现边沿触发的方式有多种。一种是维持阻塞结构它通过内部的反馈封锁线在时钟上升沿建立之后立即切断输入通路保证边沿之后输入不再影响输出。另一种是利用传输延迟的边沿检测结构通过几级门的延迟差在时钟边沿生成一个短暂的有效脉冲。无论具体实现如何其目标都是一致的让触发器只在边沿时刻采样一次。9.2 上升沿触发与下降沿触发按采样边沿的不同边沿触发器分为上升沿触发和下降沿触发两类。上升沿触发器在时钟从 0 跳变到 1 的瞬间采样输入下降沿触发器在时钟从 1 跳变到 0 的瞬间采样。在电路符号上边沿触发通常用时钟输入端的小三角表示三角处带小圆圈表示下降沿触发不带圆圈表示上升沿触发。这一点在阅读芯片手册和原理图时非常重要。在系统设计中通常会尽量统一所有触发器的触发边沿使所有寄存器在同一个边沿更新便于建立统一的时序模型。但有时也会在前后级之间故意使用相反的触发边沿把两级寄存器的更新时间错开半个周期从而给中间的组合逻辑留出更充裕的传播时间缓解时序压力。这种技巧在高速流水线设计中并不少见但使用时需要精确的时序分析作为支撑。9.3 边沿 D 触发器的芯片实例边沿 D 触发器在标准逻辑芯片中随处可见。74LS74 是一款经典的双 D 触发器芯片内部包含两个相互独立的上升沿触发 D 触发器每个触发器都带有异步置位端 pre 和异步清零端 clr。当 clr 为低电平时无论时钟和 D 是什么输出立即清 0当 pre 为低电平时输出立即置 1。这两个异步控制端优先级最高主要用于上电初始化和故障复位。当两个异步端都无效时触发器在时钟上升沿把 D 采样到 Q。除 74LS74 外74LS273 是带公共清零端的八位上升沿 D 触发器常用于总线数据寄存74LS374 是带三态输出的八位 D 触发器适合直接驱动总线74LS175 是四位 D 触发器。这些芯片内部都是边沿触发结构其广泛应用充分体现了边沿 D 触发器在现代数字电路中的主导地位。十、集成触发器的实际使用10.1 常用触发器芯片概览集成触发器芯片种类繁多按逻辑功能可分为 D 型、JK 型按位数可分为单触发器、双触发器、四触发器、八触发器。下表列出了几种常见的 74 系列触发器芯片供实验和设计参考。芯片型号功能描述触发方式典型特点74LS74双 D 触发器上升沿带异步置位、清零74LS112双 JK 触发器下降沿带异步置位、清零74LS76双 JK 触发器下降沿教学过程常用74LS273八 D 触发器上升沿带公共清零总线寄存器74LS374八 D 触发器上升沿三态输出可直接接总线74LS175四 D 触发器上升沿带公共清零10.2 引脚与异步控制端以 74LS74 为例每个 D 触发器除了电源、地之外通常包含 D 输入、时钟 CP、输出 Q 和 Q以及异步置位端 pre 和异步清零端 clr。异步端名称上的撇号表示低电平有效。在正常数据操作期间pre 和 clr 都应保持高电平使触发器按照时钟和 D 的规则工作。当需要初始化时可以通过给 clr 一个短暂低脉冲把所有触发器清零或通过 pre 把输出置 1。初学者在实验中遇到触发器“不翻转”“状态混乱”等问题很大一部分原因是异步控制端悬空。对于低电平有效的异步端悬空在直流上近似等于高电平通常不会触发复位但悬空引脚容易受噪声干扰导致偶发误动作。因此不使用的异步控制端应当通过上拉电阻接到电源或直接接到无效电平以保证可靠工作。10.3 位宽扩展与寄存器单个触发器只能保存一位数据而实际系统往往需要一次保存 8 位、16 位甚至 32 位数据。把多个触发器并列起来共用同一个时钟信号就构成多位寄存器。以 8 位寄存器为例把 8 个 D 触发器的数据输入分别接到数据总线的 8 条线上所有时钟端并联当时钟上升沿到来时8 个触发器同时采样各自的数据位完成一次并行写入。写入之后即使数据总线切换给其他设备寄存器仍然稳定保持这 8 位数据。位宽扩展的关键在于时钟的同步性和驱动能力。当时钟需要同时驱动大量触发器时时钟负载电容增大可能造成时钟边沿变缓影响建立时间和保持时间。在高位宽寄存器设计中通常需要加入时钟缓冲、时钟树设计等手段保证时钟信号到达各触发器的时间偏差足够小。十一、触发器逻辑功能的转换11.1 转换的意义与一般方法在实际工程中库存里可能只有一种触发器而设计需要另一种触发器功能。例如设计中需要 T 翻转功能但手头只有 D 触发器或者需要 JK 触发器的完整功能但现成的只有 D 型芯片。此时不必更换器件只需在现有触发器输入端增加少量组合逻辑就可以实现所需功能。这种在不同类型触发器之间进行功能转换的能力是数字电路设计者应当掌握的基本技能。触发器功能转换的一般方法是先写出目标触发器的特性方程再结合现有触发器的输入特性反推出应当在现有触发器输入端施加什么样的逻辑表达式。若以 D 触发器为目标实现的基础由于 D 触发器的次态直接等于 D转换特别简单只需令 D 等于目标特性的次态表达式即可。若以 JK 触发器为基础则需要利用目标状态跳变反查激励表得到 J、K 的取值再借助无关项化简。下面分别举例说明。11.2 D 触发器转 T 触发器T 触发器的特性方程是 Q(n1) 等于 T 异或 Q(n)。要在 D 触发器上实现这个功能只需令 D 等于 T 异或 Q(n)。用一个异或门把 T 输入和触发器的现态 Q 作为异或门的两个输入把异或门的输出接到 D 端即可。当 T 为 0 时D 等于 Q触发器保持当 T 为 1 时D 等于 Q 的取反触发器翻转。转换完成后外部看来就是一个标准的 T 触发器。11.3 D 触发器转 JK 触发器要用 D 触发器实现 JK 触发器功能需要令 D 等于 JK 触发器的次态表达式即 D 等于 J 乘 Q(n) 加上 K 乘 Q(n)。这个表达式给出了需要由 J、K 和现态 Q 共同生成的次态。实际连接时用与门、或门和非门搭建这个与或式把结果接到 D 端。当 J、K 为 1、1 时这个表达式在现态为 0 时取 1现态为 1 时取 0恰好实现翻转其他输入组合也分别对应保持、置位和复位。这样一个 D 触发器加上组合逻辑就完全等价于一个 JK 触发器。11.4 JK 触发器转 D 触发器反过来也可以用 JK 触发器实现 D 触发器。D 触发器的特性是 Q(n1) 等于 D。根据这个特性当 D 为 0 时要求次态为 0当 D 为 1 时要求次态为 1。结合 JK 触发器的激励表现态为 0 要变 0 时 J 为 0、K 任意现态为 1 要变 0 时 J 任意、K 为 1。综合化简后可以得到 J 等于 D、K 等于 D 的反。因此把 D 直接接到 J 端把 D 的反相接到 K 端JK 触发器就转换成了 D 触发器。11.5 转换关系的总结从上述转换过程可以看出各类触发器之间存在紧密的内在联系。JK 触发器功能最全是触发器家族中的通用元件D 触发器输入最简单、集成最方便是现代数字设计的首选T 触发器专长于翻转计数。它们之间可以通过外部组合逻辑互相转换。掌握了特性方程和激励表这两套工具就能在任何类型触发器之间架起转换的桥梁这也为应付不同器件库存、优化设计成本提供了灵活手段。十二、触发器的动态特性与时序参数12.1 静态特性与动态特性前面各章节讨论的内容都是触发器在稳定状态下的逻辑功能即输入、现态和次态之间的确定关系这属于静态特性。静态特性回答了“触发器能做什么”的问题却回答不了“触发器能不能在足够短的时间内可靠完成动作”的问题。实际的门电路存在传输延迟信号并不是瞬时建立因此触发器能否正确采样取决于信号在时钟边沿附近的时序关系。描述这些时序要求的参数统一称为动态特性参数。静态特性正确只是设计的必要前提动态时序裕量充足才是系统可靠运行的保障。12.2 建立时间建立时间Setup Time是指在时钟有效边沿到来之前数据输入端必须提前保持稳定的最短时间。假设某 D 触发器的建立时间为 5 纳秒就要求在时钟上升沿到达前 5 纳秒D 端输入已经处于稳定电平。如果数据在这个窗口内才发生变化触发器内部的采样节点可能尚未建立正确的电平边沿到来时可能采样到一个中间过渡值导致输出进入亚稳态或出现错误。建立时间违规是同步时序设计中最常见的问题。其根源通常是两级触发器之间组合逻辑的传播延迟过大数据在时钟周期结束前未能及时到达下一级触发器的 D 端。解决思路包括降低时钟频率、优化组合逻辑减少级数、插入流水线寄存器拆分长路径等。12.3 保持时间保持时间Hold Time是指在时钟有效边沿之后数据输入端必须继续保持稳定的最短时间。它的存在原因是触发器内部用于捕获数据的传输门关闭需要一个过程如果数据在边沿之后过快变化就可能“追上”尚未完全关闭的内部通路破坏已采集的数据。保持时间不足同样会引发错误甚至导致亚稳态。与建立时间不同保持时间违规通常不能通过降低时钟频率解决。因为保持时间违规往往与相邻寄存器之间的数据路径过短、数据变化过快有关降低频率并不会改善这种短路径竞争。常见修复手段包括在数据路径上插入缓冲器或延迟单元以增大数据到达下一级的时间。12.4 传输延迟与最高时钟频率时钟到输出的传输延迟Clock-to-Q Delay是指从时钟有效边沿到输出 Q 稳定建立之间的时间。这个延迟反映了触发器内部从采样节点到输出端的传播时间。在同步时序电路中数据从一级触发器输出经过组合逻辑再到下一级触发器输入整个回路必须在同一个时钟周期内完成。因此最小时钟周期必须满足时钟到输出延迟加上组合逻辑最大传播延迟再加上下一级触发器的建立时间三者之和小于等于时钟周期。由此可以估算系统最高时钟频率。实际设计还要额外考虑时钟抖动、时钟偏斜、电源噪声和温度变化等因素因此通常不会让系统工作在理论极限频率附近而是保留一定余量。对于高速设计时钟树综合、流水线划分、重定时等技术都是围绕降低关键路径延迟展开的。12.5 脉冲宽度要求触发器的时钟输入端和异步控制端往往还有最小脉冲宽度要求。如果时钟高电平或低电平持续时间过短触发器内部节点可能来不及翻转导致功能错误。对异步复位端也是如此复位脉冲必须持续足够长的时间才能被可靠识别。数据手册中通常会给出这些最小脉冲宽度指标设计时需要保证在实际工作条件下持续满足。12.6 亚稳态及其应对当数据输入在时钟边沿附近发生跳变违反了建立时间或保持时间要求时触发器可能进入亚稳态。亚稳态是一种既非稳定的 0 态也非稳定的 1 态的中间状态输出可能在一个不确定的电压上停留甚至出现短时振荡最终随机地稳定到 0 或 1。亚稳态的持续时间是随机的有时会很快消除有时则会持续较长时间并沿着组合逻辑传播到后级造成系统级错误。亚稳态无法从根本上完全避免但可以通过设计手段显著降低其发生概率和危害。主要措施包括严格满足建立时间和保持时间要求对跨时钟域的信号采用两级或多级同步触发器链给第一级触发器留出足够的亚稳态恢复时间对关键异步信号进行握手或格雷编码转换等。亚稳态分析是高速数字系统和跨时钟域设计不可或缺的一环。十三、触发器的典型应用13.1 寄存器与数据暂存寄存器是触发器最直接、最重要的应用。把若干 D 触发器并列并共享同一时钟就能组成一个多位寄存器。处理器内部的通用寄存器、指令寄存器、状态寄存器、浮点寄存器等本质上都是由触发器构成的阵列。它们在时钟边沿采样数据并保持一个完整周期为组合逻辑提供稳定的操作数。带三态输出的寄存器还能直接连接到总线上由输出使能信号决定是否将保存的数据驱动到总线从而在多个设备之间实现分时复用。寄存器在数据通路中的作用可以概括为“节拍化”。它在时钟边沿截断组合逻辑的传播使数据处理变得有节奏、可预测。没有寄存器信号就会在组合逻辑中无限向前传播指令流水线、状态机这些概念都无从谈起。13.2 移位寄存器把多个触发器首尾相接前一级的 Q 输出接到后一级的 D 输入所有触发器共用同一时钟就构成了移位寄存器。每个时钟边沿到来时各触发器的数据整体向后或向前移动一位。移位寄存器在串行通信中应用广泛串行数据从一端逐位进入经过若干个时钟周期后各触发器的并行输出就是完整的并行数据实现串行转并行反之先把并行数据一次性载入各触发器再逐周期从另一端移出就实现并行转串行。移位寄存器还可以实现数据的延时、循环移位以及简单的乘除运算。在通信接口、扫描链测试、图像行缓冲等场合都能看到移位寄存器的身影。其设计核心在于保证所有触发器的时钟同步并正确处理级间连接方向。13.3 计数器计数器是触发器应用的经典范例。一个 T 触发器本身就是模 2 计数器每个时钟脉冲翻转一次输出在 0 和 1 之间循环。把多个 T 触发器级联前一级的输出作为后一级的时钟就构成异步二进制计数器各级输出按二进制规律递增。若所有触发器共用统一时钟用组合逻辑为每一级生成是否需要翻转的控制信号则构成同步计数器。同步计数器所有触发器在同一时钟边沿更新输出同时变化杂散跳变少便于后续译码和高速工作异步计数器结构简单、功耗低但存在级间逐级延迟累积的问题。计数器广泛用于分频、定时、地址生成、状态编码和脉冲计数等场景。任意模值的计数器都可以通过在计数到目标值时产生清零或置位信号来实现。13.4 分频器分频器是计数器的一种直接应用。一个 T 触发器把时钟频率二分频n 级级联则可实现 2 的 n 次方分频。若系统需要 1 兆赫兹信号而晶振提供 8 兆赫兹时钟用 3 级触发器即可实现 8 分频。除二进制分频外结合反馈清零逻辑可以实现任意整数分频。例如设计一个模 5 计数器取最高位输出就能得到接近 50% 占空比的 5 分频信号。分频器为系统中不同模块提供不同频率的时钟是触发器应用的典型练习。13.5 状态机有限状态机是数字系统设计的核心方法论而状态机的物理载体就是触发器。一个有限状态机由存储部分和组合逻辑部分组成存储部分用一组触发器保存“现态”组合逻辑根据现态和外部输入计算“次态”和输出在时钟边沿把次态写入触发器。Mealy 型状态机输出与输入和现态都有关Moore 型状态机输出只与现态有关二者的存储部分都由触发器承担。状态机广泛应用于控制器、协议解析、序列检测、自动售货机等场景。例如要检测输入序列中是否出现连续三个 1可以用若干触发器表示已经匹配到的连续 1 的个数根据输入逐周期跳转状态。状态数量决定触发器数量状态分配和激励方程化简则直接决定最终电路是否简洁高效。13.6 按键消抖与异步信号处理机械按键在按下和释放的瞬间触点会发生快速的多次通断产生抖动。若把抖动信号直接接到计数器或状态机一次按键就可能被误判为多次事件。利用基本 RS 触发器可以构成简易的按键消抖电路让按键的两个触点分别控制 RS 触发器的置位端和复位端当按键完全压下时置位完全释放时复位。抖动过程中的多次通断不会反复改变输出因为一旦触点进入稳定位置触发器状态就被确定抖动无法在两个有效端之间形成完整切换。经过 RS 触发器整形后输出是一个干净的、单次跳变的信号。这一应用也提示我们触发器不仅能处理同步数据还能在异步世界中扮演整形和同步的角色。当然对于需要进入同步系统的异步信号仅仅消抖还不够还需要经过同步触发器链处理以避免亚稳态传播。十四、常见误区与注意事项14.1 混淆锁存器与触发器锁存器与触发器是最容易被混淆的一组概念。锁存器是电平敏感的在使能有效期间透明输入毛刺会直接传导到输出边沿触发器只在时钟边沿采样抗干扰能力更强。在同步时序设计中除非明确需要锁存行为否则应使用边沿触发器。很多人写出电平敏感的 Verilog 代码而不自知综合器由此推断出锁存器造成设计隐患。了解二者的区别是规范时序设计的前提。14.2 忽略异步端的优先级带异步置位和清零端的触发器其异步信号优先级高于时钟和数据。上电时若异步端处于有效状态输出会被立即改变而不等待时钟。使用时应确保异步控制信号在不必要时保持无效电平。此外异步复位撤销时刻如果与时钟边沿过于接近可能引起输出不确定通常需要通过复位释放同步电路来保证复位撤离后的首个时钟周期状态确定。14.3 忘记检查建立时间和保持时间只看逻辑功能而忽略时序参数是新手设计中非常常见的错误。逻辑仿真通过并不代表实际硬件可靠。设计时必须对每一条寄存器到寄存器的数据路径检查建立时间对每一条短路径检查保持时间。跨时钟域的路径还需要额外的同步处理。静态时序分析工具可以帮助发现大部分问题但设计者仍需理解这些参数背后的物理意义。14.4 阻塞赋值与非阻塞赋值混用在用 Verilog 描述时序逻辑时触发器行为应当用非阻塞赋值符 表示。如果在边沿敏感块中误用阻塞赋值可能导致仿真语义与综合后的实际硬件行为不一致出现前仿与后仿不符的现象。规范的做法是组合逻辑使用阻塞赋值时序逻辑使用非阻塞赋值同一段代码中不要把两者随意混用。14.5 时钟边沿混用导致的相位混乱一个系统中如果有些触发器在上升沿工作有些在下降沿工作必须清楚区分不同时钟域和不同边沿对数据流的影响。刻意使用反相边沿有时可以优化时序余量但随意混用会让时序分析变得复杂也容易引入数据争用。建议在系统级设计时尽量统一触发边沿确有必要时在局部谨慎使用并做好充分的时序验证。14.6 悬空输入与噪声干扰CMOS 和 TTL 逻辑的输入端都不应长期悬空。悬空输入的电平不确定容易受环境噪声影响而随机变化导致触发器误动作甚至形成振荡。未使用的输入引脚、异步控制端、时钟使能端等都应通过上拉或下拉电阻固定到确定电平。这是保证电路可靠性的基本工程习惯。十五、总结触发器是数字电路从组合逻辑跨越到时序逻辑的关键一步。它依靠双稳态反馈结构保存一位二进制信息依靠输入控制逻辑决定状态如何改变依靠时钟信号决定状态何时改变。从基本 RS 触发器出发我们看到了异步记忆单元的原型通过引入时钟得到了同步 RS 触发器为了消除约束条件发展出了 D 触发器为了提供完整功能设计出了 JK 触发器为了应对空翻又先后诞生了主从结构和边沿触发结构。每向前一步都是对前一设计缺陷的针对性改进整个演进路径清晰而富有逻辑。在现代数字系统中边沿触发的 D 触发器凭借结构简单、时序规整、易于大规模集成成为寄存器和存储单元的主流选择。JK 触发器虽然在分立逻辑时代风光无限如今更多作为理解触发器完整功能的教学模型和某些特定电路的实现手段。T 触发器则在计数和分频场景下继续发挥直接作用。掌握各类触发器的功能表、特性方程、激励表及相互转换方法既能服务于课程学习也为实际芯片选型与电路设计打下坚实基础。最后必须强调触发器设计不能局限于逻辑功能。建立时间、保持时间、传输延迟、最小时钟周期、脉冲宽度和亚稳态等动态特性参数决定了电路能否在真实器件上可靠工作。一个成熟的数字电路设计者既要能把逻辑功能正确映射为触发器网络也要能为每一条时序路径留出足够裕量妥善处理复位策略、跨时钟域、毛刺和信号完整性等工程细节。希望本文能帮助读者把这些概念串联起来形成对触发器完整而系统的理解。