上周有位学弟拿着数字电路课设题来问:在Multisim 14.0里,用74LS160和74LS161搭一个61进制计数器,怎么总是出不来效果。他按网上的电路连了一遍,仿真一运行,两个数码管不是从乱码开始跳,就是一路冲到99。我相信很多人拿到这个题目也是类似状态:原理好像都明白,一个芯片计数、两个芯片级联、到某个数清零,可真在Multisim里把芯片摆上去、把线连对,还得让输出干干净净地从00走到60再归零,中间全是可以踩的坑。今天这篇文章就把这道经典题完整拆开讲,从芯片差异、计数原理,到Multisim 14.0的连线步骤和仿真调试,最后附一张按线号逐一对应的完整接线表,照着连就能跑起来。
1. 先弄清74LS160和74LS161到底差在哪
1.1 同一家族的两位邻居,计数模值完全不同
74LS160和74LS161都是TTL 74LS系列的中规模同步计数器,都是16脚DIP封装,引脚排列几乎完全一致,也都有异步清零和同步预置功能。最容易让人混淆的一点是:两者长相一样,但“数数范围”不一样。74LS160是同步十进制计数器,输出按BCD码从0000计数到1001(0到9),再回到0000;74LS161是同步4位二进制计数器,输出从0000计数到1111(0到15),再回到0000。一个模10,一个模16,这就是它们最本质的差异。
可以打个比方:160是十进制算盘,满十进一;161是十六进制算盘,满十六进一。级联方式、清零方式的思考方法都一样,区别只在“几进制”。这里还要特别注意,虽然两者都有CLR和LOAD引脚,但CLR是异步清零,不需要时钟沿,只要拉低立刻清零;LOAD是同步预置,必须等到时钟上升沿才把数据装入。这一点在后面反馈清零电路里非常关键,很多仿真不成功就是没分清“异步清零”和“同步预置”的区别。
两个芯片的共同点列出来,方便对照:
| 功能 | 74LS160 | 74LS161 |
|---|---|---|
| 计数规律 | 0000→0001→…→1001→0000 | 0000→0001→…→1111→0000 |
| 模值 | 10 | 16 |
| 输出编码 | BCD(8421码) | 二进制 |
| 异步清零CLR | 低电平有效 | 低电平有效 |
| 同步预置LOAD | 低电平有效 | 低电平有效 |
| 使能ENP/ENT | 高电平有效 | 高电平有效 |
| 进位输出RCO | 计数到9且ENT=1时输出1 | 计数到15且ENT=1时输出1 |
| 典型用途 | 十进制个位计数 | 二进制/多位计数 |
1.2 为什么个位放160、十位放161
61进制计数器需要“个位”和“十位”两个计数级。个位每计满10个脉冲就要给十位送一次进位,并且个位输出必须是BCD码(0000~1001),这样显示才能是0~9。所以个位必须用74LS160。如果用74LS161当个位,个位会从0数到15,中间出现A、B、C、D、E、F这些非十进制状态,显示和进位逻辑都要额外处理,纯属给自己找麻烦。
十位的情况不一样。61进制时十位只需要出现0、1、2、3、4、5、6这七个值,虽然74LS161是十六进制计数器,但在这个电路里它被限制在0到6之间工作,完全不会暴露“能数到15”的特性。用161当十位,反而能和个位的160形成互补,这也是很多课程设计喜欢“160+161”组合的原因:同一个引脚定义,不同的模值,考察你能不能根据需求正确选型。
这里有个容易钻牛角尖的问题:161不是十进制,做十位会不会错?答案是不会。决定“几进制”的是整个电路的反馈清零/置数逻辑,不是芯片自身的计数模值。只要在计数到61时把CLR拉低,整个电路就是61进制,161自身的0到15计数范围会被清零逻辑牢牢限制在0到6以内。
2. 61进制的计数规律从哪来
2.1 把61个状态拆开看
“61进制”不是“数到61就结束”,而是计数器一共有61个稳定状态。按我们熟悉的数值排列,就是从00数到60,共61个状态。它们的分布其实很有规律:
| 十位二进制 | 十位数值 | 个位覆盖 | 对应状态 |
|---|---|---|---|
| 0000 | 0 | 0~9 | 00~09 |
| 0001 | 1 | 0~9 | 10~19 |
| 0010 | 2 | 0~9 | 20~29 |
| 0011 | 3 | 0~9 | 30~39 |
| 0100 | 4 | 0~9 | 40~49 |
| 0101 | 5 | 0~9 | 50~59 |
| 0110 | 6 | 0~1 | 60、61 |
十位从0到5这段,每个十位值对应完整的10个个位状态,一共60个;走到十位为6以后,个位只走0和1两个状态,其中60是正常显示状态,61是触发清零的瞬态。所以宏观上看到的循环是00、01、02、…、59、60、00,正好61个稳定状态。
这个分布也解释了一个关键事实:十位计数器在正常工作中永远走不到7到15。因为一到61,整个计数器就被清了。这也让后面的清零检测逻辑可以做得非常简单,十位的高位QD在0到6之间永远是0,根本不用管它。
2.2 反馈清零法:把“61”变成复位信号
实现61进制最简单的方法是反馈清零法,也叫反馈复位法。思路很直白:设计一个组合逻辑电路,实时监视两片计数器的输出。当检测到“十位=6且个位=1”这个状态时,立刻输出低电平,分别接到74LS160和74LS161的CLR端。由于这两个芯片的CLR是异步清零,低电平一出现,不管有没有时钟,计数器马上回到0000 0000。所以从宏观上看,计数器只在00到60之间循环,61这个状态只存在几十纳秒,肉眼和数码管都捕捉不到。
为什么检测61而不是60?因为清零法的逻辑是“数到模值才复位”,61是第一个不允许停留的状态,一旦出现就立刻消灭。这种方式电路简单,一个74LS00就能完成检测,代价是会产生一个极窄的复位脉冲。在Multisim纯数字仿真里,这个窄脉冲几乎无感;但如果你将来要把这个电路接到单片机或其他对边沿敏感的负载上,就要留意它。
2.3 如果追求更干净的时序:反馈置数法
比清零法更稳的常见做法叫反馈置数法,也叫反馈预置法。它检测的不是61,而是60:当计数器走到60(十位=6、个位=0)时,让LOAD端变低,同时把两片芯片的预置数输入ABCD全部接成0000。下一个时钟上升沿到来时,计数器被同步装入0000,跳回00。因为装载动作发生在时钟沿上,61这个状态根本不会出现,整个循环非常干净。
两种方法的对比如下:
| 方法 | 检测状态 | 复位方式 | 优点 | 缺点 |
|---|---|---|---|---|
| 反馈清零法 | 61(十位6、个位1) | 异步CLR | 电路简单,少一组预置数连线 | 有窄脉冲毛刺 |
| 反馈置数法 | 60(十位6、个位0) | 同步LOAD | 无毛刺,时序干净 | 多一组预置数连线 |
本文后面Multisim的接线,我按多数课程默认的反馈清零法来讲;想尝试置数法的朋友,我在第4章最后专门给一个改造说明。
3. Multisim 14.0搭建步骤与完整电路连接
3.1 元件清单:少一个都跑不起来
在Multisim 14.0中,元件放置通过Place > Component菜单,或者直接按快捷键Ctrl+W打开。本电路需要以下元件:
| 元件 | 型号 | 在Multisim中的位置 | 用途 |
|---|---|---|---|
| U1 | 74LS160D | Group: TTL, Family: 74LS | 个位计数 |
| U2 | 74LS161D | Group: TTL, Family: 74LS | 十位计数 |
| U3 | 74LS00D | Group: TTL, Family: 74LS | 反馈清零逻辑 |
| X1 | DCD_HEX | Group: Indicators, Family: HEX_DISPLAY | 个位显示 |
| X2 | DCD_HEX | Group: Indicators, Family: HEX_DISPLAY | 十位显示 |
| V1 | DIGITAL_CLOCK | Group: Sources, Family: SIGNAL_VOLTAGE_SOURCES | 1Hz时钟 |
| VCC/DGND | 电源符号 | Group: Sources, Family: POWER_SOURCES | 5V电源和地 |
一个使用细节:在元件搜索框输入74LS160D时,列表里可能同时出现74LS160D、74LS160N等不同后缀,它们的功能和引脚完全一样,只是封装描述不同,选一个能正常放置的即可。DCD_HEX是Multisim自带的BCD输入数码管,输入0000~1001显示0~9,输入1010~1111显示A~F。本电路用到的数字不会超过9,所以显示不会出现A到F,很合适。
这里还要提醒一下,74LS00D一个封装内包含4个独立的2输入与非门。Multisim放置多门封装元件时,会默认放置A门;你需要在放置对话框的Gate栏里分别选择A、B、C,或者直接连续拖放三份,软件会把它们归到同一个U3封装下。后文说的U3A、U3B、U3C,就分别指的这三个与非门。
3.2 先认识引脚,再动手连线
74LS160和74LS161都是16脚芯片,Multisim原理图上的引脚名称一般直接标在符号上。对照一下:
| 引脚 | 名称 | 说明 |
|---|---|---|
| 1 | ~CLR | 异步清零,低有效 |
| 2 | CLK | 时钟,上升沿触发 |
| 3 | A | 预置数据输入(bit0) |
| 4 | B | 预置数据输入(bit1) |
| 5 | C | 预置数据输入(bit2) |
| 6 | D | 预置数据输入(bit3) |
| 7 | ENP | 计数使能,高有效 |
| 8 | GND | 地 |
| 9 | ~LOAD | 同步预置,低有效 |
| 10 | ENT | 计数使能,同时控制进位,高有效 |
| 11 | QD | 输出最高位(权重8) |
| 12 | QC | 输出(权重4) |
| 13 | QB | 输出(权重2) |
| 14 | QA | 输出最低位(权重1) |
| 15 | RCO | 进位输出 |
| 16 | VCC | 电源 |
Multisim里低有效的引脚名上会带一个小圆圈或“~”符号,比如~CLR、~LOAD。这里有个新手最容易忽略的点:QA是bit0(权重1),QD是bit3(权重8)。接数码管时如果顺序接反,显示的数字会完全对不上。
电源方面,Multisim默认把74LS系列芯片的VCC和GND引脚隐藏,统一连接到名为VCC和DGND的全局网络上。你只要在原理图空白处放置一个VCC符号和一个DGND符号,所有芯片就自动供电了。如果自己想看引脚,可以在芯片属性里勾选显示电源引脚,两种方式对仿真结果没有影响。
3.3 从时钟到级联:一步一步接线
具体接线按下面的顺序来,不容易漏:
- 放好U1、U2、U3、X1、X2,并放一个VCC、一个DGND电源符号。
- 双击DIGITAL_CLOCK,把Frequency设为1(单位Hz),Duty Cycle保持默认50%。1Hz意味着每秒跳一个数,观察最舒服。
- 连接时钟:V1的输出引脚同时接到U1的CLK和U2的CLK。由于U1、U2是同步级联,两片芯片共用同一个时钟源,在同一个上升沿动作。
- 连接个位使能:U1的ENP和ENT都接VCC,让个位在每个时钟沿都允许计数。
- 连接级联进位:U1的RCO接到U2的ENT。这根线是全电路的关键。74LS160的RCO在“个位=9且ENT=1”时输出高电平,并且这个高电平会保持到下一个时钟沿,所以当个位从9变回0时,十位会在这个时钟沿正确加1。U2的ENP也接VCC。
- 把U1、U2的LOAD都接VCC,预置输入A/B/C/D接到DGND。这样同步预置功能被禁用,芯片只依赖CLR清零。
- 反馈清零部分可以按3.4的接线表直接连,也可以等第4章看完原理再连。
- 连接显示:把U1的QA、QB、QC、QD分别接到X1的A、B、C、D;把U2的QA、QB、QC、QD接到X2的A、B、C、D。DCD_HEX的A是最低位,对应QA;D是最高位,对应QD。
3.4 完整接线表:每一根线都写清楚
下面是这个电路的完整接线表,每一行都是一条导线或一个网络关系。按这张表连出来,就等价于标题里说的“完整电路图”。
| 编号 | 起点 | 终点 | 说明 |
|---|---|---|---|
| 1 | V1.OUT | U1.CLK | 时钟到个位 |
| 2 | V1.OUT | U2.CLK | 时钟到十位 |
| 3 | U1.RCO | U2.ENT | 个位向十位进位 |
| 4 | U1.ENP | VCC | 个位使能1 |
| 5 | U1.ENT | VCC | 个位使能2 |
| 6 | U2.ENP | VCC | 十位使能1 |
| 7 | U1.LOAD | VCC | 禁用同步预置 |
| 8 | U2.LOAD | VCC | 禁用同步预置 |
| 9 | U1.QA | X1.A | 个位显示bit0 |
| 10 | U1.QB | X1.B | 个位显示bit1 |
| 11 | U1.QC | X1.C | 个位显示bit2 |
| 12 | U1.QD | X1.D | 个位显示bit3 |
| 13 | U2.QA | X2.A | 十位显示bit0 |
| 14 | U2.QB | X2.B | 十位显示bit1 |
| 15 | U2.QC | X2.C | 十位显示bit2 |
| 16 | U2.QD | X2.D | 十位显示bit3 |
| 17 | U2.QC | U3A.A | 十位=6检测A |
| 18 | U2.QB | U3A.B | 十位=6检测B |
| 19 | U3A.Y | U3B.A | 反相输入 |
| 20 | U3A.Y | U3B.B | 反相输入并联 |
| 21 | U3B.Y | U3C.A | 十位=6高电平有效信号 |
| 22 | U1.QA | U3C.B | 个位=1检测 |
| 23 | U3C.Y | U1.CLR | 反馈复位到个位 |
| 24 | U3C.Y | U2.CLR | 反馈复位到十位 |
| 25 | VCC符号 | 全局VCC网络 | 芯片自动供电 |
| 26 | DGND符号 | 全局DGND网络 | 芯片自动接地 |
表中的U3A、U3B、U3C是74LS00内部的三个与非门。U3A对应第一个门,输入A、B,输出Y;U3B对应第二个门,输入都接U3A.Y;U3C对应第三个门。
4. 反馈清零的与非门逻辑:三个门把“61”抓出来
4.1 清零条件怎么拆解
要让电路在61时清零,本质是搭建一个组合逻辑,让它输出满足:
CLR = NOT( 十位等于6 且 个位等于1 )
当输出为0时,强制两片芯片异步清零。
十位等于6时,74LS161的输出是0110,也就是QD=0、QC=1、QB=1、QA=0。QC的权重是4,QB的权重是2,4+2正好是6。在61进制电路中,十位正常计数范围只有0到6,QD在0到6之间永远是0,所以判断“十位是不是6”只需要看QC和QB是不是都为1,QD和QA都不用管。个位等于1更简单,74LS160输出0001,只需要看QA是不是1。
于是清零条件收缩成三个信号:
- 十位的QC = 1
- 十位的QB = 1
- 个位的QA = 1
这三路信号同时为1时,就是61状态,必须把CLR拉低。
4.2 三个与非门的完整推导
74LS00只有2输入与非门,不能直接同时检测三路信号。一个常见的错误接法是把三个条件直接串两个与非门:U3A=NAND(QC, QB),U3B=NAND(U3A, QA)。这种接法在Multisim里一试就会发现61根本不清零,因为当十位等于6时U3A输出已经变成0,0再和QA做与非,结果永远是1,CLR拉不低。
正确做法是先把“十位等于6”这个条件恢复成高电平,再和“个位等于1”做与非。完整逻辑如下:
U3A = NAND(U2.QC, U2.QB) // 十位=6 时,U3A.Y=0;其他时候为1 U3B = NAND(U3A.Y, U3A.Y) // 用与非门当反相器,十位=6 时,U3B.Y=1 U3C = NAND(U3B.Y, U1.QA) // 当十位=6 且 个位=1 时,U3C.Y=0 U3C.Y -> U1.CLR, U2.CLR验证一下几个典型状态:
| 计数状态 | 十位QC/QB | U3A.Y | U3B.Y | 个位QA | U3C.Y(CLR) | 是否复位 |
|---|---|---|---|---|---|---|
| 59 | 1/0 | 1 | 0 | 1 | 1 | 否 |
| 60 | 1/1 | 0 | 1 | 0 | 1 | 否 |
| 61 | 1/1 | 0 | 1 | 1 | 0 | 是 |
| 23 | 0/1 | 1 | 0 | 1 | 1 | 否 |
可以看到,只有十位QC=1、QB=1且个位QA=1的那个状态,也就是61,CLR才会拉低,其余状态都不受影响。
4.3 几个必须避开的接线误区
第一,U3B在这里是纯反相器,两个输入必须短接在同一个节点上,也就是都接U3A.Y。如果把U3B的两个输入分别接U3A.Y和某个别的信号,逻辑就会完全变味。第二,CLR信号要同时送给U1和U2,不能只清个位或只清十位,否则会出现十位已经回到0、个位还在9的错位状态。第三,检测用的输出端别接错:U2.QC和U2.QB是十位的高两位,如果接成U2.QA和U2.QB,61的清零条件就永远等不到了。
如果想把电路改成反馈置数法,改动其实很小:把U1、U2的LOAD从VCC改接U3B.Y,预置输入U1.A~D、U2.A~D全部接DGND;清零条件改成检测60,也就是只保留“十位=6”的判断,用U3B.Y直接送LOAD。这样在60状态LOAD低电平,下一个时钟沿来临时同步装入0000,整体功能不变,但不再有61态的窄脉冲,实际焊板更推荐这种做法。
5. 仿真运行、上电乱码与Multisim里的常见坑
5.1 启动后不是00,先别怀疑电路
Multisim里数字IC在仿真启动时,输出状态有时并不是确定的0。这里比较推荐的做法:在U1.CLR和U2.CLR所在的复位线上,额外放一个SPST开关(Group: Basic, Family: SWITCH, Component: SPST),开关一端接CLR节点,另一端接DGND。仿真开始后,如果发现数码管显示乱了,先按一下空格或点击开关,让CLR短暂为低,计数器回到00,然后把开关断开,再继续观察。这个步骤在第一次仿真时几乎是必做的,因为很多版本的Multisim在启动瞬间并不会自动给计数器复位。
不过要注意,这是仿真环境下的做法。如果将来做真实硬件,不要用SPST直接短接74LS00推挽输出的CLR节点到地,因为当与非门输出高电平时,开关闭合等于把TTL输出短路,可能损坏芯片。真硬件要么用RC上电复位电路,要么用集电极开路或缓冲门的方式组合复位信号。
5.2 显示不对、计数乱跳:优先查级联和显示位序
如果数码管不是按00到60循环,而是乱跳,按下面的顺序排查:
- 确认U1.RCO接的是U2.ENT,不是U2.CLK,也不是悬空。有些教程把十位时钟直接接在个位RCO上,做成异步级联,也能工作,但U1.RCO到U2.ENT的同步级联更稳定,也更好理解。
- 确认U2.ENT确实有信号。Multisim中如果某个使能引脚悬空,有些仿真模型会当成高电平,有些不会,不要依赖悬空行为。
- 确认显示接线按QA到A、QB到B、QC到C、QD到D的顺序。接反一位,显示就会乱。比如个位实际是9,显示却可能像6。
- 确认CLR节点确实连到了U3C的输出。可以放一个逻辑探针在CLR节点上,每个循环的61时刻它应该出现一个低电平。不过61态极短,肉眼看不清,用Multisim的Logic Analyzer接到CLR节点,能看到一个清晰的窄负脉冲,这是判断反馈电路是否生效最直接的办法。
5.3 数据库访问报错、仿真太慢:两个高频使用问题
不少人在Multisim里一打开元件库就弹“Master Database cannot be accessed”之类的错误,通常和安装路径、权限或之前残留的数据库文件有关。可以先试:以管理员身份运行Multisim;打开Options > Global Preferences,确认数据库路径指向安装目录下的database文件夹;如果之前装过其他版本,检查是否有残留的数据库文件损坏。实在不行,卸载干净后重装,装完第一件事先用管理员身份打开一次,把数据库路径确认好再继续画图。
仿真速度方面,如果觉得数字电路跑得“拖泥带水”,往往不是Multisim本身慢,而是时钟频率太高、显示刷新跟不上。1Hz的数字时钟配两个DCD_HEX,仿真几乎是实时的,反应很跟手。如果电路复杂、需要跑长仿真,可以在Simulate > Interactive Simulation Settings里调整最大仿真步长(Maximum time step),把最大步长调大一些能明显加速,代价是波形精度下降。像61进制计数器这种低频数字电路,用默认设置就够了,不需要特意去改。
5.4 从仿真到实物:两处必须改的设计
如果这个61进制计数器下一步要焊成实物,有两点建议:
一是复位方式。仿真里61态窄脉冲无所谓,但实物里这个纳秒级的低脉冲容易让后面的电路误触发。稳妥起见改用反馈置数法,或者将清零信号先用D触发器同步一下再送CLR,避免毛刺问题。
二是显示部分。仿真里用DCD_HEX非常省事,实物里74LS160/161输出的是BCD码,不能直接驱动7段数码管,需要加74LS47(共阳数码管)或74LS48(共阴数码管)做译码驱动,还要根据数码管的共阳共阴类型选对型号,最好串220Ω左右的限流电阻。1Hz时钟在实物里可以用NE555搭一个可调方波发生器,或者直接用函数信号发生器。
我在Multisim里第一次跑通这个电路,其实不是因为原理难,而是被两个小问题卡了半天:一个是把QB和QC接反了,另一个是忘了在CLR上接复位开关,导致仿真启动后从乱码开始跳。后来我总结出一个很笨但很有效的习惯:连接任何计数器电路之前,先拿一张纸把两个芯片的引脚表抄一遍,再对照接线表一根一根连;清零逻辑一定先在纸上推一遍真值表,再动手接线。Multisim的好处是改线非常快,出现错误也不会烧东西,所以大胆多试几遍。现在再看这类题目,无论是61进制还是任意模值计数器,核心就三件事:芯片选型、级联方式、反馈逻辑。把这三件事捋顺,基本就不会出大问题。