ARTICLE DETAIL

资讯详情

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

两片74芯片搭建同步模4可逆计数器:时序逻辑核心实验

两片74芯片搭建同步模4可逆计数器:时序逻辑核心实验 想给数字电路实验加点有意思的实物项目用两片74系列芯片搭一个同步模4可逆计数器是我这些年带学生做时序逻辑入门时最喜欢的保留节目。这个项目用到的核心器件就是74HC74和74HC86一块双D触发器负责状态存储一块四异或门负责方向控制配合面包板上几十根杜邦线十几分钟就能搭出完整电路图接上LED就能看到00→01→10→11正向计数或者反向从00→11→10→01递减把同步时序电路的核心原理摸得明明白白。适合正在学数字电路的同学也适合想重温小规模逻辑设计的工程师拿来练手。1. 方案思路与核心原理为什么用74HC74和74HC86这对组合1.1 选择这两块芯片的底层逻辑很多初学者看到“计数器”第一反应是直接上单片机或者CD4017但我觉得如果想真正理解时序逻辑用分立74系列搭一次是不可替代的过程。74HC74是双D触发器一片刚好提供计数器需要的两位状态存储74HC86是四路二输入异或门正好用来处理加减法方向控制。这个组合的妙处在于D触发器决定了“当前状态”而异或门负责计算“下一个状态”分工非常清晰。选74HC系列而不是74LS系列主要考虑功耗和电源兼容性。74HC是高速CMOS工作电压2~6V5V供电下和TTL电平兼容静态功耗极低面包板上一片74HC74插上5V电源几乎不发热。74LS虽然引脚功能一样但功耗明显更大5V供电时芯片发热明显对学生实验来说没必要。另外74HC系列的输入阻抗很高扇出能力强一个输出可以带几十个负载接线自由度大新手搭错线也不容易烧芯片。关键的选型突破口在于74HC86。四路异或门听起来不起眼但它有一个非常特殊的性质一端输入0时输出等于另一端一端输入1时输出等于另一端取反。这个“可控反相”特性天然适合做可逆计数器的方向控制。也就是说加减计数的本质区别只是高位触发器的翻转条件在低位Q0取不取反之间切换而异或门正好用一个方向控制引脚就完成了这个切换。1.2 同步、模4、可逆三个关键词先吃透“同步”是这个电路里最重要的概念。同步计数器要求所有触发器在同一个时钟边沿同时翻转所以74HC74的两个CLK引脚必须直接并联接同一个脉冲源。和它相对的是异步计数器也叫行波计数器低位触发器的输出Q接到高位的CLK信号像多米诺骨牌一样一级一级往后传。异步电路简单但有个致命缺点高位翻转总比低位晚一个传播延迟时钟频率高了之后中间态就会出现毛刺。比如从01翻到10异步计数器可能会先经历01→00→10在那一瞬间输出短暂的00如果后面接译码电路就会产生错误脉冲。同步方案里所有状态位在同一个时钟沿切换输出和时钟严格对齐没有这个隐患。“模4”指的是计数器在4个状态之间循环也就是2位二进制数00、01、10、11。每来一个时钟脉冲状态按照既定顺序变化一次第4个脉冲之后回到初始状态所以叫模4计数器。想扩展到模8、模16只需要增加触发器和组合逻辑但先把模4吃透后面的路就顺了。“可逆”是指计数方向可以切换。加计数状态从00→01→10→11循环减计数则相反从00→11→10→01循环。注意减计数从00减1等于11这里是按模4取模运算不是有符号数。方向控制端X在电路里就是74HC86异或门的一个输入X接低电平走加计数接高电平走减计数。我用过一个比较形象的类比状态机就像在环形跑道上跑圈模4就是四站公交环线方向控制就是决定顺时针还是逆时针开。1.3 状态转换表计数器的“地图”做时序逻辑设计第一件事是把状态转换表写出来。设Q1为高位输出Q0为低位输出X为方向控制端X0时加计数X1时减计数。加计数X0时当前状态Q1Q0下一状态Q1Q00001011010111100减计数X1时当前状态Q1Q0下一状态Q1Q00011010010011110这张表就是整个设计的核心依据。D触发器的特性是Qnext等于D端输入所以下一状态那一列直接就是D触发器的D端要给的信号。也就是说只要根据当前Q1Q0和方向X算出正确的Q1Q0接回D端电路就能按预想的状态跳变。2. 芯片引脚速查74HC74和74HC86别接错线2.1 74HC74双D触发器引脚功能74HC74是常用双D触发器内部包含两个完全独立的D触发器每个触发器都有预置端PR和清零端CLR。这两个引脚都是低电平有效正常工作时要接高电平接低电平会强制改变输出。CLK是上升沿触发也就是只有在CLK从0跳变到1的瞬间D端的电平才会被锁存到Q输出端其他时间D端怎么变化都不影响输出。拿第一组触发器举例1CLK是3脚1D是2脚1Q是5脚1Q非是6脚1PR是4脚1CLR是1脚。第二组触发器对应的是2CLK在11脚2D在12脚2Q在9脚2Q非在8脚2PR在10脚2CLR在13脚。电源VCC在14脚GND在7脚。我最想提醒新手的一点是Q非端真的是个宝贝。它直接输出Q的反相信号省掉一个反相器用在D触发器连成分频器时非常舒服。这个项目的低位D0就直接用Q非端接回D端一个门都不用额外加。2.2 74HC86四异或门引脚功能74HC86内部集成了四个独立的两输入异或门输入端分别是A和B输出端是Y。第一组1A是1脚1B是2脚1Y是3脚第二组2A是4脚2B是5脚2Y是6脚第三组3A是9脚3B是10脚3Y是8脚第四组4A是12脚4B是13脚4Y是11脚。VCC在14脚GND在7脚和大多数74系列芯片一致用起来不用刻意记。异或门的逻辑很简单两个输入相同输出0不同输出1。但更重要的工程属性是它作为“可控反相器”的用法。把A端当作信号输入把B端当作控制端控制端为0时输出跟随A控制端为1时输出就是A取反。这个特性在本项目中就是方向切换的灵魂。还有一个必须提醒的细节74HC86是CMOS器件所有输入端绝对不能悬空。CMOS输入端悬空时引脚电位会因为周围电场和漏电流飘忽不定芯片可能会输出不确定信号还会因为输入级两个管子同时导通导致静态电流增大。所以用不到的那两个异或门也要把所有输入接到GND或VCC不能就那么空着。2.3 异或门的“方向开关”到底是怎么工作的这一节是整个设计里最值得琢磨的地方。模2计数也就是1位二进制计数Q0每个时钟沿都会翻转一次这一点和方向无关所以低位不用方向控制直接用Q0非接回D0就行。真正需要动脑的是高位Q1什么时候翻转。加计数时Q1只有在Q0为1的时钟沿才翻转。从状态表看01→10时Q1翻转11→00时Q1也翻转而00→01和10→11时Q1保持不变。这个规律写成逻辑表达式就是Q1 Q1 ⊕ Q0。减法时恰恰相反Q1在Q0为0的时钟沿翻转也就是00→11和10→01时翻转所以Q1 Q1 ⊕ 非Q0。把两个式子统一成一个表达式用方向控制端X来选择X0时取Q0X1时取非Q0。异或门刚好能做这个“选择”Q0 ⊕ XX0时结果就是Q0X1时结果就是非Q0。这个中间结果再和Q1异或一次就是最终D1信号。这也是为什么74HC86在这个项目里这么关键它用两个异或门就完成了方向切换和状态计算两件事。3. 逻辑表达式推导从真值表到D触发器D端3.1 D触发器的核心D端输入就是下一个状态D触发器是所有时序电路里最容易理解的一种。它的特性方程就是Qnext DCLK上升沿到来时D端是什么电平Q端就变成什么电平之后即使D端变化Q端也保持住直到下一个上升沿。这个特性相当于在数字系统里加了一个“快门”只在固定时刻采样输入。既然Qnext等于D那么设计计数器就变成了找“下一状态的逻辑表达式”。我们不需要关心当前Q输出怎么维持只要保证每个时钟沿来临前D端已经稳定在了我们想要的下一个状态。这也是同步时序电路的设计方法论先画状态图写状态表然后推导组合逻辑方程最后用D触发器把状态锁存住。低位Q0最简单。看状态表无论是加计数还是减计数Q0总是从0变1、从1变0也就是说每个时钟沿都要翻转。翻转电路的标准做法就是把Q0非端接回D0端CLK一到Q0取上一次Q0的反完成二分频。这也是我说74HC74自带的Q非端好用的原因如果芯片没有互补输出就得另加反相器又多一根线。3.2 高位D1表达式推导过程高位Q1的表达式需要仔细推。我先把加计数和减计数写成两个分立的真值表再合并。加计数X0时Q1的取值Q1Q0Q1000011101110这四个点刚好满足异或关系Q1 Q1 ⊕ Q0。验证一下Q1Q001时是0⊕11Q1Q010时是1⊕01Q1Q011时是1⊕10完全正确。减计数X1时Q1的取值Q1Q0Q1001010100111这时候Q1 Q1 ⊕ 非Q0。验算Q1Q000时是0⊕11Q1Q001时是0⊕00正确。合并这两个式子关键是把“当X0时选Q0当X1时选非Q0”这件事用逻辑门表达出来。如果用手动开关切换当然可以把Q0和非Q0都引出来接一个二选一多路开关但这样要额外芯片不优雅。异或门正好提供简洁方案中间变量M Q0 ⊕ X。X0时MQ0X1时M非Q0。于是统一的表达式就是D1 Q1 ⊕ (Q0 ⊕ X)把X0代入D1 Q1 ⊕ Q0把X1代入D1 Q1 ⊕ 非Q0。一个式子管住两个方向干净利落。3.3 两个异或门的分工与连接方案根据上面的推导74HC86里只需要两个异或门就能完成任务。第一个异或门做方向选择输入分别是Q0和方向控制X输出记为MM Q0 ⊕ X。第二个异或门做状态计算输入是M和Q1输出接D1D1 Q1 ⊕ M Q1 ⊕ (Q0 ⊕ X)。低位D0不用异或门直接用74HC74第一组触发器的Q非端接回D端。这样整个项目其实只用了74HC86的一半资源剩下两个异或门空闲。我在实物连接时习惯把空闲门的两个输入都接地输出悬空防止CMOS输入悬空引起损耗和噪声。如果你手头只有一片74HC86也完全够用不需要第二片。我经常在课堂里强调逻辑设计的乐趣就在这一步一个看起来很复杂的状态转换通过真值表观察规律再用一个基础门电路把表达式优雅地实现出来。这比拿到需求就打开HDL写代码更能锻炼底层逻辑感。4. 完整电路图与面包板接线照着插就能跑4.1 元件清单先把料备齐动手之前先清点物料免得到一半发现缺电阻。整个项目用到的器件很少我习惯把它称为“两片芯片的极简时序实验”。除了74HC74和74HC86两块芯片还需要两个LED分别显示Q1和Q0两个限流电阻330Ω到1kΩ均可我常用560ΩLED亮度适中。复位电路需要两个1kΩ上拉电阻如果想做上电自动复位再加一个10kΩ电阻和一个10μF电解电容。方向控制用一个单刀双掷开关时钟源可以用函数信号发生器、按钮加消抖电路或者直接用Arduino输出方波。面包板一块跳线若干5V电源一个就这些。LED限流电阻的计算是这样设LED工作电流5mA正向压降约2V5V供电下电阻分压3VR3V/5mA600Ω取标称值560Ω完全在安全范围。电流再大一点到10mA电阻取330Ω也行亮度更高只是LED寿命会稍微缩短。数字电路的输出驱动能力通常能扛20mA驱动LED毫无压力。4.2 引脚连接总表这就是完整电路图的文字版下面这张表是整个电路的连线清单我建议拿到手先对着表在电路图上把线画一遍再上面包板。我把74HC74记作IC174HC86记作IC2。连接对象起点终点电源正5VIC1的14脚、IC2的14脚电源地GNDIC1的7脚、IC2的7脚时钟输入CLK信号IC1的3脚、IC1的11脚低位D端IC1的6脚(Q0非)IC1的2脚(D0)方向信号方向开关XIC2的2脚(1B)中间变量输入IC1的5脚(Q0)IC2的1脚(1A)中间变量输出IC2的3脚(1Y)IC2的4脚(2A)高位Q接入IC1的9脚(Q1)IC2的5脚(2B)高位D端IC2的6脚(2Y)IC1的12脚(D1)清零引脚复位信号节点IC1的1脚、IC1的13脚预置引脚5VIC1的4脚、IC1的10脚低位显示IC1的5脚(Q0)LED0阳极LED0阴极经电阻到GND高位显示IC1的9脚(Q1)LED1阳极LED1阴极经电阻到GND这张表对初学者来说是整套电路图最关键的替代它把所有需要动手连接的节点都列清楚了。注意中间信号M是从74HC86的1Y输出到2A输入2Y输出到74HC74的2D别接成从2Y回1A逻辑本身对称所以影响不大但走线会绕很多。4.3 分模块搭接实操步骤我实测下来按“电源与面包板布局→触发器低位自环→异或门方向电路→高位D信号→复位显示”这个顺序搭最不容易乱。第一步把74HC74和74HC86横跨在面包板中间的凹槽上芯片缺口朝左1脚在左下角。面包板左右两边各有两条电源轨一条标记正极一条标记负极。用跳线把面包板左侧和右侧的两条电源正极连起来、两条负极也连起来然后给芯片14脚接正7脚接负。第二步搭低位反馈环。把IC1的6脚也就是Q0非接到2脚D0先用杜邦线短接。这一步完成后先不接高位任何线单独给IC1的3脚CLK输入一个1Hz方波观察5脚Q0的LED应该每秒钟翻转一次。如果这一步能亮说明74HC74供电和触发都正常后面再往下搭就有底了。第三步搭74HC86的方向选择部分。IC2的1脚接IC1的5脚Q0IC2的2脚接方向开关XIC2的3脚输出M。方向开关一端接GND、一端接5V、中间接IC2的2脚也就是标准的单刀双掷接法。此时先不要接IC2的4脚连线用示波器或万用表量一下3脚X0时它应该和Q0同相X1时应该是反相的。第四步搭高位D信号。把IC2的3脚接到4脚IC1的9脚Q1接到IC2的5脚IC2的6脚输出接回IC1的12脚D1。这个时刻电路就闭环了。加上两位LED接上1Hz时钟切换方向开关就应该能看到加计数和减计数的完整过程。我在搭这个过程时发现最容易犯的错误是高位Q1的引出线接错引脚。74HC74第二组触发器的Q在9脚Q非在8脚这两个相邻新手很容易把Q1接到8脚上去。一旦接错电路会变成一个奇怪的状态机计数顺序完全不对。所以接完线一定要对着引脚表从头到尾复查一遍尤其是8和9这对邻居。4.4 加上电自动复位电路告别乱码上电瞬间D触发器内部状态可能是随机的可能开机就在01也可能在11这在实验里容易让人困惑。解决方法是给两个清零端CLR加一个RC上电复位电路。74HC74的CLR是低电平有效正常工作时必须为高。最常见的做法是把1脚和13脚并联通过一个1kΩ电阻接VCC同时在1脚和13脚节点再接一个10μF电容到GND。上电瞬间电容两端电压为0等效把CLR拉到地触发一段时间低电平把所有Q清成0。随着电容通过1kΩ电阻充电节点电压逐渐升高到VCC大约经过一个时间常数τRC1kΩ×10μF10ms复位完成计数器从00开始跑。如果想保留手动复位功能就在这个节点再并接一个按键按键另一端接地按下时强制清零。注意两个PR预置端要直接接VCC不能让PR和CLR同时为低否则触发器进入不确定状态这是74HC74数据手册里明确禁止的情况。提示正常工作时PR和CLR绝对不能同时为低电平否则D触发器输出不确定。本项目中PR固定接高CLR用RC上电复位逻辑上非常安全。5. 仿真验证与实物调试从Multisim到面包板5.1 先用Multisim把电路图跑通我建议所有初学者都先在Multisim里搭一遍再碰实物。Multisim的元件库里直接搜索74HC74N和74HC86D就能找到对应模型。把两个芯片拖到画布后按照前面那张引脚连接总表连线时钟源用Sources库里的数字时钟频率设置1kHz。方向控制用开关仿真时按空格键就能切换X状态非常方便。在Multisim里有个特别容易坑人的点74HC系列的模型有些版本带隐藏的电源引脚有些版本需要在芯片属性里显式接VCC。如果你连完仿真发现输出一直是高阻或者没有反应先检查芯片的电源引脚是否已经正确连到5V。另外一个常见问题是逻辑探针的参考地要和电路GND一致如果探针悬空状态指示灯会乱闪。用Multisim的虚拟示波器可以看到很清晰的时序关系Q0在每个时钟上升沿翻转Q1在加计数时每个时钟周期翻转两次。把两个波形叠在一起能看到同步计数器的特征——Q1的跳变沿严格对齐时钟沿不会出现异步计数器那种微小延迟。靠这个仿真截图我甚至能把时钟频率拉到10MHz看极限性能但实物面包板拉到10MHz就会受分布电容干扰这也是仿真和实物的区别之一。仿真跑通后别忘了尝试方向切换。按下空格键让X变成1观察状态从00→11→10→01递减。如果仿真通过实物的逻辑大概率也没问题后面调试就主要针对接触不良和接线错误了。5.2 面板板实测记录LED状态和示波器波形我实际搭这块板子时用的是Arduino的D13脚输出1Hz方波当时钟源因为5V电压正好和74HC系列兼容不需要额外电平转换。上电瞬间LED状态不可预估这是正常的。我做了RC上电复位之后每次上电都稳定从00开始。加计数时LED显示00→01→10→11循环每次时钟变一次。切到减计数后状态从00直接跳到11然后11→10→01→00这个跳跃正好说明了模4减法的取模运算。可能有人疑惑为什么00减1是11而不是-1因为在4状态循环里00的前一个状态就是11就像时钟从0点往前拨1小时到11点一样。用示波器同时测CLK和Q0能看到Q0的频率正好是CLK的一半占空比接近50%。再测Q1加计数时每4个时钟里翻转两次平均频率是CLK的四分之一但不是规整的方波所以“模4分频”和“四分频”的说法要区分只有偶数模在特定接法下才能得到均匀方波分频。这个细节在做分频器设计时尤其重要。我实测的电压数据供参考5.03V供电高电平输出约4.85V低电平输出约0.08V属于HC系列标准水平。LED串联560Ω电阻后亮灭差异非常明显即使室内灯光直射也能看清。如果LED暗得看不清先量一下输出端电压再检查限流电阻是不是接错成了10kΩ。5.3 常见问题与排查技巧实录把我在调试过程中遇到最多的问题整理成一张速查表遇到故障直接对号入座能省下大量时间。故障现象可能原因排查方法LED全不亮芯片微热电源接反或输出短路立刻断电量14脚到7脚电压是否为4.5V以上计数没反应LED保持常亮或全灭CLK没有有效上升沿示波器看CLK波形换成信号源或Arduino方波每按一次按钮跳多个状态机械按键抖动用信号源代替手动脉冲或加RC消抖电路只有Q0在翻Q1不动D1没接到12脚或74HC86输出悬空检查2Y(6脚)到12脚连线量6脚是否有电平变化方向开关不起作用X端悬空确保X接GND或5V开关中间脚别接错上电状态不确定没有复位电路加RC上电复位或手动按清零键芯片发烫特别快14脚和7脚间短路或输出直接接地断电后万用表蜂鸣档量VCC和GND是否短路还有一个容易忽略的问题面包板长期使用后内部的金属簧片会松动插进去的跳线可能实际没接触上。我遇到过好几次高位触发器不工作排查了半天最后只是把线拔出来重新插紧就恢复了。所以如果逻辑肯定没问题先重插一遍所有跳线往往比研究半天电路更有效。说到消抖手动按键在低速计数器上还挺害人。我试过直接用按钮给CLK按下和松开的瞬间触点会弹跳几十毫秒产生好几个脉冲计数器一次跳好几个数看起来像故障。最简单的消抖方案是按键串联1kΩ电阻后并联10μF电容电容充放电把毛刺滤掉。也可以换成74HC14施密特触发器整形效果更好。但最推荐的做法还是用信号发生器或板载晶振做时钟源手动按键只用作复位这样调试效率高得多。6. 从模4到模16扩展玩法与经验体会计数器搭好之后别急着拆这个电路稍微改一下就能延伸出很多玩法。最直接的扩展是把工作时钟频率提高到100kHz用示波器能看到完整的计数时序配合逻辑分析仪可以抓取毛刺。如果对显示不满意可以把Q1Q0接到74LS47加共阳数码管显示0到3的十进制数字观感直接上一个档次。想扩展到模8或模16核心思路不变增加一个D触发器做Q2两片74HC74刚好提供4个触发器足够做模16。高位D2的表达式依然遵循“加法看所有低位是否全1减法看所有低位是否全0”的规律用异或门和与门组合就能实现。我建议有兴趣的朋友先自己推导模8的D2表达式再用Multisim仿真验证这个过程比抄现成电路图有价值得多。我个人在实际操作中的体会是这类小电路千万别跳过数学推导直接插线。真值表和分析表达式只花十分钟却能避免物理世界里最磨人的“看起来逻辑没问题就是不工作”。另外强烈建议仿真和实物并行Multisim跑通代表逻辑设计正确实物跑通代表工程问题可控两者重叠的部分才算真正掌握。最后分享一个我踩过几次坑之后学到的选线技巧在面包板上接线时把跳线按下压平保证引脚完全插入弹簧片不要留半截在外面。多用不同颜色的线区分功能红色接电源、黑色接地、蓝色走时钟、黄色走信号接线混乱时一眼就能看出谁是谁。这个习惯在复杂数字系统里能救你无数次。
返回列表