ARTICLE DETAIL

资讯详情

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

从触发器到时序逻辑电路:数字电子时钟设计实战指南

从触发器到时序逻辑电路:数字电子时钟设计实战指南 学数字电子技术很多人一进门就卡在时序逻辑电路这块儿觉得又是状态又是波形脑子根本转不过来。说实话时序逻辑电路真没想象中那么难难的是你不理解触发器。只要把触发器这个概念彻底搞明白什么计数器、寄存器、状态机后面全都一通百通。这篇文章我想用一个老工程师的视角把触发器到时序逻辑电路这条路给你理清楚再结合数字电子时钟这种最典型的应用告诉你这些东西到底是怎么串起来的。不管是刚学数电的学生还是准备考研复试、准备电赛要补基础的朋友这篇都值得你静下心看完。1. 先搞清楚时序逻辑电路和组合逻辑电路到底差在哪1.1 组合逻辑电路输入一变输出立马变很多初学者一上来就背“时序逻辑电路有记忆功能”但到底什么叫“记忆”我习惯先讲组合逻辑电路因为它简单而且是我们理解时序电路最好的参照物。组合逻辑电路最典型的特点就是输出只取决于当前的输入跟过去的状态没有任何关系。拿一个最简单的与门来说A和B都是1Y就是1只要有一路变成0Y立刻变成0绝对不含糊。再比如3-8译码器、数据选择器、加法器这些全都是组合逻辑电路。它们的行为完全可以用一张真值表描述出来输入给什么组合输出就出什么结果像一部设定好剧情的电影从头到尾只有一条线。这种电路的好处是逻辑清晰、响应快但也有一个致命短板它不记得任何事情。如果我要做一个“按下按钮就自锁的灯”按一下亮、再按一下灭你会发现用纯组合逻辑根本没法做因为灯的当前状态影响了它的下一个状态。这种“当前状态决定未来行为”的需求就是时序逻辑电路存在的理由。1.2 时序逻辑电路靠“状态”吃饭时序逻辑电路和组合逻辑电路的本质区别在于它多了一个“状态”。输出不仅取决于当前输入还取决于电路内部保存的历史信息。这个历史信息我习惯把它理解成电路自己的“记忆”而这份记忆恰恰是用触发器来保存的。举个例子你就明白了自动售货机。投5块钱不出货再投5块钱才出一瓶水。第一个5块钱进去的时候组合逻辑电路看输入也是“有钱”但它不知道“这笔钱是第一次还是第二次”。时序逻辑电路就不一样它能记住“已经投过5块了”所以等到第二个5块到达时它知道现在累计10块可以出货了。从这个例子能看出来一个完整的时序逻辑电路本质上由两部分组成一部分负责计算“下一个状态是什么”这通常是组合逻辑另一部分负责“把当前状态存起来”这部分就是触发器。所以我说触发器是时序逻辑电路的核心记忆单元你只要抓住这条主线后面学计数器、状态机全是围绕着“状态怎么算、状态怎么存、状态怎么输出”这三个问题转。2. 触发器就是时序逻辑电路的“记忆细胞”2.1 从两个与非门开始基本RS触发器要说触发器最经典的起点就是基本RS触发器它也是很多教材里“触发器开篇第一课”的常客。结构上很简单两个与非门的输出端分别接到另一个与非门的输入端形成交叉耦合。就这么一个看似简单的环却能实现“置1”“清0”“保持”三种功能。我来说说它是怎么工作的。两个输入端一个叫SSet置位一个叫RReset复位常态下S和R都接高电平。当S端给一个低电平脉冲、R保持高电平时输出Q变成1这叫置位反过来R给低、S保持高Q变成0这叫复位。如果S和R同时恢复成高电平Q会保持上一个状态这就是“记忆”功能。听起来很神奇其实就是用两个与非门的反馈互相锁住对方的电平想变都变不了。这里有一个必须注意的坑如果S和R同时变成低电平Q和Q非会同时输出高电平这在一开始设计时是禁止出现的状态我们叫它“禁止态”或“不确定态”。因为一旦两个输入同时恢复高电平两个与非门会“抢着”翻转谁快谁慢取决于实际门的延迟差异最终结果是不确定的。所以基础RS触发器在使用时要约定S和R不能同时为0。后来为了工程安全很多人会改用复位优先或置位优先的RS触发器结构。复位优先的意思很直白当S和R同时有效时输出优先归零。这种思路在计数器复位电路里非常常见我后面讲数字时钟时会再提到。你要是想亲手搭一个RS触发器甚至可以在NANDgame这类逻辑门游戏里建几个与非门试试把交叉耦合那个环连出来你对“反馈”这个概念的印象会深得多。2.2 D触发器数字时钟最核心的“锁存单元”RS触发器虽然能记住一位数据但用起来有两个麻烦一是要控制两个输入太啰嗦二是禁止态的存在让人心里不踏实。于是D触发器横空出世它把输入简化成一个数据端D再加上一个时钟端CLK从此数据存储的时机变得可控了。D触发器的核心逻辑用一句话就能说清在时钟的某个有效边沿上升沿或下降沿到来瞬间D端的数据被锁存到Q端输出其他时间里不管D怎么变Q都保持原样。这个特性有多重要你可以把D触发器想象成一个“快照相机”时钟沿就是快门按下快门的那一刻D端是什么状态Q端就定格成什么状态之后哪怕光线变了照片也不变。正是因为这种边沿触发机制D触发器成了数字电子时钟里最必不可少的基本单元。你可能听说过D触发器二分频这个电路把D触发器的Q非输出接回自己的D输入端然后从CLK输入一个方波你会发现每来一个时钟沿Q就翻转一次。也就是说输入的方波每秒钟跳两次输出的方波每秒钟才跳一次频率正好减半。这个“二分频”操作是所有数字时钟计时的基石从晶振的高频率一步步分到我们熟悉的1Hz秒脉冲靠的就是这种玩法。2.3 JK触发器和T触发器控制输入更灵活RS触发器又多输入又有禁止态D触发器倒是省事但有些场景我们需要更灵活的翻转控制于是JK触发器出现了。JK触发器的J和K相当于RS触发器的S和R但当J1且K1时它不禁止而是让输出翻转。你想想看这等于把“不确定态”变成了“翻转态”逻辑完整性一下就补上了。T触发器可以看作是JK触发器的特殊用法把J和K短接成一个输入TT1时每个时钟沿输出翻转一次T0时保持。这就是一个带使能控制的二分频器用来做可编程计数器特别顺手。那实际工程里怎么选呢我个人的习惯很简单如果只是存数据、做寄存器、做移位寄存器无脑用D触发器结构简单时序也容易收敛如果是要搭计数器、状态机这类需要频繁翻转、又希望输入端尽可能少的电路用JK触发器往往更灵活。不同触发器的选择本质是在“输入复杂度”和“功能灵活度”之间做权衡把这个权衡想明白你看到电路图时就不会一头雾水。3. 实操用触发器搭一个实用的数字电子时钟3.1 从晶振到1秒脉冲触发器的分频链讲了这么多原理我们来看一个最经典的实例数字电子时钟。在单片机没有这么普及的年代数字时钟就是一块一块的触发器芯片搭出来的核心思路直到今天也没变就是“分频—计数—显示”三步走。第一步要有一个稳定精准的时基源。用石头一样稳的晶振产生一个高频方波比如常见的32.768kHz。这个数字是不是看着眼熟它正好是2的15次方也就是说只要连续15次二分频就能精确得到1Hz的秒脉冲。为什么要选这个值就是因为D触发器二分频链条可以直接整除到1Hz省得再去用组合逻辑校准误差。具体的分频电路就是把15个D触发器首尾相连第一个触发器的Q非接回D从晶振输出得到16.384kHz它的Q输出再接第二个触发器的CLK得到8.192kHz这样一级一级接下去到第15级输出正好是1Hz。每一级就是一个D触发器二分频器逻辑上完全相同这也是我前面为什么强调二分频是基石的原因。你在做硬件实验时完全可以在面包板上用CD4013双D触发器芯片搭一搭这个链子LED接在最后一级上看它一秒闪一次那种“原来触发器这么有用”的感觉会非常强烈。3.2 秒计数、分计数和时计数一切皆计数器有了1Hz的秒脉冲接下来就是计数。秒计数器要数60下进一位给分计数器分计数器也是60下进一位给时计数器时计数器则按24小时制归零。这种“数到N就清零并向高位进位”的结构其实就是计数器。计数器的本质说到底还是把一串触发器连接起来让它们按特定规律翻转。最简单的二进制计数器是低位触发器每来一个脉冲翻转一次高位触发器只有在低位从1变成0也就是低位有下降沿时才翻转。几个触发器级联起来就能表示多位的二进制数。但数字时钟要的是十进制显示所以得做“模60”和“模24”计数器。模60好办就是十位和个位分别走0到9、0到5当检测到6和0同时出现的瞬间让计数器清零并产生进位信号。这就是我前面提到的复位优先思想复位发生时置位端要保证无效否则会出现“明明该清0却变成别的数字”的怪毛病。显示部分则是把计数器的二进制输出通过BCD译码芯片比如CD4511转换成七段数码管需要的段码信号。你在单片机电子数字时钟里看到的那串代码本质上干的也是这件事只不过芯片内部把分频、计数、译码全集成好了。如果你懂触发器再看单片机的定时器配置你会突然觉得特别亲切什么预分频、计数溢出、自动重装载说到底都是计数器周期性循环的应用。3.3 同步设计意识避免毛刺和抖动数字时钟里还有一个特别重要的工程问题到底是同步复位还是异步复位。所谓同步复位是指复位信号必须在有效时钟沿到来时才能生效异步复位则是一旦复位引脚电平变化输出立刻被拉回初始状态不需要等时钟沿。异步复位方便但在计数器级联的场景下特别容易出问题。举个例子秒计数器从59跳到00时分计数器要加1。如果秒计数器的复位信号是一组组合逻辑产生的短暂“毛刺”它就可能让分计数器在错误的时间点被触发结果就是一秒之内多进了一位。这种问题在仿真里未必看得见但实物电路里非常头疼。我的建议是能够用同步复位就尽量用同步复位至少要对异步复位信号做一次同步处理用两个触发器打两拍再去控制其他电路。这几乎是所有数字电路设计的老规矩了养成这种习惯你的电路稳定性会高一大截。3.4 从硬件到软件触发器思想也适配单片机可能有朋友会问现在大家学单片机、做电子时钟谁还拿触发器一片一片搭啊这话没错但你仔细看单片机的定时器模块它内部就是个硬件计数器而硬件计数器的基础仍然是触发器。你配置定时器时的预分频系数就是把外部的时钟先做若干级分频原理和D触发器二分频链一模一样。然后计数器溢出、产生中断这就是“数到N清零并产生进位”的升级版只是这个“进位”变成了中断标志位。所以我的看法是不要觉得触发器很“古老”它是数字系统里最底层的肌肉记忆。你要理解定时器为什么会溢出后自动清零就得先理解模N计数器的清零逻辑。以后你要是接触到FPGA、数字IC设计写verilog时说一句“always (posedge clk)”硬件综合器真的会给你生成一堆D触发器这个逻辑和几十年前的分频计数器没有本质区别。4. 常见问题与排查技巧实录4.1 触发器不翻转输出一直为高或低这个问题是初学触发器时最常踩的坑我当年用74LS74搭电路时也被它折磨过。遇到输出不翻转先别急着怀疑芯片坏了按照下面这个顺序排查基本能帮你解决90%的问题。先查时钟。确认时钟信号到底有没有到达CLK引脚频率和幅值是否正常。很多人用信号发生器输出一个方波结果忘记设置偏置电压负半周的信号根本达不到触发器的识别阈值芯片自然是“一动不动”。再查时钟边沿。你是按照上升沿触发的芯片设计结果信号源默认输出下降沿有效那当然翻转时机不对。然后查D端。如果你做的是D触发器二分频确认Q非是不是真的连回了D是不是中间有个面包板接触不良。最后查复位和置位端这俩在多数芯片里是低电平有效的如果悬空或者被干扰拉低触发器会被一直锁定在复位状态外部时钟再对也没用。我的经验是先把复位端和置位端老老实实接到高电平再谈其他信号。4.2 仿真正常实际电路却乱跳这是“仿真一时爽上电火葬场”的经典场景。最常见的原因之一就是亚稳态。触发器在工作时对数据信号有一个要求在时钟有效沿到来之前数据必须稳定一段时间这个时间叫建立时间在时钟有效沿之后数据还要继续保持一段时间这叫保持时间。你把它想成拍照按下快门前后被拍的人不能动动了照片就糊了。如果数据正好在时钟沿附近变化触发器输出就会进入一种既不是0也不是1的中间状态这个状态一旦被后面的电路采样到就会导致逻辑混乱。消除亚稳态的办法一是在设计上保证数据变化和时钟沿之间有足够余量二是对异步输入的信号做同步处理。比如用两级D触发器把外部按键信号打两拍再去参与逻辑通常能有效降低亚稳态传播的概率。用示波器去抓时钟沿附近的数据波形也是排查这类问题的重要手段。如果数据在时钟沿附近上蹿下跳那就是时序余量不足得考虑加延迟或者重新设计逻辑。4.3 计数到某个数就跳变或卡死计数器跳变的问题多数出在清零逻辑上。举个例子一个模60计数器理论和实际有着微妙差别如果检测“个位为9且十位为5”就去清零但清零动作发生在时钟沿之后中间会产生一个极短暂的“假状态”这个假状态如果同时被高位计数器采样就可能导致进位丢失或者多加一次。排查这种问题时我习惯先在仿真软件里把CLK、复位、各触发器Q端波形全部拉出来逐拍对照看是哪一位的翻转位置不对。还有一个容易被忽略的点如果你用的是异步复位复位信号是一个组合逻辑生成的毛刺那计数器极有可能在非预期时刻被重置。解决办法是改用同步复位或者把复位信号通过一级触发器锁存到下一个时钟沿确保复位动作发生在“合法”的时刻。很多老工程师说“时序电路调试七分看波形”这句话一点不夸张。4.4 常用触发器芯片与参数一览做实验或者做项目时最常用的还是74系列和CD4000系列。下面这张表是我经常用到的几款芯片方便你选型时对照。芯片型号类型封装内单元数简要特点74LS74双D触发器2个上升沿触发带异步置位/复位端TTL电平最常用的D触发器CD4013双D触发器2个CMOS工艺供电范围宽输入阻抗高适合面包板实验74LS112双JK触发器2个下降沿触发带异步置位/复位端适合计数电路CD4027双JK触发器2个CMOS工艺逻辑功能与74LS112类似电平范围更宽74LS160十进制同步计数器1个内部由多个触发器构成可做模10计数适合时钟显示74LS161二进制同步计数器1个模16计数器级联可扩展位宽数字系统常用选芯片的时候记得看供电电压和逻辑电平。TTL芯片一般用5VCMOS芯片如CD4000系列可以工作在3V到15V但不同电压下的速度不一样。给我的学生做实验的建议是先看数据手册datasheet的时序参数再动手接线尤其是触发器的建立时间、保持时间、时钟最高频率这些指标都必须心里有数。5. 写在最后的一点心得我教了这么多年数字电路看过太多学生在时序逻辑电路面前摔跟头。说实话大家学不会往往不是因为智商不够而是上来就背状态方程、画状态图然后被一堆术语吓退了。如果让我给一条最快的入门路径那就是先用与非门搭一个RS触发器用手动开关拨一拨看它怎么保持状态再用一个D触发器做二分频把LED接在输出端看它一秒闪一次。这两个实验做完你对触发器、对时序逻辑电路的感觉就完全不一样了。另外我建议你养成画时序图的习惯。真值表只能告诉你静态逻辑时序图却能告诉你信号之间在时间轴上的先后关系这是调试时序电路最重要的一项基本功。遇到问题别急着换芯片先拿仿真软件把关键节点的波形拉出来眼睛对着时序图看一遍八成问题都能定位。最后再多说一句别怕触发器它真的就是数字世界里的一个小开关一个能记住上次状态的开关。把这个开关玩明白时序逻辑电路的大门就朝你敞开了。
返回列表