1. 为什么还要折腾74系列计数器数字电路实验课里计数器这个环节几乎是绕不过去的坎。我见过太多同学面包板上插了一堆芯片数码管要么不亮要么跳数乱得像随机数最后只能对着实验指导书发呆。其实问题的根子往往不在接线本身而在于你对手里这颗芯片的理解够不够深以及有没有在动手之前先用仿真把逻辑跑通。这篇文章要聊的就是怎么用Multisim把74LS161和74HC390这两颗经典计数器芯片玩明白分别搭出六进制计数器和六十进制计数器。前者是同步四位二进制计数器后者是双十进制计数器两颗芯片的脾气完全不同但恰好覆盖了数字电路里最常遇到的两种设计思路反馈清零法和级联分频法。如果你正在准备数字电路实验、课程设计或者单纯想把手里的计数器芯片用起来这篇内容应该能帮你省下不少试错时间。我会从芯片本身的特性讲起把每一步的参数计算、接线逻辑、仿真设置都拆开说清楚最后还会附上我在调试过程中踩过的坑和对应的排查方法。整篇内容基于Multisim 14.2版本操作其他版本界面略有差异但逻辑一致。2. 两颗芯片的底层逻辑拆解2.1 74LS161同步计数器里的万金油74LS161是一颗四位同步二进制计数器所谓“同步”指的是所有触发器的时钟输入端是并联的状态翻转由同一个时钟沿驱动。这一点和异步计数器有本质区别——异步计数器是前一级的输出作为后一级的时钟级联时会产生累积延迟在高速场景下容易出问题。74LS161的同步结构让它在级联时更稳定这也是它在实验里出场率极高的原因。先看它的关键引脚引脚名称功能说明1CLR或MR异步清零端低电平有效不受时钟控制2CLK时钟输入端上升沿触发3、4、5、6D0-D3预置数输入端7ENP计数使能端18GND接地9LOAD同步预置数端低电平有效10ENT计数使能端211-14Q3-Q0计数输出端15RCO进位输出端16VCC电源正极这里有几个细节值得展开说。CLR是异步的意思是只要给它低电平输出立刻归零不需要等时钟沿。这个特性在做反馈清零时非常关键因为它决定了你的清零信号能“抢”在哪个时刻生效。而LOAD是同步的低电平有效但必须配合时钟上升沿才能把D0-D3的数据锁进输出端。ENP和ENT两个使能端必须同时为高电平计数器才会在时钟沿到来时加一。任何一个为低计数器就保持当前状态不动。RCO是进位输出当计数器状态为1111且ENT为高时RCO输出高电平这个信号在级联时可以直接接到下一级的ENT或ENP上。注意很多同学在Multisim里仿真时发现计数器不动八成是ENP或ENT忘了接高电平。这两个引脚悬空在仿真里默认是低电平芯片直接罢工。2.2 74HC390双十进制计数器的巧妙结构74HC390和74LS161完全不是一个路数。它内部集成了两个独立的十进制计数器每个计数器又拆成两部分一个二分频器÷2和一个五分频器÷5。这种拆分设计非常灵活你可以单独用÷2、单独用÷5也可以把它们级联成÷10。74HC390的引脚分布以DIP-16封装为例引脚名称功能说明1CP0第一个计数器的÷2时钟输入2MR1第一个计数器的清零端高电平有效3Q0第一个计数器÷2输出4CP1第一个计数器的÷5时钟输入5Q1第一个计数器÷5输出最低位6Q2第一个计数器÷5输出7Q3第一个计数器÷5输出最高位8GND接地9Q4第二个计数器÷5输出最高位10Q5第二个计数器÷5输出11Q6第二个计数器÷5输出最低位12CP2第二个计数器的÷5时钟输入13MR2第二个计数器的清零端高电平有效14Q7第二个计数器÷2输出15CP3第二个计数器的÷2时钟输入16VCC电源正极注意看74HC390的清零端是高电平有效这和74LS161的低电平有效正好相反。如果你从161换到390清零逻辑要反过来写这是最容易翻车的地方。另外74HC390的÷2和÷5之间没有内部连接你需要自己在外部把Q0接到CP1才能构成一个完整的÷10计数器。这种“半开放”的结构给了你很大的自由度但也意味着接线时不能想当然。2.3 两种设计思路的本质差异六进制计数器和六十进制计数器虽然都是计数器但设计哲学完全不同。六进制计数器的核心是“在有限的16个状态里截取6个”。74LS161天然是模16的你要让它变成模6就得用反馈清零或者预置数的方法在它数到第6个状态时把它拉回0。这属于状态截断的思路。六十进制计数器则是“把两个十进制计数器串起来”。74HC390本身就是十进制你只需要把两个÷10级联一个做十位一个做个位就得到了模100的计数器。但你要的是模60所以还得在十位计数到6的时候把整体清零。这属于级联截断的思路。两种思路对应两种完全不同的调试方法。六进制的问题通常出在清零信号的时序上六十进制的问题往往出在级联的进位连接上。下面我会分别展开。3. 六进制计数器从真值表到仿真波形3.1 状态表与反馈逻辑的推导用74LS161做六进制计数器最直接的方法是反馈清零法。思路很简单让计数器从0000开始数数到0101也就是5的时候下一个时钟沿应该回到0000。但74LS161是同步计数器它的输出在时钟沿才变化所以你不能等它变成0110再清零那样会多出一个瞬间状态。正确的做法是在0101状态时准备好清零信号等下一个时钟沿到来时芯片先执行清零输出直接跳到0000。由于CLR是异步的实际上你甚至可以在0101状态一出现就立刻清零但这样会导致0101这个状态只维持极短的时间在仿真里可能看不到。我一般推荐用同步预置数法来做六进制因为这样状态更干净。具体操作是把D0-D3全部接地LOAD端通过一个与非门接到Q2和Q0。当计数器输出为0101时Q21、Q01与非门输出低电平LOAD有效。下一个时钟沿到来时计数器把0000加载进去实现模6计数。两种方法的对比方法清零/预置方式有效状态优点缺点反馈清零CLR异步低有效0000-0101接线简单0101状态持续时间短同步预置LOAD同步低有效0000-0101状态稳定需要接D0-D3如果你只是做实验演示反馈清零法足够用。但如果要接数码管显示建议用同步预置法否则数码管在0101那个状态会闪一下看起来不舒服。3.2 Multisim里怎么把电路搭出来打开Multisim新建一个空白电路。从元件库里的“TTL”分组找到74LS161放置到工作区。然后依次添加以下元件时钟源用“Sources”组里的“Clock Voltage”或者“Digital Clock”频率设1kHz与非门74LS00四二输入与非门数码管用“Indicator”组里的“DCD_HEX”或者七段数码管译码器电源VCC和GND接线步骤如下把74LS161的VCC接5VGND接地ENP和ENT都接5V两个使能端必须为高CLR接5V不用异步清零时钟源输出接到CLK引脚D0-D3全部接地用一个二输入与非门输入端分别接Q2和Q0输出接LOADQ3-Q0接到数码管的对应输入端这里有个细节Q2和Q0对应的是二进制0101中的两个1。0101从高位到低位是Q30、Q21、Q10、Q01所以只需要检测Q2和Q0同时为1即可。与非门输出低电平触发LOAD。提示在Multisim里数码管默认是共阴极还是共阳极要看具体型号。如果你用的是DCD_HEX它自带译码功能直接接Q3-Q0就行。如果用七段数码管需要加一个74LS48译码器。3.3 仿真波形怎么看才不浪费时间电路搭好后点击运行按钮然后打开逻辑分析仪Logic Analyzer。把Q3、Q0、CLK、LOAD四个信号分别接到分析仪的通道上。设置时钟频率为1kHz采样率至少设为10kHz否则波形会失真。正常的波形应该是这样的CLK通道连续的方波Q0通道每来一个时钟沿翻转一次频率是CLK的一半Q3通道频率是CLK的1/16LOAD通道大部分时间是高电平当Q2和Q0同时为1时变低持续一个时钟周期如果你看到LOAD一直为低说明与非门的输入接错了可能接到了Q3和Q2上。如果LOAD一直为高说明与非门没输出检查一下电源和接地。我实测下来Multisim 14.2在1kHz时钟下的仿真速度很流畅波形刷新没有明显延迟。如果你觉得仿真跑得太慢可以在“Simulate”菜单里把“Simulation Speed”调到最快但要注意采样率也要相应提高否则会丢状态。4. 六十进制计数器级联与截断的组合拳4.1 为什么选74HC390而不是两颗74LS161做六十进制计数器你有两个选择用两颗74LS161级联成模256然后截断到60或者用一颗74HC390它内部自带两个÷10计数器直接级联就是模100再截断到60。我强烈推荐后者。原因有三第一接线量差了一个数量级。两颗74LS161级联需要处理进位信号、使能信号、清零信号至少十几根线。而一颗74HC390只需要把Q0接到CP1再把第一组的输出接到第二组的时钟输入总共不到十根线。第二74HC390的÷10结构天然匹配十进制显示。你不需要额外的译码逻辑每个÷10的输出直接对应一位十进制数接数码管非常方便。第三调试难度低。74LS161级联时如果进位信号没接对计数器可能数到15就停了或者直接跳到某个奇怪的状态。74HC390的级联逻辑更直观出问题容易定位。当然74HC390也有它的坑。它的清零端是高电平有效而且两个计数器各有独立的清零端。如果你想把整体清零需要把两个MR引脚都接到清零信号上。4.2 级联逻辑与六十进制截断的实现先理清74HC390的内部结构。它有两个独立的计数器我们称为计数器A和计数器B。每个计数器内部有一个÷2和一个÷5。要做六十进制我们需要个位计数器A构成÷10输出范围0-9十位计数器B构成÷10输出范围0-5因为六十进制的十位最大是5计数器A的接法把CP0接时钟源Q0接到CP1这样Q0-Q3就构成了一个÷10计数器。Q0是÷2的输出Q1-Q3是÷5的输出。注意Q0是最低位Q3是最高位。计数器B的接法类似把计数器A的Q3最高位接到计数器B的CP2Q7接到CP3这样计数器B也构成÷10。但我们需要它在数到6的时候清零所以要把计数器B的Q5和Q6对应十位的2和4即0110中的两个1接到一个与门与门输出接到MR2。等等这里要仔细算一下。计数器B的输出是Q4-Q7其中Q7是÷2的输出Q4-Q6是÷5的输出。当计数器B计到6时二进制是0110对应Q61、Q51、Q40、Q70。所以我们需要检测Q6和Q5同时为1。用一个二输入与门输入端接Q6和Q5输出接MR2。当十位计到6时MR2变高计数器B清零。同时这个清零信号也应该把计数器A清零所以MR2的输出还要接到MR1。但这里有个时序问题74HC390的清零是异步的只要MR为高输出立刻归零。所以当十位变成6的瞬间MR2变高十位和个位同时清零。个位本来可能是0-9之间的任何数但因为是异步清零个位也会立刻归零。这样整体就从60跳回了00实现了模60计数。注意如果你希望个位在十位清零时也归零这个接法是对的。但如果你希望个位保持自己的计数节奏那就不能把MR2接到MR1上。六十进制的要求是个位和十位同步归零所以必须这样接。4.3 数码管显示与进位观察在Multisim里把计数器A的Q0-Q3接到一个数码管个位计数器B的Q4-Q7接到另一个数码管十位。注意Q0是最低位接数码管的A端Q3是最高位接D端。如果你接反了显示的数字会乱。运行仿真后你应该看到个位数码管从0跳到9然后回到0同时十位加1十位数码管从0跳到5当个位再次从9回到0时十位变成6然后瞬间整体归零整体循环是00、01、02...09、10、11...59、00如果你看到十位显示6之后没有立刻归零而是停留了一下说明清零信号的延迟太大了。在Multisim里可以调整门电路的传输延迟参数但一般默认值就够用。我实测时遇到过一个情况十位显示6之后个位还在继续计数直到个位也变成6才整体清零。这是因为我把MR2接到了MR1上但MR1的优先级被个位的内部逻辑覆盖了。解决办法是确保MR1和MR2都直接由同一个清零信号驱动不要串联。5. 仿真调试中那些让人抓狂的问题5.1 Multisim数据库报错与元件找不到这是Multisim用户最常见的问题之一。你打开软件想找一个74LS161结果搜索半天找不到或者弹出“数据库无法访问”的错误提示。这个问题的根源通常是数据库文件路径配置错误或者用户权限不足。Multisim的元件数据库默认存放在安装目录下的“Database”文件夹里如果你把软件装在了C盘而当前用户没有读写权限就会报错。解决方法分三步右键点击Multisim快捷方式选择“以管理员身份运行”如果还是不行打开“Options”菜单里的“Global Preferences”找到“Database”选项卡检查数据库路径是否正确如果路径正确但仍然报错可能是数据库文件损坏需要从安装包里重新复制一份另外如果你在元件库搜索框里输入“74LS161”找不到试试只输入“161”或者“LS161”。Multisim的搜索有时候对前缀很敏感。提示Multisim 14.2的元件库分为“Master Database”和“User Database”。如果你在Master里找不到某个元件可以切换到User Database看看有时候元件被误放到了用户库里。5.2 仿真速度慢到想砸键盘默认情况下Multisim的仿真速度是“自动”模式它会根据电路复杂度动态调整。但对于计数器这种时序电路自动模式往往会导致仿真跑得很慢尤其是当时钟频率设得比较低的时候。我一般会把仿真速度手动调到最快。具体操作点击“Simulate”菜单选择“Interactive Simulation Settings”在“Simulation Speed”里选择“Fastest”。但要注意速度调快之后波形可能会失真所以逻辑分析仪的采样率也要相应提高。另一个技巧是降低时钟频率。如果你只是验证逻辑功能1kHz的时钟完全够用没必要设成1MHz。时钟频率越低仿真跑得越快。还有一个容易被忽略的点电路里的悬空引脚会拖慢仿真。Multisim在仿真时会不断尝试计算悬空节点的电压如果电路里有大量悬空引脚仿真速度会明显下降。所以接线时尽量把所有不用的引脚都接地或接VCC。5.3 计数器不跳数或跳数异常这是最让人头疼的问题因为可能的原因太多了。我整理了一个排查表按优先级从高到低排列现象可能原因排查方法计数器完全不动ENP或ENT没接高电平用万用表测引脚电压计数器不动时钟源没输出用示波器看CLK引脚跳数但顺序乱输出引脚接反检查Q0-Q3与数码管的对应关系数到某个值就停清零信号误触发检查与非门/与门输入数到某个值跳回0但多一个状态清零时序不对改用同步预置法级联时第二级不计数进位信号没接对检查Q3到CP2的连接我遇到最多的情况是清零信号误触发。比如用74LS161做六进制时与非门的输入端应该接Q2和Q0但有些同学接成了Q3和Q1结果计数器数到101010才清零变成了十进制。这种错误在仿真里很容易发现因为数码管会显示到9才归零。另一个常见问题是数码管显示乱码。这通常是因为数码管的输入顺序和计数器的输出顺序不一致。比如你把Q0接到了数码管的D端Q3接到了A端显示的数字就会完全错乱。解决办法是仔细对照数码管的引脚定义确保Q0对应最低位。5.4 元件旋转与连线技巧Multisim里旋转元件很简单选中元件后按CtrlR每按一次旋转90度。但连线的时候有个技巧尽量用水平线和垂直线避免斜线。斜线在复杂电路里很容易和其他线交叉看起来乱而且容易接错节点。如果你需要跨线连接可以用“Junction”节点。在两条线的交叉处放一个JunctionMultisim会自动识别为连接点。如果没有Junction两条交叉的线默认是不连接的。还有一个实用技巧用网络标签Net Label代替长线。比如你要把Q3接到很远的一个门电路输入端可以在Q3的线上放一个Net Label命名为“Q3”然后在门电路的输入端也放一个同名Label这样就不用拉一根长线了。电路看起来干净很多调试时也容易追踪信号。6. 从仿真到实物的几个关键提醒仿真跑通了不代表实物就能用。我在把这两个电路从Multisim搬到面包板上的时候踩过几个坑这里分享一下。第一74LS161和74HC390的电平标准不同。74LS161是TTL电平高电平最低2.0V低电平最高0.8V。74HC390是CMOS电平高电平最低3.5V5V供电时低电平最高1.5V。如果你把74LS161的输出直接接到74HC390的输入可能会出现电平不匹配的问题。解决办法是在中间加一个电平转换电路或者统一用同一系列的芯片。第二面包板的接触电阻会影响计数。尤其是时钟频率较高时面包板的分布电容和接触电阻会导致时钟信号畸变计数器可能漏计数或重复计数。建议时钟频率不要超过100kHz并且尽量缩短接线长度。第三电源去耦不能省。每颗芯片的VCC和GND之间都要并一个0.1μF的陶瓷电容否则计数器在状态翻转时会产生电源噪声导致误触发。这个电容在仿真里可以不加但实物上必须加。第四74HC390的未用输入端不能悬空。CMOS芯片的输入端悬空时电平不确定会导致芯片内部振荡功耗急剧增加。所有不用的输入引脚都要接到VCC或GND。最后说一个我自己的习惯在Multisim里搭好电路后我会先用逻辑分析仪把关键节点的波形抓下来存成图片。然后实物调试时用示波器对照仿真波形哪个节点不对就查哪个节点。这个方法帮我省了很多瞎猜的时间。如果你也在做类似的计数器实验建议先从六进制开始把74LS161的反馈逻辑吃透再上手六十进制。两颗芯片都玩过之后你会发现数字电路里很多设计思路是相通的无非是状态截断和级联分频的各种组合。
阅读完成 · 觉得有帮助?