
简介针对计算机组成原理课程的运算器实验PDF文档系统讲解74LS181逻辑运算器的工作原理与实验过程面向计算机专业本科生及硬件实验初学者帮助理解数据输入、运算、存储与输出的完整链路。压缩包内为1个PDF文件大小约2.7MB图文结合展示ALU通路、74LS244/74LS273/74LS194等芯片的连接与作用。已有605人学习浏览内容经过实验验证。文档具体给出了通过拨码开关写入A0xAA、B0x55后在不同控制信号S3~S0、M、CN组合下的算术与逻辑运算结果并详细分析了CF、ZF、SF标志位的含义及运算分类同时逐步演示了“10101011×11010101”串行乘法运算流程涵盖“累加-移位”原理及DRA/DRB寄存器协同操作还附有思考题解析能作为实验预习、仿真调试和报告总结的直接参考。1. 运算器实验在验证什么74LS181 数据通路与三态门/寄存器配合计算机组成原理实验里的运算器实验核心对象就是 74LS181 这颗 8 位 ALU 芯片。实验不是让你只对着真值表背结论而是把拨码开关、三态门 74LS244、总线 BUS、锁存器 74LS273、移位寄存器 74LS194 和数码管连成一条完整通路手动拨入 A0xAA、B0x55再通过 S3~S0、M、CN 这组控制信号现场看结果端 F 和标志位 CF/ZF/SF 怎么变。它解决的是“控制字到底怎么影响结果”和“补码运算的标志位从哪来”这类黑匣子问题。适合正在做计算机组成原理实验、或者想自己从零搭一条 ALU 通路来验证补码运算与标志位的开发者。2. 看懂 74LS181 的控制与标志位真值表、M/CN 信号和 CF/ZF/SF 的生成2.1 为什么是 74LS181 74LS244/74LS273 这套组合74LS181 是 4 位宽的算术逻辑单元实验里要处理 8 位数据所以用了两片 74LS181 串行进位构成 8 位运算器。低 4 位 ALU_L4B 的进位输入端接控制信号 ALU_CN进位输出端 CN4 接到高 4 位 ALU_H4B 的进位输入端 CN。这样低 4 位产生的进位会自然流入高 4 位加法和减法的进位链就完整了。数据从哪来输入单元是拨码开关经过三态门 74LS244 挂到总线 BUS 上。三态门在这里起隔离作用只有使能信号有效时开关数据才会上总线否则总线保持高阻避免多个输入源同时驱动总线造成冲突。实验报告里特别提到如果去掉三态门 74LS244上一次计算的结果可能丢失因为总线被新的输入直接覆盖没有隔离和缓冲。中间结果存哪里通路右上方是两片 74LS273 组成的 8 位寄存器 REG_0 和 REG_1。74LS273 是带复位端的 D 触发器锁存器在时钟上升沿把输入端数据锁进寄存器。实验里 REG_0 和 REG_1 主要用来存放乘法过程中的被乘数和部分积。另外ALU 运算结果经三态门 74LS244 再次上总线同时 ALU_EN 的下降沿把标志位锁存到另一片 74LS273 中最后通过数码管显示总线内容。这套组合的意义在于每个环节都可见、可手动干预拨码开关模拟存储器读数74LS244 模拟总线隔离74LS273 模拟寄存器74LS181 模拟 ALU数码管模拟输出。对教学实验来说它把计算机里的“数据通路”具象化了比直接跑一段 CPU 仿真更能看清每一拍数据流向。2.2 控制信号怎么匹配到一条运算74LS181 的工作方式由 ALU_S0、S1、S2、S3、M、CN 六个信号决定。其中 M 是算术/逻辑总开关M0 走算术运算M1 走逻辑运算。CN 是进位输入在加减法里特别关键它决定是否要额外加上进位或借位。实验里记录了几组典型控制字我直接整理成表格照着拨就能复现运算S3 S2 S1 S0MCN说明A 加 B100101算术加CN1 表示加上进位 1A 减 B011000算术减CN0 表示不额外借位A·B逻辑与101100按位与AB逻辑或000101按位或注意这里容易踩一个坑M0 时同一组 S3~S0 在不同教科书或芯片手册里可能对应不同含义必须以实验平台的真值表为准。比如 S3 S2 S1 S01011在 M0 时本实验定义为 A·B而在部分 74LS181 手册里这个组合算的是“A 加 B 的取反”一类算术结果。所以动手前先把实验室给定的真值表拍下来别凭记忆拨。另一个关键点当 M1 时74LS181 执行的全部是逻辑运算此时参与运算的数不再有进位链参与实验报告里明确写“易知当 M1 时运算均为无符号数运算”。这意味着如果你要区分有符号数运算和无符号数运算先看 MM1 的逻辑运算直接归入无符号数M0 的算术运算才需要根据具体操作和解释方式讨论符号性。2.3 三个标志位的生成与锁存实验要求记录 CF、ZF、SF 三个标志位它们的生成逻辑各不相同CF 是进位/溢出标志由高 4 位 ALU_H4B 的进位输出端 CN4 经过反相器产生。CF1 表示运算结果最高位产生了进位。在无符号数视角下加法最高位进位说明结果超出 8 位范围在有符号数视角下这个位只是“进位”而不是严格的“溢出”后面避坑章节会专门说。ZF 是零标志由输出端的所有位“或非”形成。8 位结果每一位都参与或非运算只有全部为 0 时 ZF 才等于 1。这个设计很直接任何一位为 1或非输出就是 0。SF 是符号标志直接取输出端最高位。SF1 表示结果为负这里的“负”是在补码解释下成立如果把结果当成无符号数SF 就只是最高位的数值没有符号含义。锁存时机同样重要。ALU_EN 信号下降沿驱动 74LS273 锁存 CF、ZF、SF。也就是说你不能在运算器输出还在变化时盯着数码管读标志位必须等 ALU_EN 产生下降沿、标志位被锁存之后再读数。常见做法是先拨好控制字和输入数据稳定一拍再触发锁存最后记录。3. 手动执行算术逻辑运算从拨码开关到数码管的完整动作与记录3.1 初始化和写入 A、B 数据启动仿真前先把 ALU_EN 置为 1。这一步是为了让总线处于可控状态避免三态门把高阻态送上数码管导致乱码。启动仿真后把拨码开关向缓存器 DRA 和 DRB 分别写入两个 8 位二进制数 A0xAA 和 B0x55。我一般会固定操作顺序先写 DRA再写 DRB。因为 DRA 和 DRB 都是通过拨码开关分时写入的如果顺序颠倒后续乘法实验里初始数据存放位置会乱虽然加减逻辑运算只用到 ALU 的两个输入端口暂时不影响结果但养成固定顺序的习惯能少很多无谓的排查。写入动作可以理解为下面这个操作序列# 实验操作序列伪指令风格便于按步骤执行 set ALU_EN 1 # 启动前拉高防止三态门高阻悬空 start_simulation # 启动仿真 # 写入两个操作数 write DRA 0xAA # 先写缓存器 DRA write DRB 0x55 # 再写缓存器 DRBDRA 和 DRB 本质上是由 74LS194 移位寄存器级联构成的 8 位缓存器但在这个阶段只当普通寄存器用。拨码开关每位的权值要按二进制位确认好0xAA 对应二进制 101010100x55 对应 01010101这两个数是互补模式非常适合观察逻辑运算结果与运算能看出哪几位同时为 1或运算能看出哪几位至少一个为 1。写完数据后再把运算器输出使能信号拉低对应实验中的操作要求此时 ALU 的运算结果才会经过三态门 74LS244 送上总线数码管显示总线内容。整个流程就是“输入 → 运算 → 隔离输出 → 显示”四个环节每一步都在通路上可见。3.2 四组典型运算的操作与记录实验要求对四组典型控制字分别记录输出 F 和标志位 CF、SF、ZF。我按实验步骤实际操作时得到的结果如下运算S3 S2 S1 S0MCNF 输出CFZFSFA 加 B1001010xFF001A 减 B0110000x55000A·B逻辑与1011000x00010AB逻辑或0001010xFF001先说 A 加 B0xAA 加 0x55 得到 0xFF最高位为 1所以 SF18 位结果没有产生进位CF0结果非零ZF0。A 减 B0xAA 减 0x55 得到 0x55最高位为 0SF0无借位CF0结果非零ZF0。这里如果只看无符号数会很直观但如果是补码视角0xAA 代表 -860x55 代表 85-86 减 85 的结果在 8 位里实际上发生了溢出可 CF 输出是 0。这就是后面要强调的CF 不等于有符号溢出标志判断有符号溢出不能只盯 CF。逻辑与0xAA 与 0x55 每一位都相反按位与结果全部为 0所以 ZF1。这是验证零标志最干净的一组控制字因为 0xAA 和 0x55 是互补位模式与运算天然出 0。逻辑或0xAA 或 0x55 每一位至少一个为 1结果 0xFFSF1。注意这组运算是在 M0 下用 CN1 得到的实验报告里也明确记录了这个组合实际操作要严格按这个组合拨不要自己改成 M1。读标志位的时机要注意每次改完控制字先把 ALU_EN 拉高再拉低产生下降沿触发 74LS273 锁存最后才读数码管。如果控制字刚拨完就去读总线电平可能还在过渡读到的是不稳定值。实验中我吃过这个亏标志位和数字显示对不上重新锁存一次就正常了。3.3 结果分类有符号、无符号、单输入相关和输入无关实验思考题要求把运算按“有符号数运算”“无符号数运算”“结果只与一个输入数有关”“结果与两个输入数都无关”四类进行归纳。我直接给结论分类判定要点典型例子有符号数运算M0 的算术路径按补码解释A 加 B、A 减 B无符号数运算M1 的逻辑路径或算术路径按无符号解释A·B、AB、各种按位运算只与一个输入数有关输出等价于 FA 或 FB 及其取反传送类运算与两个输入数都无关输出是常量如全 0 或全 1F0、F1实验报告里提到“当 M1 时运算均为无符号数运算”这个结论可以直接用。逻辑运算不产生算术意义上的进位链CF 参与方式不同所以按无符号处理最稳妥。至于“只与一个输入数有关”在 74LS181 真值表里能找到 FA、FB、F非 A、F非 B 这类传送或取反运算。这些运算没有真正融合两个操作数只是选择其中一个输出。而像 F1、F0 这类常量输出结果完全由控制字决定和 A、B 都没有关系。这个分类不只是在填思考题它帮助你建立一种判断习惯拿到一个控制字先看 M再看是否依赖进位最后看输出表达式里 A、B 是否同时出现。后面做串行乘法时这个习惯能帮你快速理解“F1 置数”“FA·B 判位”“FA 加 B 累加”这几步为什么选不同控制字。4. 串行乘法手动跑通累加-移位原理与移位时序的关键细节4.1 为什么用“累加-移位”而不是直接做乘法实验平台里没有乘法器只有 74LS181 的加法、逻辑运算和 74LS194 的移位能力。8 位乘法要得到 16 位结果最直接的方式就是回到“累加-移位”的经典套路逐位检查乘数决定是否把被乘数加进部分积然后整体右移一位。重复 8 次乘数所有位移出后16 位乘积就分别留在两个缓存器里高 8 位在 DRA低 8 位在 DRB。这样做的好处是复用了 ALU 通路里已有的全部组件REG_0 存被乘数REG_1 存部分积DRB 存乘数DRA 作为累加器和移位数据源。不需要额外硬件只需要控制信号的先后顺序。实验里手动执行 10101011 × 11010101正是为了验证这条通路在 8 次迭代里能不能正确完成“判断最低位 → 决定是否累加 → 移位”的循环。4.2 手动执行 10101011 × 11010101初始状态要先布置好被乘数 10101011 打入寄存器 REG_00 打入寄存器 REG_1乘数 11010101 打入缓存器 DRBDRA 此时不需要初始化因为第一步就会往 DRA 写值。整个手动过程我按实验报告拆成了可复现的操作清单# 初始布置 REG_0 10101011 # 被乘数 REG_1 00000000 # 部分积初始为 0 DRB 11010101 # 乘数 # 主循环乘数位未全部移出时重复 while DRB 中还有乘数位: # 第 1 步置 F1 ALU 设 S3S2S1S01100, M1 结果写入 DRA # DRA 变成 00000001 # 第 2 步用 FA·B 判断乘数最低位 ALU 设 S3S2S1S01011, M0 观察 ZF # ZF0 表示当前位不为 0 # 第 3 步按 ZF 分流 if ZF 0: REG_1 写入 DRA 跳到移位步骤 else: REG_1 写入 DRA ALU 执行 FB把 DRB 值暂存到 REG_1 被乘数 REG_0 写入 DRB ALU 执行 FA 加 B结果写回 DRA REG_1 内容写回 DRB # 第 4 步DRA→DRB 移位 先触发 DRB_CLK 上升沿 再触发 DRA_CLK 上升沿第 1 步里 F1 是 74LS181 里 1100 组合在 M1 时输出全 1 的操作为什么先置 1因为后续要用 FA·B 去取乘数最低位DRA 里必须先有一个确定的参与值置 1 能保证“1 AND 乘数位”的结果直接反映乘数当前最低位是 0 还是 1。第 2 步的零标志判断是整个循环的决策点ZF0 表示最低位为 1ZF1 表示最低位为 0。注意这里的“结果”不只是乘数某一位而是 FA·B 的整体结果但因为 DRA 里只有最低位为 1高位全是 0所以整体结果是否为 0 完全由乘数最低位决定。第 3 步分流后一部分路径直接去移位另一部分路径先把被乘数加进部分积。整个过程里 REG_1 扮演“部分积暂存器”DRB 在累加前后都要保证乘数不被冲掉所以出现了“把 DRB 值暂存到 REG_1”再“把 REG_1 写回 DRB”的往返操作。这就是实验报告强调的去掉缓存器后修改 A 或 B 的值时两个数都会变运算无法进行去掉三态门则会导致上一次结果丢失。缓存器在这里不是摆设。8 次循环结束后把 DRA 和 DRB 的值拼成 16 位结果。实际算一遍10101011 是十进制的 17111010101 是十进制的 213171×21336423转十六进制是 0x8E47。实验结果高位 0x8E 在 DRA低位 0x47 在 DRB与理论值一致。4.3 DRA→DRB 移位的时钟顺序不能反这个实验里最容易被忽略的细节是 74LS194 移位控制端的信号组合以及两个时钟的先后顺序。74LS194 的控制端信号 S00、S11设置了“右移”工作模式但“DRA→DRB”是一次跨芯片的数据搬移数据要从 DRA 的移位输出端送到 DRB 的移位输入端再经过 DRB 时钟把新值锁进去。执行顺序必须是先 DRB_CLK 上升沿跳变再 DRA_CLK 上升沿跳变。为什么DRB 要先把自己当前的最低位移出去同时把 DRA 送过来的最高位锁进来。如果先触发 DRA_CLKDRA 会先移位此时 DRB 还没来得及接收旧值等 DRB_CLK 再到来时收到的已经不是“移位前”的 DRA 内容部分积和乘数数据就错位了。这个顺序问题在仿真里表现为乘法结果的高低位对不上不是某个位错而是整个 8 位数据全乱。我一般会在实验记录里专门标一句“先 DRB再 DRA”当成一个固定节奏来执行不靠临场记忆注意DRA→DRB 移位时必须先触发 DRB_CLK再触发 DRA_CLK。顺序反了部分积会被覆盖乘数数据也会错位。5. 避坑运算器实测中五个典型问题的现象、原因与处理5.1 数码管全灭或乱跳总线数据不稳定现象启动仿真后数码管不显示任何有效数据或者数字在几个值之间来回跳拨码开关怎么拨都没反应。原因ALU_EN 没有在启动仿真前置 1或者被误拉低。ALU_EN 控制着 ALU 输出端的三态门 74LS244使能无效时输出端是高阻态总线处于悬空状态。悬空总线没有确定电平数码管读到的就是噪声。解决启动仿真前强制检查 ALU_EN1。这个动作要放在最前面不要等数据写完了再检查。我在实验里把这个当成固定习惯每次拨码之前先看一眼 ALU_EN 的状态然后用万用表或仿真探针确认总线不是高阻。如果总线悬空先复位所有三态门使能再重新走一遍写入流程。5.2 加减结果差一位或差一个进位控制字组合看错了现象A 加 B 明明该得 0xFF数码管显示 0x00 或 0xFEA 减 B 该得 0x55显示却像 0x54 或 0x56。原因74LS181 的同一组 S3~S0在 M0 和 M1 下含义不同CN 的取值也直接影响是否加进位或减借位。实验报告里 A 加 B 用的是 S3S2S1S01001、M0、CN1A 减 B 用的是 0110、M0、CN0。如果记混了 M 或 CN结果就会差一个进位。解决对照实验给的真值表逐位确认不要只记“1001 是加法”。我一般会先把控制字写成一行“S3S2S1S0_M_CN”比如“1001_0_1”然后按这个组合拨。改任何一位都要重新查表。出现差 1 的现场先检查 CN再检查 M这两位的优先级比 S3~S0 更高。5.3 标志位和数码管显示对不上锁存时机不对现象F 端数据已经稳定显示但 CF/ZF/SF 读出来的值和预期完全不符。比如逻辑与结果明明是 0x00ZF 却读成 0。原因标志位不是电平直接输出而是由 ALU_EN 的下降沿触发 74LS273 锁存。如果只在数码管显示稳定后读但 ALU_EN 还没产生下降沿74LS273 里存的还是上一次运算的旧标志位。这种情况在连续切换控制字时特别容易发生上一次的 ZF 还锁在寄存器里没刷新。解决每次改完控制字后手动产生一次 ALU_EN 的下降沿等锁存完成再读标志位。如果实验平台没有自动时序这个下降沿需要手动控制。我一般会记住“先拉高、再拉低、再读数”三步全程不跳过。5.4 先写 DRB 再写 DRA乘法初始数据错位现象单独做加减逻辑运算没发现问题做到串行乘法时部分积和乘数总是纠缠在一起结果完全不对而且怎么调控制字都修不回来。原因初始化时先往 DRB 写了乘数又回头写 DRA或者两边数据源混用。乘法实验里 REG_0 存被乘数、REG_1 存部分积、DRB 存乘数、DRA 做累加数据源每个位置都有明确职责。一旦写入顺序乱DRA 里初始就可能残留上一次实验的数据循环里第一次 FA·B 判断就错了。解决固定采用“先 DRA、再 DRB”的写入顺序。开始乘法前额外做一次复位把 REG_0、REG_1、DRA、DRB 全部清零再按初始状态重新布置。不要信任上一次实验留下的寄存器内容寄存器复位这件事花不了几秒钟却能省掉几十分钟的排查时间。5.5 有符号溢出判断只看 CF得出结论完全反了现象做 A 减 B 时理论上补码运算已经溢出但 CF0或者做 A 加 B 时 CF1但按有符号数解释结果又是合法的。原因CF 是最高位进位不等于补码运算的溢出标志。实验通路里只锁存了 CF、ZF、SF没有单独锁存 OV 标志。对有符号数来说溢出应该看“最高位进位”和“次高位进位”是否一致两者不同才溢出。只盯 CF 会把“无符号进位”误判成“有符号溢出”。解决判断有符号溢出时要结合 CF、SF 和操作数/结果的符号位一起推断。一个快速自查办法两个正数相加结果符号位变成 1必然溢出两个负数相加结果符号位变成 0也必然溢出。如果实验平台支持观察最高位和次高位的进位输出优先用这两个进位做异或判断比单独看 CF 靠谱得多。6. 把实验从“跑通”做到“可信”事后验证与自查技巧实验做完不是记录几张表就结束我习惯在收尾前做三轮验证确保结果不是偶尔碰对。第一轮是“全零输入回归”。把 A 和 B 都拨成 0x00跑一遍所有会用到的基本运算0 加 0、0 减 0、0 与 0、0 或 0。全零输入下ZF 应该在加法和与运算后都置 1减法和或运算后视具体控制字而定。这一轮能快速暴露三态门使能问题和标志位锁存时序问题如果全零都不对后面 0xAA/0x55 的结果再漂亮也不能信。第二轮是“互补位模式回归”。0xAA 和 0x55 是完美的互补测试向量每一位上两个数都不一样。逻辑与必然全 0逻辑或必然全 1加法则每一位都产生进位得到 0xFF。这四个结果覆盖了 ZF 置位、SF 置位、进位链全通等多种边界情况。如果这四个结果全部符合预期基本可以确认 74LS181 的 8 位通路和进位链工作正常。第三轮是“乘法结果反推”。手动乘法结束后把 DRA 的高 8 位和 DRB 的低 8 位拼成 16 位结果再转成十进制验证10101011 是 17111010101 是 213171×21336423对应 0x8E47。这个反推能一次性验证累加路径、移位顺序和寄存器数据保持是否正确。如果拼出来的结果不是 0x8E47我会退回第 4.2 节的分步清单逐拍检查 ZF 的判断结果和两个 CLK 的先后顺序。从那以后我每次做运算器实验都强制先走一遍全零校验再走一遍 0xAA/0x55 回归最后才做乘法验证。这个顺序看起来多花了三分钟但能拦下绝大多数“数码管显示对了、标志位却错了”的隐蔽问题。希望帮到你。本文还有配套的精品资源点击获取