运算器组成实验全解析:从74LS181到数据通路

发布时间:2026/10/8 8:55:07
运算器组成实验全解析:从74LS181到数据通路 第一次做运算器组成实验的时候我对着实验箱着实发了一阵呆上一节的译码器、选择器好歹还能靠真值表一项项对着看到了这一节眼前多了一堆寄存器、ALU、三态门、总线还有好几个“功能选择”开关和一堆LED灯。后来我才明白实验二在整个计算机组成原理课程里的位置恰恰是第一次让你把“电路”升级成“计算机部件”——运算器不是一堆芯片的随便拼接而是数据通路的第一个完整闭环。这篇文章就把实验二从原理到操作、从标志位到进位扩展、从接线到验收的完整思路写下来给正在做这个实验的同学一个可以直接照着走的参考。1. 这个实验到底在搭什么先建立整机视角1.1 运算器在CPU里扮演什么角色计算机组成原理这门课讲的就是“计算机怎么把指令变成计算”。而运算器就是CPU里真正干“算”这个活的部件。你可能已经学过CPU内部大致由运算器、控制器、寄存器组和内部总线组成控制器负责“指挥”运算器负责“执行”加法、减法、与、或、异或、比较都是在运算器里完成的。实验二叫“运算器组成实验”核心目的不是让你像做数学题一样把二进制数加出来而是让你亲眼看懂两个数到底是怎么被送进运算器、在ALU里发生了什么、结果又是怎么被送出来、标志位是从哪冒出来的。换句话说实验二表面上是搭一个能算加法的电路本质上是要把数据通路的骨架看清楚。1.2 “运算器”的三种常见构成方式不同学校的实验平台差别挺大但为了让你不管遇到什么平台都不慌我把见过的情况统一归纳成三类第一类是经典分立芯片方案以74LS181为核心ALU配合74LS374、74LS273这类锁存器/寄存器再通过三态缓冲器挂在内部总线上。这种方式连线多、逻辑透明最适合理解原理。第二类是实验箱内嵌CPLD/FPGA方案。实验箱里已经用硬件描述语言实现了ALU外部只留出数据输入开关、功能选择开关、脉冲按钮和LED显示。操作起来简单一些但对内部逻辑的把控就差一些。第三类是纯软件仿真比如用Proteus、Multisim或者教学平台里的虚拟实验本质是把第一类电路搬到了电脑里。不管你用的是哪一类实验二真正考你的东西是一样的能不能看懂数据流向能不能解释为什么某个控制信号下会出现某个结果。所以后面我讲原理时以第一类最经典的电路结构为主线操作部分再说明不同平台的差异。1.3 实验平台的差异怎么应对我先说一个经验拿到实验指导书第一件事不是急着连线而是翻到“实验平台说明”那一页搞清楚平台上哪些端口是直连芯片引脚的、哪些端口已经内部接好了。有些实验箱把74LS181的输入接在了一个“数据输入锁存器”上你在面板上拨的开关不是直接连到芯片而是先打进锁存器再在时钟脉冲控制下送往ALU。这种情况下如果你对着芯片手册找引脚会发现对照不上那不是坏了而是中间多了部件。所以我的建议是先画一张你手上平台的结构草图标清楚“开关→数据输入寄存器→ALU→结果寄存器→LED显示”每一级是谁、控制信号是什么。这张图画完实验等于完成了一半。2. 核心元件逐个拆解ALU、寄存器、三态门与总线2.1 ALU74LS181是绝对主角74LS181是一块4位ALU芯片算是计算机组成原理实验里最经典的芯片了。它一次能处理4位二进制数内部能完成多种算术运算和逻辑运算具体做什么运算由M信号和S3~S0这四个选择信号共同决定。M端是模式选择M0时做算术运算加减法这一派M1时做逻辑运算与、或、非这一派。S3~S0的组合决定具体操作。它的引脚不算复杂但有几个必须注意A0~A3、B0~B3两个4位操作数的输入。F0~F34位运算结果输出。Cn来自低位的进位输入在多片级联时特别重要。Cn4进位输出加法时最高位产生的进位会从这里送出去。AB相等标志输出两个操作数相等或运算结果相等时有效。G和P用于多片级联时产生进位函数和传递函数做组间并行进位时要用实验二一般用不到但后面扩展会提到。很多同学第一次看74LS181的功能表都会懵因为那张表比一般的真值表长得多。我的读法是不要背表只记三行。M1时S全0是A取反S全1是A直通M0时S1001是A加B加进位S0110是A减B减1。剩下的诡异操作等老师问了再去查表都来得及。2.2 寄存器与锁存器数据的落脚点运算器不是算完直接给结果就完了数据需要暂时放在寄存器里等待下一拍继续处理。实验里常见的寄存器有两类一类是普通D锁存器比如74LS373或D触发器比如74LS374、74LS273用来暂存操作数A和B另一类是结果寄存器用来锁存ALU的输出。这里要明白“锁存”和“定时写入”的区别。锁存器是电平敏感的使能端有效时输出跟随输入使能端无效时输出保持边沿触发器是边沿敏感的只在时钟脉冲的上升沿或下降沿一瞬间采样输入。实验里写数据的动作通常靠一个“单脉冲”按钮完成你设置好数据然后按一下按钮产生一个干净的上升沿或下降沿数据就被打入寄存器。这也是为什么实验台上有“数据开关”、“打入脉冲”两个东西配合着用你先把数据准备好再打脉冲如果顺序反了打进去的可能就是上一次拨的旧值。2.3 三态门与总线避免“多个输出打架”运算器实验里一个重要概念是总线。多个部件要把数据送到同一个接收端但如果不做隔离两个部件同时往一条线上送数据会把电路直接拉坏或者输出逻辑混乱。三态缓冲器就是为了解决这个问题它除了输出高电平、低电平还有第三种状态——高阻态相当于把输出端和总线物理上断开。实验中典型做法是寄存器A的输出通过一组三态门挂在总线上寄存器B的输出也通过一组三态门挂在同一条总线上谁想占用总线谁就把对应的三态门打开选通信号有效其他三态门全部变成高阻态。这就像一群人都想对麦克风说话但只有拿到控制权的人开关接通其他人退到后台。看到这里你应该意识到这其实就是后续“总线结构CPU”实验中数据冲突控制的前奏。2.4 指示灯、开关与脉冲输入实验面板上的东西翻译成技术语言就是“数据开关”——给内部寄存器写操作数“功能选择开关”——给ALU的M和S信号“脉冲按钮”——给寄存器提供时钟信号“LED灯”——显示运算结果以及C、Z、S、V这些标志位的状态。LED灯接线通常是高电平亮、低电平灭如果你拨了数据开关看到LED不亮先别急着怀疑芯片烧了回头查一下这组LED是不是接到了反相器后面。我见过不少同学把“电平极性搞反”误判成“芯片坏了”最后检查半天发现其实只是测量点选错了。3. 完整流程走一遍接线、操作与原理同步讲解3.1 接线前一定要做的事如果是分立芯片的实验箱接线之前先通电检查一遍电源芯片的VCC一般是第14脚或者第20脚具体查你手上的数据手册是否接到了5VGND是否接好。不要相信“实验台上默认接好了”这种话我实测遇到过三块板子电源指示LED亮的但芯片VCC引脚虚接结果怎么调都不出正确结果。接线顺序我建议这么走给两片或四片74LS181的电源和地接好先保证每个芯片能正常工作。接M和S0~S3先固定成“加法模式”也就是M0、S3S2S1S01001。接A和B的数据输入注意高低位顺序A0对应数据开关的最低位。接进位输入Cn单片实验时接地或接高电平取决于芯片手册是高有效还是低有效74LS181的进位信号常见是低有效。最后接显示输出F0~F3接一组LED各级联片的进位输出Cn4接到下一片或接标志LED。一个非常实用的习惯是每接完一步用手拨一下开关看对应的LED有没有变化。不要全部接完才通电测试否则出了问题根本不知道是刚才哪根线错了。3.2 数据输入单步流程连线完成后按下面这个顺序跑一个加法实验通电确保各芯片处于复位后的稳定状态必要时先按一次“复位”。把M0、S1001设置好。用数据开关给A寄存器送入第一个数。比如做4位加法A00113把对应开关拨到位。给B寄存器送入第二个数比如B01015。按一次“单脉冲”按钮把数据同时打进寄存器A和B。观察F0~F3对应的LED理论上应该显示1000也就是8。如果看到结果不是8不要急着重新接线。先按下面顺序排查先检查数据开关有没有拨对再检查寄存器有没有真的收到数据最后看ALU的两组输入有没有接到寄存器输出上。这一步一步下来基本不会漏。3.3 验证几个典型运算建议你不要只做加法把下面这几个典型操作都跑一遍每个操作都对照功能表验证结果是否正确加法A0111、B0001结果应为1000进位标志C应变为0。减法A0101、B0011用S0110A减B减1再把进位输入设为1结果应为0010。逻辑与M1选择“与”功能A1100、B1010结果应为1000。取反M1使功能为F非AA0000结果应为1111。每种运算都记录一份“输入、功能选择、输出、标志位”的表格这份表格就是实验报告里最有说服力的数据。我有一次给实验室当助教看到有同学只记录了一个加法结果就想写报告那报告根本没法写因为老师一定会追问“其他操作验证过没有”。4. 标志位与补码实验报告最容易被追问的角落4.1 进位标志C无符号数的溢出信号许多同学以为C只是“最高位产生的进位”这个理解不算错但不够完整。在ALU里C标志是加法运算最高位产生的进位输出它直接反映了无符号数运算有没有超出表示范围。以4位加法为例A10008、B10008结果应该是16但4位加法器只能存放4位结果F输出0000最高位进位Cn4输出1此时C1。对无符号数来说C1就代表溢出因为88在4位范围内已经放不下了。注意这里和后面要讲的V标志完全是两回事不要混淆。4.2 零标志Z和符号标志SZ标志表示运算结果是否为0。判断方法很简单ALU的所有输出位F3~F0都为0时Z1只要有一位是1Z0。它在后续跳转指令里特别常见比如“相等则跳转”其实就是先做减法然后判断Z标志。S标志则取的是结果的最高位。注意这要结合有符号数来看最高位是符号位S1说明结果为负数S0说明为非负数。所以当你用补码做减法时S标志能帮你快速判断结果的正负。4.3 溢出标志V最容易出错的地方V标志专门针对有符号数操作计算公式是最高位进位和次高位进位异或。用文字解释就是如果最高位和次高位向更高位产生的进位不一致说明有符号运算发生了溢出。举一个很经典的例子4位补码下做71。7的补码是01111的补码是0001逐位相加时次高位有进位、最高位没有进位出于是V1。但这时C0。所以你会看到很有意思的现象同一个加法C0表示无符号没溢出V1表示有符号溢出了。很多同学觉得“C和V只能有一个”那是错的C管无符号V管有符号两者各自独立判断。4.4 在实验台上亲眼看一次溢出我建议你在实验台上做一次这个验证设置A0111、B0001M0、S1001。记下此时F1000、C0、V1。再做一次A1000、B1000此时F0000、C1、V1。把这两组结果记录下来实验报告里的标志位部分就非常充实了。老师如果追问“什么时候C和V不一致”你就直接把第一组例子甩出来这比背定义有说服力得多。5. 从8位到16位组间串行进位与进位链扩展5.1 为什么要级联74LS181只能处理4位数据计算机里的整数至少是8位、16位甚至32位。实验二一般会要求你把两片或者四片74LS181级联起来做成8位或16位运算器。级联的关键就是进位信号的传递。低4位的ALU在做加法时会产生一个进位输出Cn4这个信号必须接到高4位ALU的进位输入Cn上高4位才能正确地把低位来的进位加上。这种把低片进位输出直接接到高片进位输入的连接方式就叫组间串行进位或者叫行波进位。5.2 级联接线的实际操作以8位加法器为例假设你手上是两片74LS181低片接的是第0~3位高片接的是第4~7位。低片的Cn4接到高片的Cn。低片的G、P悬空或者按实验指导书要求接相应逻辑。高片的Cn4作为整个8位运算器的进位输出接到C标志LED。这里有个最容易犯的错低片的Cn输入在单片实验时你可能习惯接高电平或低电平级联时低片的Cn要按整个8位加法的最低位进位来处理。如果做的是最普通的加法最低位没有外部进位就要根据手册把它设为不产生进位的电平千万不要把低片的Cn悬空。悬空引脚在某些芯片上会呈现“浮空高电平”导致每次加法最低位都多了一个进位结果全错。5.3 组间串行进位的延迟实验背后的性能问题如果你把四片74181级联成16位运算器会发现在“串行进位”方式下最高位的结果要等低位的进位一级一级传上来才能稳定。低片算完进位输出到中间片中间片才能算中间片算完进位又传到高片高片才算。这个过程就是行波进位总延迟正比于级联的片数。这也是为什么实验指导书里通常还会提一句“组内先行进位、组间串行进位”的概念74181片内用的是先行进位速度较快但片与片之间只是简单串联成了速度瓶颈。要想更快就得用专门的先行进位发生器比如74LS182同时提供片间的进位信号这就是“组间并行进位”的思路。下面的表可以帮你理解各级方案的关系进位方式片内/组内片间/组间延迟特点串行进位逐位传递逐级传递最简单延迟随位数线性增长组内先行进位并行产生组间仍串行片内快片间仍有瓶颈组间并行进位先行进位由专门芯片统一产生延迟低电路更复杂5.4 从实验到考试题很多同学做完实验觉得“组间串行进位”这个概念只在实验箱里有意义没意识到这是考研和期末考试的常客。常见的考法就是给出每级的门延迟时间让你算16位行波进位加法器的总延迟是多少。解题思路就是数一数有几级进位传递每级经过哪些门再乘上门延迟。我建议你在写实验报告时主动把“组间串行进位”的延迟分析写进去不要只画一张级联图。这一部分既是实验的扩展也是考试最容易丢分的地方提前搞清楚非常划算。6. 连线、时序与验收做完三遍之后总结的排查经验6.1 现象一结果灯全亮或全灭功能选择开关没反应这种情况大概率不是芯片坏了而是三态门的方向选通出了问题。你可以回忆一下总线上如果同时有两组数据在“抢线”结果往往表现为某个固定电平LED就会全亮或者全灭。排查方法是先断开一个寄存器的输出选通强行让它变成高阻态再观察现象是否变化。6.2 现象二数据打不进寄存器怎么按脉冲都没反应先检查脉冲按钮的输出有没有接到寄存器时钟端。很多实验箱的脉冲按钮在面板上有两个输出端子一个输出单脉冲一个输出连续脉冲你要接的是单脉冲那个。另外确认寄存器的复位端没有一直被拉在有效电平上如果复位信号一直有效时钟来了也不干活。这里补充一个非常容易忽略的点按键式单脉冲会产生抖动如果一个抖动恰好触发两次时钟边沿寄存器可能被打入一个不确定的值。实验箱一般会做滤波但有些简易实验箱没有这时你可以手动把脉冲按慢一点或者在报告里注明“本实验采用手动单脉冲在按键释放时采样数据”体现出你思考过这个问题。6.3 现象三低片结果对高片结果不对这种情况大概率是级联的进位端接错了。先检查低片进位输出和高片进位输入之间有没有接通再检查接的是不是“进位输出”而不是“相等输出”。AB和Cn4两个引脚离得近有些同学会看错。另外高片的数据输入和低片的数据输入也要分别接到两组数据开关上不要图省事全部并联。并联的话高片和低片会同时收到同一组4位数据8位里的高4位就永远跟低4位一样了结果怎么看怎么怪。6.4 验收时老师常问的几个问题我做助教时发现老师问来问去其实就那么几个问题把这些准备好验收基本稳了问C和V有什么区别答C是无符号溢出标志取最高位进位V是有符号溢出标志取最高位进位和次高位进位异或。问为什么M0和M1时同一个S码对应的结果不一样答M决定了ALU内部是做算术逻辑还是逻辑运算M0时进位链参与运算M1时进位链不参与。问级联时为什么要把低片的Cn4接到高片的Cn答因为高位的加法需要考虑低位产生的进位这是多位数加法的基础。问如果运算结果和你预期不一致你怎么排查答按数据流向逐级检查先看输入端数据是否备好再看寄存器的时钟是否有效最后看ALU输出和标志位。6.5 最后说点实在的实验二做完我最大的体会不是“我会用74181了”而是“我终于知道老师说的一句话是什么意思了”计算机里的加法其实是在电路上一拍一拍完成的数据要放在寄存器里总线要分时复用控制信号一步都不能乱。这些道理在课本上读一百遍都不如自己在实验台上把一根线插错、再亲手把它找出来来得深刻。所以如果你哪个步骤卡住了别急着烦躁那正是这个实验最有价值的部分。