十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

时序逻辑电路设计详解:从触发器到计数器

时序逻辑电路设计详解:从触发器到计数器 1. 时序逻辑为什么让很多人卡壳组合逻辑没有“记性”1.1 时序电路和组合电路的分界线到底在哪我在带学生做数字电路课程设计时最常见到的一个现象是加减法、编码器、译码器和多路选择器这些组合逻辑电路大家学得还挺顺利一旦讲到时序逻辑电路就像突然撞上了一堵墙。很多人觉得难是因为“这跟前面学的完全不是一个套路”。组合逻辑电路里你给什么输入输出立刻就是什么输入一去掉输出马上跟着变什么也留不下来。时序逻辑电路不一样它的输出不只取决于此时此刻的输入还取决于电路之前的状态也就是说它把“过去”记下来了。把话挑明组合逻辑处理的是“当下”时序逻辑处理的是“历史”。你写一个全加器输入的A、B、Ci是010输出就是Sum1、Co0你换个输入输出立刻跟着换。可你在做一个十进制计数器的时候它必须记得自己当前停在几这样下一个时钟脉冲来了它才知道该跑到几。这种“记得”的能力组合逻辑给不了你必须靠触发器来承担。1.2 “记忆”这件事本质上是电路要有状态那“记忆”在电路里到底是怎么实现的一句话电路里有东西能够“抱住自己的输出不放”。听起来很玄但你可以把触发器理解成一个非常固执的开关——你拨到哪边它就保持在哪边除非你再次明确地拨动它。这种能稳定停在两种不同状态之一并且能在外界信号作用下切换状态、在信号撤销后保持状态不变的结构就是所谓的双稳态电路。不是所有东西都叫触发器。严格来说时序逻辑电路最基本的存储单元有三种锁存器Latch、触发器Flip-Flop、寄存器Register。锁存器是电平触发的也就是说在使能信号有效的整个期间输出都会跟着输入变触发器是边沿触发的只在时钟信号的上升沿或下降沿那一瞬间采样输入其余时间输出一动不动寄存器则是由一组触发器并联构成的多位存储单元。很多人一开始就把这几个概念混在一起后面越学越乱其实只要抓住“采样时机”这条线它们的关系立刻清楚。2. 触发器的起点用两个与非门做出来的“双稳态开关”2.1 从RS锁存器的四种输入组合说起任何一个触发器的源头都可以追溯到两个交叉耦合的与非门。注意是交叉耦合也就是说第一个门的输出接到第二个门的输入第二个门的输出再回到第一个门的输入。就这两根反馈线把一组普通的逻辑门变成了能记住状态的器件。以RS锁存器为例S是置位端R是复位端Q和Q非是两个互补输出。这里我带你把四种输入组合全部过一遍这块搞懂了后面所有触发器你都吃得下S1、R1两个输入都是高电平与非门此时相当于反相器两个门互相锁定对方的输出Q保持不变。这就是“保持”状态是记忆功能的核心。S0、R1置位端有效Q被强制拉高Q非为低。即使S恢复成1由于反馈回路的存在Q依然保持高电平。这就是“置位”。S1、R0复位端有效Q被强制拉低Q非为高。之后即使R恢复成1Q也依然保持低电平。这就是“复位”。S0、R0两个输入同时有效这时候Q和Q非都被拉高两个输出不再互补而且当你把输入同时撤掉之后电路会随机落到置位或复位两种状态之一。这个状态叫“不定态”或“禁止态”在实际电路设计中必须避免。2.2 为什么它能记住一个1位数据你可以把记忆的原理理解为一场互相较劲的博弈。两个与非门一个输出高电平让另一个变低另一个输出低电平又反过来维持第一个的高电平输出形成一个稳态反过来一个输出低电平另一个输出高电平又形成另一个稳态。两个门之间通过反馈线“互相搀扶”谁都不肯先倒所以外部的输入一撤它们也能凭借自己内部的回路维持状态。我给学生打过一个比方这就像两个人面对面站着互相指着对方说“你先说”结果谁都不先开口就一直僵在那里。这种僵持状态就是电路记忆住的“0”或“1”。所以触发器的“记忆”本质上不是它有什么神奇的存储介质而是它依靠正反馈回路实现了双稳态。一个双稳态电路能存1位数据8个并排就能存一个字节16个并排就构成一个寄存器这就是存储器的基本雏形。2.3 电平触发的RS触发器给锁存器装上门卫上面那个RS锁存器输入一变输出立刻跟着变没有任何“控制时机”的概念。但是实际数字系统里所有部件必须步调一致否则整个系统就是一团乱麻。于是我们给它加了一个控制端叫使能端或时钟端只有在时钟信号有效期间输入端的数据才能进入锁存器时钟无效时无论输入怎么折腾输出都保持不变。这种结构叫电平触发RS触发器它在CLK1的整个时间段都是“透明”的输出随时可能跟着输入变。你可以把它理解成一个门卫上班时间CLK1放行下班时间CLK0锁门。有了时钟控制端之后我才把它称为触发器而那个没有时钟控制的原始结构严格来说只能叫锁存器。3. D、JK、T触发器各解决什么问题3.1 D触发器用单一输入换取彻底消除不定态RS触发器虽然在逻辑上成立了但在工程上有个很要命的毛病R和S同时有效时进入禁止态输出变得不可预测。任何一个需要严格可靠运行的数字电路都接受不了不可预测。解决办法也很直接在输入端加一个反相器让R端和S端的输入永远互补这样“两个同时有效”这个组合就从物理上被消灭了。这个改进就得到了D触发器。D触发器的逻辑关系极其简洁D1时CLK边沿到来后Q1D0时CLK边沿到来后Q0。看起来好像“输出就是输入的延迟”很多人因此小看它但正是这种简洁让D触发器成了现代数字电路中使用量最大的存储单元。无论是寄存器堆、状态机、计数器还是存储器底层绝大多数都是D触发器。你去看任何一本FPGA或ASIC设计的书里面出现频率最高的电路单元一定是D触发器因为它的行为确定、时序关系清楚、综合工具好处理。74LS74就是经典的双D触发器芯片一脚一脚查手册你会发现每个D触发器都带独立的置位端和复位端这也是D触发器的一个重要能力除了跟随输入还可以被强制定到已知状态。这个功能在电路上电初始化时至关重要否则一开机上电所有触发器都处于随机状态整个系统就乱了。3.2 JK触发器把SR的禁止态变成翻转态D触发器虽然好用但它只有一个输入功能相对单一。如果我们想要一个更“全能”的触发器既要置位、复位、保持又希望两个输入同时有效时给出一个确定的行为那就轮到JK触发器登场。JK触发器的J相当于原来的SK相当于原来的R唯一的变化是J1且K1时的处理它不再是不定态而是翻转也就是Q从0变1或从1变0。为什么要把“禁止”改成“翻转”因为翻转在计数器里太有用了。你试想一下如果把一个JK触发器的J和K都接高电平每个时钟边沿到来时它就翻一次两次翻转构成一个完整周期。也就是说时钟进去两个脉冲输出才出来一个脉冲频率正好减半。这就是数字电路里最基础的二分频器。一个触发器二分频两个级联四分频三个级联八分频这样搭下去只需15个触发器就能把32.768kHz的晶振频率分到1Hz这就是数字时钟里秒脉冲的由来。3.3 T触发器二分频的基本单元把JK触发器的J和K连在一起就是T触发器。T端为高电平时每个时钟边沿翻转一次T端为低电平时保持原状态。T触发器存在的全部意义几乎就是为计数器服务的。你可以通过控制T端的电平决定某个触发器在下个时钟边沿“翻不翻”。这种可控翻转特性正是设计同步计数器的核心思想。我在实际教学中发现一个有趣的规律很多人学组合逻辑时思维模式是“输入驱动输出”到了触发器这里需要把模式切换成“事件驱动状态”。一个触发器记的不仅仅是电平而是被时钟边沿这个“事件”决定的。T触发器就是最典型的“事件驱动”器件——时钟沿才看T端平时不管T端怎么变化都不理会。4. 边沿触发才是时序逻辑的分水岭4.1 电平触发的“透明”问题到底有多致命我第一次用示波器观察电平触发D锁存器的波形时印象特别深。CLK为高电平期间输入D上出现了一个毛刺输出Q立刻跟着多了一个毛刺。也就是说在时钟有效的整个时间段里锁存器对输入是“透明”的输入怎么折腾输出就怎么折腾。这在单级电路里还不明显一旦多个触发器级联起来问题就变得非常严重。想象一个8位移位寄存器数据要一级一级往下传。如果用电平触发CLK为高电平期间第一级锁存器把D端的数据透传到Q端Q端又直接连着第二级的D端第二级也透明第三级又接着透传下去。整个CLK高电平期间输入数据会一路穿透到最末级根本不存在“移位”的过程所有级都同时跟输入一样。这种“穿透”效应会让电路完全丧失功能时序逻辑系统绝对接受不了。这就是为什么现代数字系统里边沿触发器成了绝对的主流。边沿触发只在时钟上升沿或下降沿到来那一瞬间对输入信号进行一次“拍照”其余时间输出严格锁存不变化。你可以把它理解成摄影师快门只在那一瞬间打开拍完之后立刻关闭不管相机前面的景色怎么变已拍下的照片内容都不会变。有了这种“瞬间采样”能力多级触发器才能安全级联数据才能一级一级地稳定传递。4.2 主从结构与边沿采样的设计思路实现边沿触发最经典的电路结构是主从触发器。主从结构把一个触发器拆成两级锁存器一级叫主锁存器一级叫从锁存器两者由互补时钟控制。CLK1时主锁存器透明从锁存器锁存CLK0时主锁存器锁存从锁存器透明。整体效果就是输出只在CLK从1跳变到0下降沿的瞬间更新一次其他时间保持不变。这里有一个非常经典的坑叫“一次翻转现象”常见于主从结构的JK触发器。原因是主锁存器在CLK1的整个期间都是透明的如果在此期间J、K输入发生了变化主锁存器可能多次翻转而最终在下降沿送入从锁存器的可能已经不是最后一次输入所对应的状态。换句话说主从JK虽然是边沿触发的但它在时钟高电平期间对输入太过敏感容易被输入上的毛刺干扰。后来出现的边沿D触发器通过更精细的内部结构彻底解决了这个问题只在时钟边沿瞬间对输入采样其他时间输入怎样翻腾都不管。这也是现代芯片里D触发器大行其道的原因之一。4.3 建立时间和保持时间触发器不是瞬间完成的到了这一步很多初学者会以为触发器在时钟边沿瞬间就把输入“咔嚓”完成了。实际上触发器内部的电荷转移、晶体管导通都需要物理时间不是一个数学上的“瞬间”。这就引出了数字电路时序分析里最重要的两个概念建立时间和保持时间。建立时间Setup Time是指数据必须在时钟边沿到来之前至少提前多久稳定下来保持时间Hold Time是指时钟边沿到来之后数据必须继续保持多久不变。如果违反了这两个时间范围触发器就会进入一种中间状态既不像0也不像1输出可能振荡、可能延迟很久才稳定甚至不同次上电结果不一样。这种状态叫亚稳态是每个做实际数字系统的人绕不开的敌人。用生活化的方式理解建立时间就像是运动员必须在发令枪响之前摆好起跑姿势保持时间就是起跑后不能立刻又收回脚。如果姿势还没摆好枪就响了或者刚起步就乱动这个运动员的成绩就无法预测。在数字系统里亚稳态一旦发生轻则数据错误重则系统死机所以后续章节我要专门讲一讲怎么在实际工程中对付它。5. 三大经典应用分频器、计数器、寄存器5.1 用D触发器一分二、二分四的级联做法光讲概念不搭电路永远体会不到触发器的魅力。先从最基础的分频器开始。把一个D触发器的/Q非端接回自己的D端CLK接时钟这就是经典的D触发器二分频电路。为什么能分频因为每个时钟上升沿D采到的都是/Q当前的相反值于是Q在每次时钟沿后翻转一次。两个时钟脉冲对应Q的一个完整周期输出频率就是输入的一半。实测一下输入1kHz方波Q端出来就是500Hz方波占空比严格50%而且边沿干净利落。再把第一级的Q接到第二级的CLK第二级再做一次二分频就得到250Hz。级联下去3级就是八分频、4级十六分频。这里有个细节值得留意第二级的时钟来自第一级的Q端输出而不是原始时钟所以每一级都会累积一点传输延迟这种结构叫异步分频。做简单分频没问题但要是拿去做高精度计时每级几十纳秒的延迟累计起来就可能影响精度。5.2 异步计数器的波纹延迟和同步计数器对比把分频器的Q2、Q1、Q0看作一个整体的三位二进制数三个触发器的输出组合起来就能表示0到7的循环计数。这就是异步计数器也叫行波计数器。它的优点是结构极其简单三个触发器串联就够缺点是前面说过的延迟问题。低位的翻转通过进位链一级级传上去就像水波一圈圈荡开所以叫“行波”。当计数器的位数越来越多最高位相对于时钟沿的延迟会越来越大一旦超过一个时钟周期整个计数器就直接失效了。同步计数器是更稳的方案。它让所有触发器共享同一个时钟每个触发器该不该翻转由前级的组合逻辑提前算好。比如三位同步计数器最低位每个时钟都翻中间位在最低位为1时翻最高位在低两位都为1时翻。这样所有触发器在同一时刻被时钟驱动没有级联延迟频率上限高得多。对比下来异步计数器胜在省门电路同步计数器胜在速度快、时序干净工程上往往根据工作频率来选择。5.3 寄存器和移位寄存器D触发器的并联艺术前面说过多个D触发器可以并排组成寄存器但光有寄存器还不够很多时候我们需要把数据一位一位地移动。把前一级D触发器的Q接到后一级的D端所有触发器共享同一个时钟这就构成了移位寄存器。每个时钟沿到来时所有数据整体向右移动一位最左端进入新数据最右端移出的数据丢弃。移位寄存器在实际项目里有两个高频用途。一是串行转并行单片机只有一根数据线想给8个LED灯输出不同状态就可以把8位数据一位一位从串行口移入移位寄存器等8位全部到齐并行输出端一次性输出给LED。这个方案在以前数码管动态扫描的电路里非常普遍。二是构建环形计数器或约翰逊计数器也就是把最后一级的输出反馈回第一级的输入让数据在寄存器里循环转转可以产生特定的时序控制信号在电机控制、状态机设计里用到。我在Proteus里仿真这类电路时最喜欢用虚拟示波器同时观察几路波形看着数据像流水一样一格一格移动那种感觉比背一百遍真值表都管用。6. 从芯片到单片机触发器的工程应用与避坑经验6.1 数字时钟里的32.768kHz为什么是这个值很多玩单片机的朋友可能都好奇过为什么实时时钟芯片或者手表里的晶振偏偏选32.768kHz而不是1MHz或者其他的整数频率答案就在触发器的分频能力里。32.768kHz是2的15次方也就是说用15个T触发器一级级二分频可以得到精确的1Hz秒脉冲。15级分频器结构规整实现起来不需要任何组合逻辑功耗低、成本小这对靠纽扣电池供电的手表来说太重要了。由此你也可以看到分频器不仅仅是实验室里用来“玩”的概念它是几乎所有数字计时系统的基础。单片机内部的定时器本质就是一组连接好的计数器触发器时钟源进来后一路计数溢出时产生中断。理解了触发器的级联和翻转到计数转换的关系定时器对你来说就不再是一个需要死记寄存器的黑盒子而是一眼能看穿的结构。6.2 亚稳态真工程里触发器最现实的坑前面提到过建立时间和保持时间这里必须展开讲一个实际工程里最坑人的现象亚稳态。如果你的数据信号来自和当前时钟完全没有关系的异步系统比如一个按键按下时产生的信号恰好落在系统时钟的建立时间窗口内触发器就会陷入亚稳态。这个时候Q端输出可能不是稳定的0或1而是在两者之间振荡或者过了很长时间才稳定而且每次上电出现的结果可能都不一样。有人说亚稳态的严重后果在于它不会停留在触发器本身而是沿着电路传播。一个触发器亚稳态输出一个不确定值这个值经过组合逻辑传给下一个触发器下一个触发器又可能因此进入亚稳态最后这串链式反应可能导致整个系统状态错乱。早期我做按键触发实验的时候就踩过这个坑按键消抖程序明明写得没问题但偶尔就是会跳到意想不到的状态后来用示波器一看问题出在异步信号没经过同步处理上。对付亚稳态的标准做法是加同步器用两个或者三个触发器串联把异步信号先通过第一级触发器“打一拍”牺牲一个时钟周期换取第二级触发器采到稳定数据的概率。第一级发生亚稳态时经过一个周期的振荡恢复到第二级采样时大概率已经稳定了。这个做法不是完全消除亚稳态而是把亚稳态发生的概率降低到工程上可以忽略的程度。做FPGA或者单片机外设接口设计时只要碰到跨时钟域信号这层同步处理是必须有的。6.3 学习和排查建议最后分享一些我在学习和带项目时积累的实操经验希望能帮你少走弯路。第一先动手搭最简单的RS锁存器。拿两片74LS00与非门按交叉耦合的方式接线用按钮控制S和R端用LED观察输出。上手摸一遍你就会发现“保持状态”这四个字是有实感的而不是抽象概念。这一步花费不超过半小时但比看书两小时有用。第二示波器是理解触发器的必备工具。我用的是双通道示波器一个通道测时钟一个通道测Q端观察D触发器的边沿采样行为。只有亲眼看到“时钟上升沿之后Q才变化”这个现象你才能真正理解边沿触发和电平触发的区别。第三Multisim或Proteus仿真可以帮你快速验证思路但别完全依赖仿真。仿真软件里触发器是理想器件没有建立保持时间不会出现亚稳态而真实芯片都有。我以前在仿真里跑得好好的计数器上电后偶尔首拍状态不确定就是因为没有给触发器做初始复位。想让电路每次上电都从已知状态开始就必须把各触发器的清零端和上电复位电路接好这个细节很多书不会强调但实际项目里特别重要。第四排查时序电路问题时别急着怀疑触发器本身。遇到计数器乱跳、寄存器数据出错的情况先用示波器确认时钟信号是否干净再用逻辑分析仪看数据是否满足建立保持时间。我在实际项目里遇到的时序问题十有八九出在时钟毛刺、信号竞争这些外围环境上真正触发器芯片本身损坏的概率非常低。时序逻辑电路看起来内容多、门类杂但它的核心始终是那几个概念双稳态、时钟采样、边沿触发、状态保持。你把触发器吃透了计数器、寄存器、状态机这些东西都可以看作触发器的不同排列组合。数字电子这门课里的所谓难题大多数时候不是难在电路本身而是难在概念没理顺。把“记忆”这件事想明白后面的路就顺了。
返回列表