
1. 先拆需求模4、同步、可逆每个词都在限制电路结构看到这个标题我的第一反应是这是典型的“教科书电路活生生落到面包板”的场景。74HC74是双D触发器74HC86是四路2输入异或门这两个芯片凑在一起正好能拼出一个很干净的同步模4可逆计数器。虽然现在随便拿一片74HC193就能实现加减计数但用触发器加逻辑门自己搭一遍才能真正看明白“状态方程是怎么来的”。先说清楚需求里的三个关键词。模4意思是计数器只有4个状态。用两位二进制表示就是00、01、10、11一共4个状态走完一圈后回到00。可逆就是既能加计数也能减计数。加计数时按00→01→10→11→00循环减计数时反过来按00→11→10→01→00循环。同步指的是两个触发器共用一个时钟所有状态变化都发生在同一个时钟上升沿而不是像异步计数器那样一级一级“ ripple”过去。这三点合在一起决定了电路不能用“把前一级输出接后一级时钟”的偷懒方案必须老老实实把每个触发器的D输入方程算出来。1.1 模4计数器的状态表长什么样先把两种方向的次态表列出来。这里用Q1Q0表示当前状态Q1是高一位Q0是低一位。当前状态 Q1Q0加计数次态减计数次态000111011000101101110010这张表是整个设计的起点。后面所有逻辑门的连接方式都是从这张表推出来的。从表里能直接看出一个规律不管加计数还是减计数Q0每次时钟到来都会翻转。00变01Q0从0变101变10Q0从1变010变11Q0从0变111变00Q0从1变0。因此Q0就是一个最简单的T触发器时钟每来一个上升沿翻转一次。Q1就没有这么简单了。加计数时Q1只在Q0为1的时候翻转减计数时Q1只在Q0为0的时候翻转。这个差异就是方向控制要处理的核心问题。1.2 “同步”不是加分项而是电路结构前提异步计数器简单但有一个毛病高位触发器的时钟来自低位输出从低位变化到高位稳定需要经过一段传播延迟。如果时钟频率比较高或者中间经过多级级联很容易出现毛刺甚至数出错误状态。同步计数器把这些延迟问题从根上去掉了。所有触发器的时钟引脚接同一个节点每个时钟上升沿到来时所有触发器同时采样各自的D输入。延迟只影响D输入是否在时钟边沿前稳定下来而不是影响触发器之间的传递链。所以既然标题写了“同步模4可逆计数器”电路就必须把时钟引脚并联然后用组合逻辑把每个触发器的D输入算好。1.3 为什么选74HC74加74HC86而不是直接用现成计数器芯片74HC193、74HC190这类专用加减计数器芯片确实一个就能搞定但它们是集成的黑盒内部状态方程看不见、摸不着。用74HC74和74HC86搭只有两个芯片逻辑关系却能看得清清楚楚74HC74提供两个D触发器用来存储Q0和Q1。74HC86提供四个异或门用来实现“什么时候翻转”和“方向怎么切换”。异或门在这里特别合适。D触发器要变成T触发器核心公式是D Q ⊕ T。T为1时翻转T为0时保持。而方向控制的本质是让Q1的翻转条件在Q0和/Q0之间切换这个“选择”用异或门做起来非常顺手。四个异或门用掉三个还剩一个备用刚刚好。2. 状态方程推演从真值表到D触发器驱动方程有了状态表下一步就是把Q0和Q1的次态方程写出来。这一步是整个电路能不能跑起来的关键。2.1 先写Q0最简单的自翻转从状态表可以看出Q0在每个时钟上升沿都翻转一次。也就是说Q0的次态等于当前Q0取反。对D触发器来说Q在时钟上升沿后的值等于D输入所以D0 /Q0这个连接方式非常直接把74HC74第一个触发器的反相输出/Q0接回它自己的D输入。这样每个时钟上升沿Q0都会变成原来的反相状态。这里不需要任何异或门直接一根线连过去就行。2.2 Q1的翻转条件方向决定用Q0还是/Q0Q1的次态不能直接写死要分方向看。加计数时规律是如果Q01Q1翻转如果Q00Q1保持。也就是说Q1的翻转条件T1等于Q0。减计数时反过来如果Q00Q1翻转如果Q01Q1保持。也就是说T1等于/Q0。所以问题变成了到底让Q1按照Q0翻转还是按照/Q0翻转这取决于方向信号U/D。定义U/D1为加计数U/D0为减计数。那么加计数时T1 Q0减计数时T1 /Q0这个“二选一”用异或门来实现非常干净。观察一下就发现T1其实就是Q0和/U/D的异或结果T1 Q0 ⊕ /U/D当U/D1时/U/D0T1Q0当U/D0时/U/D1T1/Q0。完美匹配。2.3 用异或门把方向选择织进去现在要把T1变成D1的输入。D触发器的次态方程是Q_next D如果当前状态是Q1要让它在T11时翻转在T10时保持那么D1 Q1 ⊕ T1把T1代入得到D1 Q1 ⊕ Q0 ⊕ /U/D这个式子就是整个电路最核心的表达式。它告诉我们需要两个异或门第一个异或门算Q0 ⊕ Q1第二个异或门把结果再和/U/D异或这里有一个容易犯糊涂的细节为什么是/U/D而不是U/D因为异或门做选择器时只有当“选择信号”为0时输出才等于另一路输入。如果直接用U/D加计数时U/D1T1反而变成了/Q0方向就反了。所以先用一个异或门把U/D反相得到/U/D再做后面的运算。74HC86四个异或门的具体分工是这样的门1把U/D反相输出/U/D。异或门当反相器用一个输入接U/D另一个输入接高电平。门2计算Q0 ⊕ Q1。门3把门2的输出和/U/D再异或得到D1。门4输入接地不用。到这里逻辑设计已经完整了。3. 完整电路图引脚接线表加逻辑连接图很多人搭这种电路最怕的不是看不懂原理而是对着原理图找不到芯片引脚。下面给出一份可以直接照着在面包板上插线的完整接线清单。我以常见的DIP-14封装为例不同品牌的引脚定义基本一致但到手后还是建议先对一眼数据手册。3.1 芯片引脚确认先看74HC74双D触发器带异步清零和异步预置端都是低电平有效。引脚名称说明11CLR触发器1清零低有效21D触发器1数据输入31CP触发器1时钟上升沿触发41Q触发器1输出Q051/Q触发器1反相输出/Q062/Q触发器2反相输出/Q17GND地82Q触发器2输出Q192CP触发器2时钟102D触发器2数据输入112CLR触发器2清零低有效122PRE触发器2预置低有效131PRE触发器1预置低有效14VCC电源正极再看74HC86四路2输入异或门。引脚名称说明11A异或门1输入A21B异或门1输入B31Y异或门1输出42A异或门2输入A52B异或门2输入B62Y异或门2输出7GND地83Y异或门3输出93A异或门3输入A103B异或门3输入B114Y异或门4输出124A异或门4输入A134B异或门4输入B14VCC电源正极3.2 完整接线表下面这张表就是完整电路图的一种文本化形式。按顺序接线不用倒推原理也能搭出来。起点终点说明74HC74 pin14VCC74HC74供电74HC86 pin14VCC74HC86供电74HC74 pin7GND74HC74接地74HC86 pin7GND74HC86接地74HC74 pin3CLK触发器1时钟74HC74 pin9CLK触发器2时钟和pin3同一个节点74HC74 pin574HC74 pin2/Q0接D0实现自翻转74HC74 pin474HC86 pin4Q0送异或门2的A输入74HC74 pin874HC86 pin5Q1送异或门2的B输入74HC86 pin674HC86 pin9门2输出Q0⊕Q1送门3的A输入U/D信号74HC86 pin1方向控制高电平加计数低电平减计数VCC74HC86 pin2门1另一个输入固定接高门1做反相器74HC86 pin374HC86 pin10门1输出/U/D送门3的B输入74HC86 pin874HC74 pin10门3输出D1送触发器2的D输入74HC74 pin13VCC触发器1预置端禁止接高电平74HC74 pin12VCC触发器2预置端禁止接高电平74HC74 pin1RST节点触发器1清零74HC74 pin11RST节点触发器2清零RST节点10kΩ电阻到VCC正常工作时复位端保持高电平RST节点按键到GND按键按下时清零74HC86 pin12GND备用门4输入接地74HC86 pin13GND备用门4输入接地如果要观察输出就在Q0和Q1上各接一个LED串1kΩ限流电阻到GND。不要直接把LED串在输出和电源之间一是电流方向不对二是会拉低高电平导致后面逻辑判断出错。3.3 逻辑连接图文本版为了更直观我用文本画一下逻辑信号流向。U/D ──► 74HC86 1A VCC ──► 74HC86 1B 74HC86 1Y /U/D ─────────────┐ │ Q0 ──► 74HC86 2A │ Q1 ──► 74HC86 2B │ 74HC86 2Y Q0⊕Q1 ──► 74HC86 3A 3B ──┘ 74HC86 3Y D1 ──► 74HC74 2D /Q0 ──► 74HC74 1D CLK ──► 74HC74 1CP、2CP这个图省掉了电源和复位但核心数据通路的连接关系都在了。配合上面的引脚接线表足够把电路完整搭出来。3.4 复位、方向开关和时钟源怎么处理复位电路很简单10kΩ电阻把RST节点上拉到VCC按键一端接RST节点、另一端接地。按键按下时RST变低两个触发器清零Q0Q1回到00。松开后RST恢复高电平计数器可以正常工作。如果希望上电瞬间自动清零可以在RST节点和GND之间并一个1μF电容。上电瞬间电容两端电压不能突变相当于给RST一个短暂的低电平脉冲之后电容充电完成RST被10kΩ电阻拉高效果就是上电自动复位。方向开关可以用一个单刀双掷开关中间端接74HC86的1A一端接VCC一端接GND。接到VCC是加计数接到GND是减计数。如果只有跳线帽就在1A和GND之间接一个10kΩ下拉电阻跳线帽接VCC时加计数不接时默认减计数。时钟源随便选1Hz的555振荡器、信号发生器、单片机引脚都行。测试阶段建议先用1Hz左右的慢时钟这样LED闪烁肉眼能看清逻辑对不对一目了然。4. 从仿真到面包板验证方法和踩坑记录我自己习惯先在Multisim里把电路跑通再上面包板。仿真不是为了省事而是为了把“逻辑设计错误”和“面包板接触问题”分开排查。如果仿真都不过直接上板只会更痛苦。4.1 在Multisim里怎么快速验证Multisim里搭这个电路很快。74HC74和74HC86都在TTL库里能找到放出来之后按上面的逻辑连接关系接线。时钟源用一个数字时钟频率设成1Hz。方向控制用一个开关直接用键盘控制高电平加计数低电平减计数。输出端接两个逻辑探针或者直接接虚拟示波器。仿真时观察几个关键点方向为高时Q0Q1按00→01→10→11循环。方向为低时Q0Q1按00→11→10→01循环。按下复位键Q0Q1立刻回到00。切换方向时计数器从当前状态直接往另一个方向走而不是先复位。如果仿真结果不符合优先检查D1的异或门连接顺序。很多人在这一步把门2和门3的输入接反或者漏了门1做反相导致加计数变成减计数或者计数状态乱跳。4.2 面包板实测的波形特征面包板上实际通电后用示波器看Q0和Q1能看到很典型的同步计数器波形。Q0频率是时钟的一半每个上升沿翻转一次占空比50%。Q1周期是4个时钟周期频率是时钟的1/4正常情况也是50%占空比。加计数和减计数的区别在相位。加计数时Q1在Q0为1时翻转减计数时Q1在Q0为0时翻转。用双通道示波器同时看Q0和Q1能明显看到两个波形的相对位置变了。这里有个容易误判的点如果方向切换太频繁比如用机械开关在计数器运行中来回拨可能会看到某一位出现“半拍异常”。这通常是开关抖动导致D输入在时钟边沿附近变化不是电路逻辑错。低速演示没什么影响但要做严谨点最好给方向开关加一个RC滤波或者用一个D触发器把方向信号同步一下。4.3 几个容易翻车的细节第一个坑是74HC74的预置端和清零端悬空。74HC74的PRE和CLR都是低有效如果不接悬空引脚会受外界干扰导致触发器随机清零或预置。正确做法是PRE全部接VCCCLR通过复位电路控制。很多人只处理了CLR忘了PRE结果上电后状态完全不可控。第二个坑是备用异或门输入悬空。74HC86只用了三个门剩下一个门的输入如果什么都不接CMOS输入端会浮空输出可能一直在高频振荡还会额外耗电。把备用门的两个输入都接地问题就没了。第三个坑是电源去耦。高速CMOS电路在翻转瞬间会有电流尖峰如果VCC和GND之间没有电容容易产生电源毛刺。建议在每个芯片的VCC引脚和GND引脚之间就近接一个100nF陶瓷电容电源入口再并一个10μF电解电容。这个习惯能解决很多莫名其妙的乱跳问题。第四个坑是时钟信号太脏。如果用面包板上的555做主时钟接线太长或者频率太高上升沿可能不够陡峭导致74HC74触发不稳定。低速演示问题不大但如果频率超过几百kHz最好加一个施密特触发器整形或者直接用信号发生器输出方波。5. 扩展思路从模4走向任意模数这个电路最大的价值在于它不是死记一个计数器结构而是演示了同步时序电路的标准设计流程列状态表、写次态方程、用触发器加组合逻辑实现。把这个流程掌握了扩展能力是完全开放的。5.1 模8时Q1不变Q2的条件变了如果要做模8加/减计数器需要三个触发器。Q0仍然自翻转Q1的方程和模4几乎一样仍然是加计数时Q0为1就翻转减计数时Q0为0就翻转。但Q2的翻转条件变了。加计数时Q2只有在Q1和Q0同时为1时才翻转减计数时Q2只有在Q1和Q0同时为0时才翻转。也就是说加计数T2 Q1 · Q0减计数T2 /Q1 · /Q0这就不再是单纯异或门能解决的需要用到与门和或非门。74HC86的异或门能处理T1但T2需要额外加一片74HC08和一片74HC02或者用74HC00组合出需要的逻辑。电路规模会变大但设计方法完全一致。5.2 加使能、预置数和级联这个基础电路还能很方便地扩展一个“使能”功能。当前Q0是每次时钟都翻转如果想让计数器暂停只需要把D0从/Q0改成Q0⊕EN。EN1时正常翻转EN0时保持。74HC86正好剩一个备用门可以用这个备用门实现不增加芯片数量。预置数功能可以利用74HC74的PRE和CLR端。通过两个控制信号一个清零端一个预置端就能把计数器强行置成某个初始状态。不过要注意PRE和CLR都是异步的使用时要确保不在时钟边沿附近切换否则可能出现竞争。级联到更大模数也是一样的思路。两片电路可以做模16但要处理进位和借位信号。这个时候再去用74HC193可能会更省事但从学习角度自己把级联逻辑推一遍对理解二进制计数器的本质帮助很大。我个人的习惯是遇到计数器题目先不急着选芯片先列状态表写方程再决定用哪些门。这道用74HC74和74HC86搭同步模4可逆计数器的练习正好把这条完整的思路走了一遍。电路不难但每一步都值得亲手验证一遍。