ARTICLE DETAIL

资讯详情

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

用两个芯片搭出同步模4可逆计数器:从状态方程到面包板实践

用两个芯片搭出同步模4可逆计数器:从状态方程到面包板实践 1. 项目概述与设计思路1.1 同步模4可逆计数器到底是什么先把这个名字拆开讲清楚。所谓“模4计数器”就是状态总数只有4个的计数器——对应二进制就是00、01、10、11这4个状态所以核心是两位输出Q1Q0。不少同学一上来就问“为什么要两位”答案很直接模4就是4个状态2的2次方等于4所以需要2个触发器。如果你要模8就得3个触发器这是配套关系。那“同步”又是什么概念同步计数器里所有触发器共用一个时钟源。每次时钟边沿到来时所有需要翻转的触发器同时动作不存在逐级传递的延迟。这一点在高速数字电路里特别重要——异步计数器虽然结构简单但进位信号是一级一级“串”过去的位数一多高位翻转就比低位晚几个门延迟这在示波器上会看到明显的毛刺严重的时候整个计数器状态都是乱跳的。至于“可逆”就是既能正向计数00→01→10→11→00循环也能反向计数11→10→01→00→11循环。这个功能在实际工程里太常用了电机正反转计数、步进电机方向控制、音频波形发生器里的上下扫频、采集系统里的“先到终点再回头扫”……都是可逆计数器的典型场景。这个项目最吸引我的地方是它只用两块芯片就搞定整个逻辑一块是74HC74双D触发器另一块是74HC86四异或门。两片芯片加几个电阻、LED、按钮面包板上半小时就能搭出来。它不像单片机方案那样“写几行代码就完事”而是让你真实感受到组合逻辑和时序逻辑的配合关系——D触发器负责“记住”当前状态异或门负责“计算”下一个状态。整个计数器工作的核心其实就是这两者的无缝衔接。1.2 为什么选74HC74和74HC86这个组合在数字电路课上计数器通常用JK触发器来教因为JK触发器翻转账灵活能直接配出各种计数逻辑。那这里为什么改用D触发器加异或门原因有两个。第一个原因是器件通用性。74HC74是市面上最常用的双D触发器芯片74HC86是四异或门两块都是74系列标准逻辑门价格便宜、采购方便、资料多、面包板好插。比起专用计数器芯片比如74HC193这种本身就带可逆功能的计数器用通用逻辑门搭出来的电路更能帮助你理解计数器状态方程是怎么推导出来的。第二个原因也是我觉得项目含金量最高的地方D触发器的次态方程是Q⁺ D也就是说“D输入是什么下一个状态就是什么”。所以设计计数器的本质就是要找出D0、D1这两个输入信号跟上个状态Q1Q0、方向控制U之间的逻辑关系。而74HC86的异或门在这里扮演了一个非常巧妙、非常经典的角色——可控反相器当U0时U⊕Q0输出原值Q0当U1时U⊕Q0输出反相值Q̄0。一个门同时实现“原路走”和“反向走”两种功能电路结构因此变得特别简洁。所以这个组合不是随便选的74HC74负责“锁存状态”74HC86负责“算下一状态”分工明确原理清晰。搭完这块电路你对同步时序电路设计的理解绝对会上一个台阶。2. 芯片级原理拆解从引脚到状态方程2.1 74HC74与74HC86引脚功能速查这一步非常关键建议先对照数据手册确认引脚位置再动手插面包板插错一个脚排查起来会很痛苦。74HC74双D触发器DIP-14封装引脚号名称功能11CLR触发器1异步清零低有效21D触发器1数据输入31CLK触发器1时钟上升沿触发41PRE触发器1异步置位低有效51Q触发器1正相输出61Q̄触发器1反相输出7GND接地82Q̄触发器2反相输出92Q触发器2正相输出102PRE触发器2异步置位低有效112CLK触发器2时钟上升沿触发122D触发器2数据输入132CLR触发器2异步清零低有效14VCC电源正极2V6V74HC86四异或门DIP-14封装引脚号名称功能11A异或门1输入A21B异或门1输入B31Y异或门1输出Y A⊕B42A异或门2输入A52B异或门2输入B62Y异或门2输出Y A⊕B7GND接地83Y异或门3输出Y A⊕B93A异或门3输入A103B异或门3输入B114Y异或门4输出Y A⊕B124A异或门4输入A134B异或门4输入B14VCC电源正极这里有个特别要注意的点74HC74的CLR和PRE是异步有效且低电平才能触发。也就是说如果这两个引脚被拉低不管时钟是什么状态Q会被强制置位或清零。正常计数时必须把CLR和PRE都接到高电平。很多初学者搭完电路发现计数器不工作查来查去发现是清零/置位引脚悬空或者误接地这个问题非常常见。2.2 模4可逆计数器的真值表与状态方程推导先说结论再讲推导过程。假设方向控制信号为U约定U0时加法计数U1时减法计数。加法计数U0状态转移表现态Q1Q0次态Q1⁺Q0⁺0001011010111100减法计数U1状态转移表现态Q1Q0次态Q1⁺Q0⁺1110100101000011现在开始推导D0和D1的表达式。刚才说过D触发器的次态就等于D输入所以D0 Q0⁺D1 Q1⁺。先看最低位Q0。不管是加法还是减法每次状态跳变Q0一定翻转加法00→01时Q0从0变101→10时Q0从1变0减法反过来也一样。所以Q0⁺ Q̄0也就是说D0 Q̄0。这个非门逻辑用异或门就可以实现让Q0和一个固定高电平做异或Q0 ⊕ 1 Q̄0。74HC86的异或门输入B接VCC即可。再看高位Q1。加法计数时Q1⁺ Q1 ⊕ Q0这个式子是教科书里的标准结论验证一下Q1Q001时Q1⊕Q0 0⊕1 1下一状态Q11对Q1Q011时Q1⊕Q0 1⊕1 0下一状态Q10对。减法计数时Q1⁺ Q1 ⊕ Q̄0Q1Q010时1⊕1 0符合10→01的跳变Q1Q000时0⊕1 1符合00→11的跳变。能不能把这两个式子合并成一个观察发现加法时Q1⁺ Q1⊕Q0减法时Q1⁺ Q1⊕Q̄0。而Q̄0在加法时要变成Q0在减法时要变成Q̄0——这不正好就是“方向控制信号U和Q0异或”的结果吗U0时U⊕Q0 Q0U1时U⊕Q0 Q̄0。所以D1 Q1 ⊕ (U ⊕ Q0)D0 Q0 ⊕ 1整个电路所需的异或门数量数一下第一个异或门算U⊕Q0第二个异或门再跟Q1异或算D1第三个异或门把Q0取反算D0一共3个异或门。74HC86里有4个还有一个空余可以留着备用或者接地处理。这里再补充一句如果你用卡诺图来化简也会得到同样的表达式。异或门的“可控反相”特性在这里帮了大忙一个门就搞定了加/减逻辑的切换电路简单到几乎不需要额外连线。3. 完整电路搭建实操3.1 电路连接清单与要点说明下面这份清单是我按面包板实际走线整理的建议照着顺序接不容易漏。材料准备74HC74双D触发器 × 174HC86四异或门 × 1面包板 × 15V直流电源USB供电或稳压电源均可发光二极管LED × 2指示Q1Q0状态330Ω电阻 × 2LED限流用10kΩ电阻 × 3按钮上拉/下拉用具体看接法轻触按钮 × 2一个用于产生单步时钟一个用于方向控制面包板跳线若干核心连线明细电源与地两片芯片的VCC14脚接5VGND7脚接地。这一步先做养成习惯。连接方向控制信号U用一个10kΩ电阻把74HC86的1B脚2脚下拉到地再把按钮一端接5V、另一端接1B脚。按钮不按时1B保持低电平即U0计数器加法按下按钮时1B被拉到高电平U1计数器减法。这个10kΩ下拉电阻很关键保证方向控制引脚永远有一个确定的电平不会悬空。接时钟信号CLK时钟可以来自信号发生器也可以用手动按钮产生。手动按钮需要一个防抖动处理——最简单的办法是按钮一端接5V另一端接一个10kΩ下拉电阻到地输出端接74HC74的3脚1CLK和11脚2CLK。按一次按钮输出端产生一个从低到高的跳变这就是一个时钟上升沿。不过手动按钮物理上会有机械抖动一次按压可能产生多个上升沿计数器会多跳几下。想严谨的话可以用施密特触发器整形或者用信号发生器输出一个5V方波频率设在1Hz左右肉眼观察LED最直观。连接D0链74HC74的2Q9脚作为Q174HC74的1Q5脚作为Q0。把Q0接到74HC86的3A脚9脚3B脚10脚接VCC用跳线直接接到5V3Y脚8脚输出Q̅0接到74HC74的2D脚12脚。这样D0 Q̄0就接好了。连接D1链方向控制信号U接到74HC86的1B脚2脚Q0接到1A脚1脚1Y脚3脚输出U⊕Q0接到第2个异或门的2A脚4脚。再把Q174HC74的9脚接到2B脚5脚2Y脚6脚输出Q1⊕(U⊕Q0)接到74HC74的1D脚2脚。D1链路完成。处理异步置位/清零脚74HC74的1CLR1脚、1PRE4脚、2CLR13脚、2PRE10脚全部接到5V。注意这四个脚必须接高电平悬空会出问题这是74HC系列芯片特别容易踩的坑。状态显示用两个LED分别接Q074HC74的5脚和Q174HC74的9脚LED另一端串联330Ω电阻再到地。这样LED亮表示该位为1灭表示该位为0。整体电路功能Q1Q0为两位计数输出U0时按加1顺序循环U1时按减1顺序循环时钟每来一个上升沿计数器状态更新一次。3.2 面包板搭建分步走从零到一不踩坑很多第一次搭电路的朋友喜欢把所有跳线一下子插完结果出了问题根本无从下手。我建议按下面这个顺序分阶段搭。第一步先上电不接逻辑信号。把两片芯片插在面包板中间凹槽两侧注意芯片方向——有半圆凹口的一端朝左1号引脚在凹口左下方。接好VCC和GND后用万用表确认芯片14脚和7脚之间确实是5V。这一步能排除最基础的供电问题。第二步固定清零和置位引脚。把74HC74的1CLR、1PRE、2CLR、2PRE全部接高电平。对74HC74来说这四个脚如果悬空或误接地触发器永远不会正常工作。先把它处理好后面所有逻辑才有意义。第三步单独测试D触发器。不接异或门先把74HC74的1D2脚接高电平然后手动给3脚1CLK送一个上升沿观察5脚1Q是否变成高电平。再把1D接地再来一个上升沿看Q是否变低。这个测试看起来很基础但它能确认D触发器本身是好的也能让你直观感受“D触发器的输出是跟随时钟沿锁存D输入”的最基本原理。第四步接异或门连接D0链路。先不接方向控制U把U端固定接地U0。接好D0 Q̄0链路后手动给时钟观察Q0是否每次时钟沿都翻转。这一步基本能看到00→01→10→11的加法循环了——前提是D1链路也接好。第五步接D1链路验证加法计数。把前文核心连线明细里的第5步接好此时方向控制仍然固定接地U0。手动按按钮应看到LED按00→01→10→11→00循环变化。如果状态跳变不对先停下来检查D1的连线再往下走。第六步接入方向控制验证减法。把方向按钮接上U悬空测试一下——不对U不能悬空U端是接了下拉电阻的。按下方向按钮使U1再按时钟按钮应看到状态反向循环11→10→01→00→11。第七步换用信号发生器连续时钟。手动按钮验证都正确后拆掉按钮用信号发生器输出1Hz方波接到CLK端。这时候你应该能稳定地看到LED循环计数不会有抖动问题。如果家里只有按钮没有信号发生器也可以把按钮一直按着观察LED乱跳——这其实是抖动导致的反而能帮你理解什么是“一次按键产生多次上升沿”的机械抖动现象。3.3 测试结果记录与波形分析搭好并跑起来之后建议用逻辑分析仪或者示波器观察一下真实波形加深理解。如果手头没有仪器用LED加慢速时钟也能判断。用手动按钮按顺序打时钟把观察到的状态变化记录下来应该得到下面这张表时钟序号U0时的Q1Q0U1时的Q1Q01001120110310014110050011如果用的示波器观察Q1和Q0两路波形加法计数时Q0的频率是时钟频率的一半Q1的频率是时钟频率的四分之一两路都是方波但Q1的上升沿永远比Q0晚半个时钟周期因为Q1在Q0为1时才会翻转。减法计数验证重点看方向切换瞬间U从0跳变到1时Q1Q0必须立刻从当前状态开始反向走而不是先跳到别的状态再回来。这里有一个很多人容易忽略的点方向控制信号U是异步变化的。也就是说U改变的时刻不一定要跟时钟沿对齐。实际电路里U的变化只要在时钟边沿到来之前稳定下来就能保证下一个状态按新方向走。设计时最好在改变U之后的几个微秒内再触发时钟尤其是在高频场景下这个时序容限很重要。4. 常见问题与排查技巧实录4.1 高频故障速查表下面是实际操作中最高频的问题我按“现象→原因→解决”整理成了表格建议搭电路遇到麻烦时先对着表过一遍。现象可能原因排查与解决上电后LED全灭或全亮按时钟没反应芯片没供电CLR/PRE悬空或误接地芯片方向插反用万用表量14脚和7脚电压是否为5V把CLR和PRE都接到高电平确认芯片凹口方向和1脚位置LED亮但状态跳变顺序不对比如00→10→11D1表达式接错Q1或U⊕Q0连线位置不对断开电源从D1链路逐段量连通性重点检查74HC86的3脚到4脚、6脚到74HC74的2脚之间的跳线按一次按钮LED跳了两个或更多状态按钮机械抖动一个上升沿变成了多个上升沿用信号发生器输出1Hz方波代替按钮或者给按钮输出加一个RC滤波器电容并联在输出端电容取10μF效果还行方向控制按钮没反应U1时仍然是加法方向控制端悬空或上拉/下拉电阻接错确认1B脚74HC86的2脚是否有10kΩ下拉电阻到地按下按钮后量2脚电压是否接近5V时钟正常但Q0不动D0链路断线或者74HC86的3B脚没有接VCC量Q̅0输出3Y8脚到74HC74的2D12脚之间是否有断线确认3B10脚确实接到了高电平某个LED特别暗或不亮LED限流电阻过大或LED极性接反330Ω电阻通常足够亮LED长脚为正极应接输出端短脚通过电阻接地芯片发烫电源接反或输出端短路立即断电检查VCC和GND是否接反检查是否有输出引脚直接接地或接VCC4.2 实操心得与避坑指南这个电路我前后搭过好几遍踩过不少坑有几个心得特别想分享。第一个心得方向控制信号别悬空。很多初学者觉得方向控制不按按钮就是“没信号”悬空没关系。实际上74HC系列芯片的输入引脚悬空时电平是不确定的可能被内部电路判成高电平也可能判成低电平。结果就是计数器状态乱跳。所以方向控制必须用电阻固定默认电平要么接一个10kΩ下拉电阻默认低电平要么接10kΩ上拉电阻默认高电平按按钮再切换。第二个心得面包板电源要就近加去耦电容。面包板上的长条形电源轨有分布电感瞬间电流变化会产生电压毛刺。如果电路在低频手动时钟下能工作一旦换成几百kHz的信号发生器时钟就出现乱计数这大概率是电源噪声问题。在两块芯片的VCC和GND之间各接一个0.1μF陶瓷电容能明显改善稳定性。动手快的朋友还可以在电源入口加一个10μF的电解电容做蓄能。第三个心得按钮抖动是“教学事故”重灾区。我给朋友演示这个电路的时候十次有八次是按钮抖动导致计数器一次跳两步。手动按钮看着很简单内部簧片接触时会产生微秒到毫秒级的反复通断一个上升沿瞬间变成一串上升沿。如果手头没有信号发生器最粗暴的解决办法是把10μF电容并联在CLK输出端到地之间电阻再分压这样按钮产生的边沿会被电容“抹平”。但它也会降低边沿斜率速度快时可能不可靠。真正做项目时还是建议用施密特触发器电路做按键消抖。第四个心得芯片输入引脚多余端不能悬空。74HC86有4个异或门本例只用到3个剩下一个异或门的所有输入端都要接地或接VCC不能悬空。这是TTL/CMOS数字电路的通用规则悬空输入相当于给它一个不确定电平不仅这个门自己工作不正常还可能在输入端产生振荡电流影响整片芯片的稳定性。剩下这个门的输入端全部接到地输出端空着就可以了。第五个心得考虑功能扩展时这个电路还有很大的上升空间。我实际搭完发现三个异或门用完之后剩下的那个门正好可以用来做“进位/借位输出”当U0且状态为11时输出一个高电平脉冲表示进位当U1且状态为00时输出高电平表示借位。用这个信号驱动下一级计数器就能把两片级联成模16可逆计数器。这个扩展我推荐每一位都能动手试试体会一下“当前状态组合产生控制信号”的设计思路。第六个心得电阻选值有讲究别乱用。LED限流电阻的选值跟电源电压和LED压降有关。5V电源、红色LED压降约1.8V330Ω电阻下的电流约10mA亮度适中。如果换成2V供电74HC系列最低工作电压限流电阻就要降否则LED太暗。方向控制的下拉电阻用10kΩ没问题但如果你用1MΩ按下按钮时引脚上的噪声容易被放大造成误触发。数字电路里10kΩ算是比较稳妥的通用选择。第七个心得清理面包板是必修课。面包板插久了触点会氧化变松导致内部连线接触不良。表现就是电路明明看着对但就是偶尔不工作或者用手按一下芯片附近计数器突然恢复正常。遇到这种“幽灵故障”先别急着怀疑逻辑把相关跳线拔出来重新插一遍或者换几根新跳线往往问题就消失了。我工作室里常备一包新跳线排查这类故障时特别好用。5. 扩展思考从模4到模N的通用设计方法这个项目虽然只是模4但它背后的方法论可以直接推广到模8、模16甚至任意模数的可逆计数器。关键在于你到底想把计数器接几位。先说级联方法。如果事情需要模16计数器最简单的做法是把两块74HC74拼成4位两块74HC86拼逻辑。但更优雅的方案是“模4级联”——用刚才提到的进位/借位信号作为下一级的时钟。当U0时第一级从11跳回00的瞬间产生一个进位脉冲送到第二级的时钟端第二级加1当U1时第一级从00跳到11的瞬间产生借位脉冲第二级减1。这种波纹级联方式在低速时完全可用而且每级电路结构和现在搭的完全一样扩展性非常好。再说状态方程的一般化方法。任意模数同步计数器的设计流程都是固定的先画状态转移图列出真值表再用卡诺图化简出每个触发器的D表达式。这个流程对模4、模8、模10十进制都成立。区别只是模10计数器在状态1010时要强制回到0000需要额外的反馈清零逻辑。理解了这一点数字电路里的计数器设计你基本就掌握了八成。最后再分享一个比较好玩的扩展方向把LED输出接到一个R-2R梯形电阻网络就能把计数器变成简易波形发生器。随着计数器循环加减DAC输出电压呈现三角波。这时候你再回头看“可逆计数器有什么用”答案就不言自明了——它是很多信号源波形产生电路的基础模块。从我个人经验来说这个项目的最大价值不在于“模4”本身而在于它演示了组合逻辑与时序逻辑如何协作触发器是“存储器”负责记住当前状态异或门是“计算器”负责根据当前状态和方向控制算出下一状态。一旦理解了这种“记忆计算”的分工模式再看CPU里的程序计数器、通信协议里的帧序号产生器都会觉得眼熟很多。这也是我为什么推荐每一位数字电路学习者都亲手搭一遍这块电路——理论课上学十个真值表不如亲手点亮一个LED来得印象深刻。
返回列表