1. 为什么74LS181值得花时间吃透
如果你正在上计算机组成原理这门课,或者正在准备考研408,那你大概率绕不开一个芯片——74LS181。这颗看起来毫不起眼的24脚双列直插芯片,是整个运算器实验的核心。我见过太多同学在做实验的时候,对着实验箱上的拨码开关和LED灯一脸茫然,连线连了半天,结果ALU的输出永远不对,最后只能抄同学的实验结果交差。说实话,这个实验如果只是照着实验指导书机械地拨开关、记数据,那确实没什么意思,但如果你真正理解了74LS181内部的运算逻辑,理解了S3-S0这四位功能选择码是怎么控制16种算术运算和16种逻辑运算的,你会发现这个实验其实是整个计算机组成原理课程里最能让你“摸到”CPU内部工作原理的环节。
这篇文章我会从实际动手的角度出发,把74LS181的功能、引脚、控制逻辑、电路连接、实验步骤以及常见的坑全部讲清楚。不管你是第一次接触这个芯片,还是已经连过线但没搞明白原理,看完之后你应该能独立完成整个运算器实验,并且能给别人讲明白为什么这样连线、为什么输出是这个结果。文章会涉及74LS181的功能表解读、运算器的级联设计、计算机组成原理中ALU的核心概念、电路图的逐线分析,以及实验过程中最容易出错的几个地方。适合正在做计算机组成原理实验的本科生、准备考研复试需要复习ALU原理的同学,以及任何对数字电路和CPU内部运算感兴趣的人。
2. 74LS181芯片核心功能与引脚全解析
2.1 这颗芯片到底能干什么
74LS181是一颗4位算术逻辑运算单元,英文叫Arithmetic Logic Unit,简称ALU。你可以把它想象成一个“万能计算器”,给它两个4位二进制数A和B,再给它一组控制信号,它就能按照你的要求输出这两个数的某种运算结果。它支持的运算分两大类:算术运算和逻辑运算。算术运算包括加法、减法、加1、减1、直通等,逻辑运算包括与、或、非、异或、同或等。总共加起来有32种运算功能,通过5个控制引脚(S3、S2、S1、S0和M)来选择。
这里有个关键点需要理解:S3-S0这四位功能选择码决定了“做什么运算”,而M引脚决定了“是算术运算还是逻辑运算”。当M=1时,芯片执行逻辑运算,此时进位信号不起作用;当M=0时,芯片执行算术运算,进位信号参与运算。这个M引脚的全称是Mode,也就是模式选择。很多同学第一次做实验时输出不对,就是因为忘了检查M引脚的状态。
2.2 引脚定义与功能分组
74LS181的引脚排列是有规律的,理解了分组之后接线会清晰很多。我把24个引脚按功能分成几组来说明:
| 引脚编号 | 符号 | 功能说明 |
|---|---|---|
| 1 | B0 | 数据B的第0位输入 |
| 2 | A0 | 数据A的第0位输入 |
| 3 | S0 | 功能选择码第0位 |
| 4 | S1 | 功能选择码第1位 |
| 5 | S2 | 功能选择码第2位 |
| 6 | S3 | 功能选择码第3位 |
| 7 | M | 模式选择:M=1逻辑运算,M=0算术运算 |
| 8 | F0 | 运算结果第0位输出 |
| 9 | F1 | 运算结果第1位输出 |
| 10 | F2 | 运算结果第2位输出 |
| 11 | F3 | 运算结果第3位输出 |
| 12 | GND | 接地 |
| 13 | CN+4 | 进位输出(低电平有效) |
| 14 | P | 进位传递输出 |
| 15 | G | 进位产生输出 |
| 16 | CN | 进位输入(低电平有效) |
| 17 | A3 | 数据A的第3位输入 |
| 18 | B3 | 数据B的第3位输入 |
| 19 | A2 | 数据A的第2位输入 |
| 20 | B2 | 数据B的第2位输入 |
| 21 | A1 | 数据A的第1位输入 |
| 22 | B1 | 数据B的第1位输入 |
| 23 | F3 | 运算结果第3位输出(部分封装标注不同) |
| 24 | VCC | 电源正极,接+5V |
需要特别注意的是,CN(引脚16)是低电平有效的进位输入端。什么意思呢?就是说当你在做加法运算时,如果想让最低位参与进位,需要给CN一个低电平信号。很多同学在这里犯迷糊,以为给高电平就是有进位,实际上恰恰相反。这个设计是因为74LS181采用的是负逻辑进位系统,CN=0表示有进位输入,CN=1表示无进位输入。
2.3 功能选择码与运算对照表
这是整个实验最核心的一张表,你必须把它记熟或者至少知道怎么查。S3-S0从0000到1111共16种组合,每种组合在M=1和M=0时分别对应不同的运算:
| S3 S2 S1 S0 | M=1(逻辑运算) | M=0(算术运算,CN=1无进位) |
|---|---|---|
| 0 0 0 0 | F = ~A | F = A |
| 0 0 0 1 | F = ~(A+B) | F = A+B |
| 0 0 1 0 | F = ~A · B | F = A+~B |
| 0 0 1 1 | F = 0 | F = -1(全1) |
| 0 1 0 0 | F = ~(A·B) | F = A加A·~B |
| 0 1 0 1 | F = ~B | F = (A+B)加A·~B |
| 0 1 1 0 | F = A⊕B | F = A减B减1 |
| 0 1 1 1 | F = A·~B | F = A·~B减1 |
| 1 0 0 0 | F = ~A+B | F = A加A·B |
| 1 0 0 1 | F = ~(A⊕B) | F = A加B |
| 1 0 1 0 | F = B | F = (A+~B)加A·B |
| 1 0 1 1 | F = A·B | F = A·B减1 |
| 1 1 0 0 | F = 1 | F = A加A |
| 1 1 0 1 | F = A+~B | F = (A+B)加A |
| 1 1 1 0 | F = A+B | F = (A+~B)加A |
| 1 1 1 1 | F = A | F = A减1 |
这张表看起来复杂,但其实有规律可循。你不需要死记硬背,实验的时候可以对照着查。但有一点必须清楚:M=0时的算术运算结果和CN的初始状态有关。上表列出的是CN=1(无进位输入)时的结果,如果CN=0(有进位输入),结果会在最低位加1。这个细节在做减法实验时特别重要。
3. 运算器实验的电路设计与连线思路
3.1 为什么需要多片74LS181级联
一片74LS181只能处理4位数据,但计算机组成原理实验通常要求实现8位甚至16位的运算器。这就需要用多片74LS181级联来扩展位宽。级联的核心问题是进位如何处理。有两种方案:串行进位和并行进位。
串行进位就是把低4位的进位输出CN+4接到高4位的进位输入CN。这种方案连线简单,但速度慢,因为高4位必须等低4位算完才能开始。并行进位则需要额外的进位逻辑电路(通常用74LS182进位先行芯片),速度更快但连线复杂。在大多数教学实验中,为了简化连线,通常采用串行进位方案。我建议你第一次做实验时也用串行方案,先把基本原理搞清楚,等有余力再尝试并行方案。
3.2 完整电路连接步骤
下面我以两片74LS181构成8位运算器为例,说明完整的连线过程。这个方案在大多数实验箱上都能直接实现。
第一步:电源和地线连接。两片74LS181的VCC(引脚24)都接+5V,GND(引脚12)都接地。这一步看起来简单,但我见过不止一个同学忘了接电源,然后对着不亮的LED灯排查了半天。
第二步:数据输入连接。实验箱上通常有拨码开关或者数据开关,用来设置A和B的8位输入。低4位A0-A3接到第一片74LS181的A0-A3(引脚2、21、19、17),高4位A4-A7接到第二片的对应引脚。B端同理。注意引脚顺序不要接反,A0是最低位,A3是最高位。
第三步:功能选择码连接。S3-S0这四个控制信号需要同时接到两片74LS181的对应引脚。实验箱上一般有专门的开关或者按钮来设置S3-S0。M引脚也同时接到两片芯片。这里要注意,两片芯片的S3-S0和M必须保持一致,否则高4位和低4位执行的运算不同,结果肯定不对。
第四步:进位连接。第一片(低4位)的CN+4(引脚13)接到第二片(高4位)的CN(引脚16)。第一片的CN(引脚16)接高电平(表示最低位无进位输入)或者接进位控制开关。第二片的CN+4作为最终进位输出,可以接LED灯显示。
第五步:输出连接。两片74LS181的F0-F3分别接到LED显示灯。低4位F0-F3是第一片的输出,高4位F4-F7是第二片的输出。这样8位结果就能在LED上直观显示出来。
3.3 进位链的细节处理
进位处理是运算器实验中最容易出错的地方。我再强调几个关键点:
注意:74LS181的进位信号全部是低电平有效。CN=0表示有进位输入,CN+4=0表示有进位输出。如果你用LED灯显示进位,LED亮表示低电平,也就是有进位。
在做加法实验时,如果最低位CN接高电平(无进位),那么8位加法就是标准的A+B。如果CN接低电平(有进位),结果就是A+B+1。在做减法实验时,74LS181本身不直接提供减法功能,而是通过“加补码”的方式实现减法。具体来说,A-B可以转化为A+(-B),而-B在二进制中就是B取反加1。所以做减法时,你需要设置S3-S0选择“A加~B”的功能,同时给CN一个低电平(相当于加1),这样结果就是A+~B+1=A-B。
这个原理如果你不理解,实验时就只能机械地照搬指导书上的开关设置,一旦老师换个题目你就不会了。所以务必把补码减法的逻辑搞清楚。
4. 实操过程与实验数据记录
4.1 实验前的准备工作
在动手连线之前,有几件事必须先做好。第一,检查实验箱上的74LS181芯片是否插好,有没有引脚弯曲或者接触不良。我遇到过芯片没插紧导致输出时好时坏的情况,排查了很久才发现是接触问题。第二,用万用表确认实验箱的+5V电源输出正常。第三,准备好实验记录表格,把每次实验的输入数据、控制码和输出结果都记下来,方便对照分析。
4.2 逻辑运算实验步骤
先做逻辑运算,因为逻辑运算不涉及进位,相对简单。设置M=1,然后依次设置S3-S0为不同组合,观察输出。
比如做“与”运算:设置S3-S0=1011,M=1。此时F=A·B。设置A=1010,B=1100,预期输出F=1000。拨动开关后观察LED显示,如果输出是1000,说明连线正确。如果不对,先检查A和B的输入是否接反,再检查S3-S0是否设置正确。
做“或”运算:设置S3-S0=1110,M=1。F=A+B。同样的A和B输入,预期输出F=1110。
做“异或”运算:设置S3-S0=0110,M=1。F=A⊕B。A=1010,B=1100,预期输出F=0110。
每做完一种运算,记录下输入和输出数据。如果发现某一位输出始终不对,重点检查那一位对应的引脚连线。
4.3 算术运算实验步骤
算术运算需要设置M=0,并且要注意CN的状态。先做最简单的加法:设置S3-S0=1001,M=0,CN=1(无进位输入)。此时F=A加B。设置A=0011(十进制3),B=0101(十进制5),预期输出F=1000(十进制8),进位输出CN+4=1(无进位)。
再做带进位的加法:保持S3-S0=1001,M=0,但把CN改为0(有进位输入)。同样的A和B,预期输出F=1001(十进制9),因为3+5+1=9。
做减法实验:设置S3-S0=0110,M=0,CN=0。此时F=A减B减1加1,实际上就是A减B。设置A=1000(十进制8),B=0011(十进制3),预期输出F=0101(十进制5)。
这里有个容易混淆的地方:S3-S0=0110在M=0时,功能是“A减B减1”,但因为CN=0(有进位输入),实际结果是A减B减1加1=A减B。如果你把CN设成1,结果就变成A减B减1了。这个细节一定要搞清楚。
4.4 实验数据记录表
下面是我在实际实验中记录的一组典型数据,供你参考对照:
| 运算类型 | M | S3-S0 | CN | A输入 | B输入 | F输出 | CN+4 |
|---|---|---|---|---|---|---|---|
| 逻辑与 | 1 | 1011 | X | 1010 | 1100 | 1000 | X |
| 逻辑或 | 1 | 1110 | X | 1010 | 1100 | 1110 | X |
| 逻辑异或 | 1 | 0110 | X | 1010 | 1100 | 0110 | X |
| 加法 | 0 | 1001 | 1 | 0011 | 0101 | 1000 | 1 |
| 带进位加法 | 0 | 1001 | 0 | 0011 | 0101 | 1001 | 1 |
| 减法 | 0 | 0110 | 0 | 1000 | 0011 | 0101 | 1 |
| 加1运算 | 0 | 0000 | 0 | 0101 | X | 0110 | 1 |
| 减1运算 | 0 | 1111 | 1 | 0101 | X | 0100 | 1 |
这张表里的“X”表示该引脚状态不影响结果。你可以用这组数据来验证自己的连线是否正确。
5. 常见问题与排查技巧实录
5.1 输出全为高电平或全为低电平
这是最常见的问题。如果LED显示全1或者全0,而且不随输入变化,通常有三个原因:一是芯片没供电,用万用表量一下VCC引脚有没有+5V;二是M引脚和S3-S0引脚没有正确连接,芯片处于未知状态;三是输出引脚接错了,比如把F0接到了LED的高位。
排查顺序:先查电源,再查控制引脚,最后查输出引脚。这个顺序能帮你快速定位问题。
5.2 某一位输出始终不对
如果只有某一位输出不对,其他位正常,那基本可以确定是那一位的连线问题。重点检查:对应的A或B输入引脚是否接好,对应的F输出引脚是否接对,以及该位的功能选择是否受S3-S0控制。有时候实验箱上的某个拨码开关坏了,也会导致某一位输入始终为固定值,可以用万用表量一下开关输出。
5.3 进位输出异常
进位不对通常是因为CN的初始状态设置错误。记住:CN=1表示无进位输入,CN=0表示有进位输入。很多同学把CN悬空,导致进位状态不确定,结果时对时错。CN引脚必须接一个确定的高电平或低电平,不能悬空。
另外,如果是多片级联,检查低位的CN+4是否正确接到了高位的CN。注意CN+4是低电平有效,如果中间经过了反相器,逻辑就反了。
5.4 减法结果差1
这是最经典的坑。减法结果差1,几乎总是因为CN设置错了。回顾一下:S3-S0=0110时,M=0的功能是“A减B减1”。要得到A减B的结果,必须让CN=0,这样实际运算就是A减B减1加1=A减B。如果你把CN设成了1,结果自然就少了1。
5.5 常见问题速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 输出全1 | 芯片未供电或M引脚悬空 | 检查VCC和M引脚连接 |
| 输出全0 | S3-S0设置错误或芯片损坏 | 更换芯片或重新设置控制码 |
| 某位输出固定 | 该位输入引脚接触不良 | 重新插拔芯片或检查连线 |
| 进位输出不变 | CN引脚悬空 | 将CN接固定高电平或低电平 |
| 减法结果差1 | CN状态设置错误 | 做A-B时CN必须接低电平 |
| 级联后高位不对 | 进位线接反或未连接 | 检查CN+4到CN的连接 |
5.6 几个实操心得
第一,连线之前先在纸上画好连接图,标清楚每个引脚接到哪里。直接上手连很容易漏线或者接错。第二,每接完一组线就通电测试一次,不要全部接完再测,否则出了问题很难定位。第三,实验箱上的LED灯有时候亮度不够,观察时注意区分高电平和悬空状态。第四,如果条件允许,可以先用Multisim仿真软件画一遍电路图,仿真通过后再实际连线,能省很多时间。
6. 从74LS181到现代CPU的ALU设计思路
74LS181虽然是一颗老芯片,但它体现的ALU设计思想在现代CPU中依然适用。现代CPU的ALU虽然集成度更高、速度更快,但基本结构是一样的:输入两个操作数,通过功能选择信号决定执行哪种运算,输出结果和状态标志。区别在于,现代ALU通常支持更多运算类型,采用超前进位等更复杂的进位技术,并且和流水线、多发射等微架构特性紧密结合。
理解74LS181的另一个价值在于,它能帮你建立“硬件如何执行软件指令”的直觉。当你在程序里写a + b的时候,底层就是ALU在执行加法运算。当你在程序里写a & b的时候,底层就是ALU在执行逻辑与运算。编译器会把高级语言的运算符翻译成ALU能识别的控制信号,这个映射关系在74LS181的功能表里体现得清清楚楚。
如果你后续要学FPGA或者数字IC设计,74LS181的实验经验也能直接迁移过去。在Verilog或者VHDL里写一个ALU模块,本质上就是把74LS181的功能表用硬件描述语言重新实现一遍。做过这个实验的人,写ALU模块时会更有感觉,因为他知道每个控制信号对应什么运算,知道进位链怎么处理,知道状态标志怎么产生。
最后分享一个我在教学中的体会:很多同学觉得计算机组成原理实验枯燥,是因为他们把实验当成了“照着指导书拨开关”的任务。但如果你换个角度,把74LS181当成一个可以编程的小计算器,把S3-S0和M当成你的“程序”,把A和B当成你的“数据”,把F当成你的“输出”,你会发现这个实验其实是在让你亲手“编程”一个硬件计算器。这种从底层理解计算的感觉,是写多少行高级语言代码都换不来的。