简介:这份运算器实验报告面向计算机组成原理课程的学习者与实验者,聚焦算术运算硬件的设计与验证,帮助读者在理论学习之外完成从电路搭建到测试分析的完整实践。资源包共1个docx文件,约1.26MB,内容围绕8位可控加减法器、4位快速加法器与16位快速加法器三个实验项目展开,涵盖设计要求、方案设计、实验步骤、故障调试与测试分析等模块。其中8位可控加减法器采用全加器串行结构,通过Sub信号控制加减并给出溢出检测;4位快速加法器借助CLA74182实现先行进位,降低进位延迟;16位快速加法器则由四个4位单元扩展而成,体现组内与组间先行进位的组织思路。报告还记录了具体测试输入输出与调试要点,便于读者对照复现电路、理解进位生成与传递函数。目前已有2565人学习,适合需要完成实验报告撰写或巩固运算器设计的中高年级学生参考。
1. 运算器实验的知识地图:从全加器到 16 位先行进位
运算器实验是计算机组成原理里少数几个“画得出、连得上、测得了”的硬件实验,核心链路其实只有一条:一位全加器 → 8 位串行可控加减法器 → 4 位先行进位快速加法器 → 16 位组间先行进位加法器。很多人复习时把它当成三个孤立电路背,结果一到进位链就翻车。梳理下来会发现,这三个实验是同一套进位逻辑的三次放大:串行进位解决“能不能算”,先行进位解决“算得快不快”,组间先行进位解决“位数变多以后还快不快”。适合正在准备实验报告、期末复习或复试硬件问答的人,把这张地图先立住,后面每个模块的要点才有地方挂。
2. 8 位可控加减法器:Sub 信号、补码与溢出检测
2.1 电路结构:8 个全加器串起来做什么
8 位可控加减法器的骨架是 8 个一位全加器(FA)串行进位连接。每一位 FA 接收三个输入:被加数 Xi、加数 Yi、来自低位的进位 Ci-1,输出和 Si 与向高位的进位 Ci。最低位 FA 的进位输入接的是控制信号 Sub,而不是固定 0,这一点是整个电路“可控”的关键。
串行进位的含义是:第 i 位的进位必须等第 i-1 位算完才能稳定,8 位就要串 8 级进位延迟。实验里用隧道标签把 X、Y、Sub、S、Cout、OF 引到子电路端口,本质是把内部连线封装成可复用的符号,方便在顶层电路里反复调用。复习时容易忽略的是:隧道标签不是装饰,它决定了端口方向,标签名写错或方向反了,顶层连出来就是悬空或短路。
2.2 减法怎么变成加法:补码的两个动作
Sub=0 时执行 S = X + Y;Sub=1 时执行 S = X − Y。硬件里没有“减法器”,减法被改写成加补码:X − Y = X + (~Y) + 1。对应到电路上是两个动作同时发生:
- 每一位的 Yi 先与 Sub 做异或:Sub=0 时 Yi 原样进入 FA,Sub=1 时 Yi 取反,得到 ~Y;
- 最低位 FA 的进位输入接 Sub:Sub=0 时加 0,Sub=1 时加 1,完成“末位加一”。
这两个动作合起来就是“按位取反再加一”,也就是求补。梳理下来会发现,Sub 一根信号线同时控制了“取反”和“加一”,这是整个实验最精巧的一处设计,也是报告里最该写清楚的地方。
// 8 位可控加减法器核心结构(示意) // Sub=0: S = X + Y; Sub=1: S = X - Y = X + ~Y + 1 module add_sub8( input [7:0] X, input [7:0] Y, input Sub, output [7:0] S, output Cout, output OF ); wire [7:0] Y_xor = Y ^ {8{Sub}}; // Sub=1 时按位取反 wire [8:0] sum; assign sum = {1'b0, X} + {1'b0, Y_xor} + Sub; // 最低位进位输入即 Sub assign S = sum[7:0]; assign Cout = sum[8]; assign OF = sum[8] ^ sum[7]; // 最高位进位与符号位进位异或 endmodule上面这段是行为级示意,帮助对照理解,不是实验要求画的电路图。关键看三处:Y ^ {8{Sub}}完成条件取反,+ Sub完成末位加一,OF用最高位进位与次高位(符号位)进位异或得到。参数上,X、Y 是 8 位操作数,Sub 是 1 位控制,S 是 8 位结果,Cout 是最高进位,OF 是有符号溢出。
2.3 溢出检测:为什么看两个进位
有符号运算的溢出判据是:最高数据位的进位与符号位的进位不一致。8 位有符号数里,第 7 位是符号位,第 6 位向第 7 位的进位记作 C6,第 7 位向外的进位就是 Cout(记作 C7)。OF = C6 ⊕ C7。正数加正数得负数、负数加负数得正数,都会让这两个进位一个为 1 一个为 0。
这里最容易混的是无符号进位 Cout 和有符号溢出 OF 不是一回事:Cout=1 只说明无符号结果超出 8 位,OF=1 才说明有符号结果错了。报告测试里如果只写“Cout 正确”,阅卷时会被追问 OF 的判据来源。
提示:减法时 OF 同样用 C6 ⊕ C7 判断,不要因为做了取反就换公式,补码运算的溢出判据对加减法统一成立。
3. 4 位快速加法器:Gi、Pi 与 CLA74182 的进位并行
3.1 串行进位的瓶颈与先行进位的思路
8 位串行加法器每一位都要等低位进位,位数一多延迟线性增长。先行进位的思路是把进位提前“算出来”,而不是“等出来”。对第 i 位定义两个函数:
- 进位生成函数 Gi = Xi · Yi:本位两个输入都为 1 时,一定向高位产生进位,与低位无关;
- 进位传递函数 Pi = Xi ⊕ Yi:本位两个输入只有一个为 1 时,低位来的进位会被传递到高位。
于是进位可以写成 Ci = Gi + Pi·Ci-1,展开后每一位的进位都只依赖 G、P 和最低进位 C0,不再逐级等待。4 位快速加法器就是用一个 CLA74182(先行进位部件)并行算出 C1~C4,再交给 4 个 FA 出和数。
3.2 CLA74182 的端口与成组函数
CLA74182 的输入是各位的 Gi、Pi 和进位输入 C0,输出是 C1、C2、C3、C4,以及成组进位生成函数 G* 和成组进位传递函数 P*。G*、P* 是把 4 位的进位行为压缩成两个信号,供更高一级(16 位)继续做组间先行进位。
| 端口 | 方向 | 含义 |
|---|---|---|
| Gi、Pi | 输入 | 第 i 位的进位生成、传递函数 |
| C0 | 输入 | 最低位进位输入 |
| C1~C4 | 输出 | 并行计算出的各位进位 |
| G* | 输出 | 4 位成组进位生成函数 |
| P* | 输出 | 4 位成组进位传递函数 |
实验里反复强调“74182 是 C0 的函数,一定要连上 C0”,血泪经验就在这:C0 悬空时 C1~C4 全部失效,和数看着像随机值,调试时极难定位。方案设计里还有一处笔误要留意:正文一处写 Pi = Xi ⊕ Yi,另一处写 Pi = Xi + Yi,正确形式是异或,或门形式只在特定化简下等价,报告里应统一写异或。
3.3 从 G、P 到和数:4 位加法器的完整数据通路
完整流程分三步:先由 X、Y 逐位算出 Gi、Pi 送入 CLA74182;再由 CLA74182 输出 C1~C4;最后每个 FA 用 Xi、Yi、Ci-1 算出 Si。输出除 S3~S0 外,还有最高位进位 Cout(即 C4)和成组函数 P*、G*。
// 4 位快速加法器(先行进位)结构示意 module cla_adder4( input [3:0] X, Y, input Cin, output [3:0] S, output Cout, G_star, P_star ); wire [3:0] G = X & Y; // 进位生成 wire [3:0] P = X ^ Y; // 进位传递,注意是异或 wire [4:0] C; assign C[0] = Cin; // C0 必须接入,否则进位链失效 assign C[1] = G[0] | (P[0] & C[0]); assign C[2] = G[1] | (P[1] & G[0]) | (P[1] & P[0] & C[0]); assign C[3] = G[2] | (P[2] & G[1]) | (P[2] & P[1] & G[0]) | (P[2] & P[1] & P[0] & C[0]); assign C[4] = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]) | (P[3] & P[2] & P[1] & P[0] & C[0]); assign S = P ^ C[3:0]; // Si = Pi ⊕ Ci-1 assign Cout = C[4]; assign G_star = G[3] | (P[3] & G[2]) | (P[3] & P[2] & G[1]) | (P[3] & P[2] & P[1] & G[0]); assign P_star = &P; // 4 位全部能传递才成组传递 endmodule这段代码把 CLA74182 内部逻辑摊开写了一遍,方便对照端口理解。参数说明:X、Y 为 4 位加数,Cin 为进位输入,S 为和数,Cout 为最高进位,G_star、P_star 为成组函数。注意S = P ^ C[3:0]用的是 Pi 与低位进位的异或,和全加器 Si = Xi ⊕ Yi ⊕ Ci-1 是同一件事,只是借用了 Pi。
3.4 测试与分析怎么写才站得住
报告给的测试例:X=1000,Y=0100,Cin=0,输出 S=1100,Cout=0,P*=0,G*=0。分析时不能只写“结果正确”,要说明:先对 X、Y 逐位做与、异或得到 G、P 送入 CLA74182,由其算出 C1~C4,再与各位异或得到 S3~S0。P*=0 说明 4 位里至少有一位 Pi=0,成组传递不成立;G*=0 说明没有哪一位能独立生成向高位的进位。把这两个成组函数的取值和输入对上,测试分析才有说服力。
4. 16 位快速加法器:组内先行加组间先行
4.1 两级进位结构:4 个 4 位加法器怎么拼
16 位快速加法器不是把 16 个 FA 串起来,而是把 16 位切成 4 个 4 位组,每组内部用 4 位快速加法器(组内先行进位),组与组之间再用一个 CLA74182 做组间先行进位。这样进位延迟从 16 级降到“组内先行 + 组间先行”两级,位数越多优势越明显。
结构上:4 个 4 位加法器各自输出本组的 S 和成组函数 P*、G*;这 4 组 P*、G* 连同最低位进位 C0 送入顶层 CLA74182,算出组间进位 C4、C8、C12、C16;这些组间进位再回送到各 4 位加法器的进位输入端。注意回送的是“组进位输入”,不是每位的进位,这是两级结构的分工。
4.2 端口与连接:C0、C16、C15 各是什么
16 位加法器的端口包括:32 位输入拆成 X、Y 各 16 位,C0 为进位输入,S 为 16 位和数,C16 为最高位进位,C15 为次高位进位,G*、P* 为 16 位成组函数。C15 之所以单独引出,是为了配合 C16 做有符号溢出判断(C15 ⊕ C16),和 8 位加减法器里 C6 ⊕ C7 是同一套逻辑。
| 信号 | 位宽 | 作用 |
|---|---|---|
| X、Y | 16 位 | 两个加数 |
| C0 | 1 位 | 最低位进位输入 |
| S | 16 位 | 和数输出 |
| C16 | 1 位 | 最高位进位 |
| C15 | 1 位 | 次高位进位,配合 C16 判溢出 |
| G*、P* | 各 1 位 | 16 位成组进位生成、传递函数 |
4.3 实验步骤的因果链
步骤不能只抄“分成 4 组、送入、算出结果”,要写出因果:先把 32 位输入按 4 位一组切成 4 组,分别送入 4 个 4 位快速加法器;每组内部由 CLA74182 算出组内进位并得到本组 S;同时每组输出 P*、G*;顶层 CLA74182 用这 4 组 P*、G* 和 C0 算出组间进位;组间进位回送各组进位输入端,最终得到完整 16 位 S 和 C16、C15、P*、G*。
报告测试例:X=0000 1100 0000 1100,Y=1000 0100 1000 0100,Cin=0,输出 S=1001 0000 1001 0000,Cout=0,P*=0,G*=0。核对时按 4 位一组验算:低组 1100+0100=1 0000,本位和 0000、组进位 1;次低组 0000+1000 再加组进位 1 得 1001;高两组同理。分组验算比整体硬算更容易发现是哪一级进位出错。
注意:组间进位回送时,若某一级 4 位加法器的 C0 没接顶层算出的组进位,而是接了固定 0,结果会在跨组时整体偏移,表现为“低组对、高组错”,这是两级结构最常见的翻车点。
5. 易错点清单:进位链、端口与报告表述
5.1 易错点一:CLA74182 的 C0 悬空或接错
为什么漏:画图时注意力都在 G、P 和 C1~C4 上,C0 只是一根短线,容易被当成可选输入。怎么补:把“74182 是 C0 的函数”写成检查项,每接一个 CLA74182 先确认 C0 有明确来源——4 位加法器接外部 Cin,16 位顶层接全局 C0,组内接组间进位。
5.2 易错点二:Pi 写成或、Gi 写成异或
为什么漏:正文方案设计里 Pi 出现过“Xi + Yi”的写法,抄报告时直接照搬。怎么补:记住语义——Gi 是“两位都为 1 才生成进位”,用与;Pi 是“两位不同才传递进位”,用异或。写成或门在部分化简下数值碰巧对,但语义错,答辩一问就露。
5.3 易错点三:把 Cout 当溢出、把 OF 当进位
为什么漏:两个信号都在最高位附近,名字又都像“超出去”。怎么补:Cout 是无符号进位,OF 是有符号溢出,判据是最高数据位进位与符号位进位异或。8 位看 C6⊕C7,16 位看 C15⊕C16,写报告时把这两个进位在图上标出来。
5.4 易错点四:减法只取反不加一
为什么漏:只记得“减法是加补码”,忘了补码是“取反加一”,电路里漏接最低位 Sub。怎么补:检查最低位 FA 的进位输入是否接 Sub,而不是接 0;测试时专门跑一组 Sub=1 且低位有借位的例子,比如 X 小于 Y,看结果是否为负的补码形式。
5.5 易错点五:16 位分组时组间进位没回送
为什么漏:只把 4 个 4 位加法器的 S 拼起来,忘了顶层 CLA74182 的输出要回到各组进位端。怎么补:画连接图时用不同颜色标“组内进位”和“组间进位”,回送线单独走一遍;测试用跨组进位的数,比如低组和产生进位、高组输入全 0,看高组 S 是否变成 0001。
6. 复习收口:一张自检表把三个实验串起来
复习到这个阶段,最有效的动作不是再读一遍报告,而是拿一张自检表把三个实验的共性抽出来。下面这张表按“进位方式、关键器件、核心公式、易错端口”四列对照,抄一遍比看十遍强:
| 实验 | 进位方式 | 关键器件 | 核心公式 | 易错端口 |
|---|---|---|---|---|
| 8 位可控加减 | 串行进位 | 8 个 FA | S=X+Y+Sub,OF=C6⊕C7 | 最低位进位接 Sub |
| 4 位快速加法 | 组内先行 | CLA74182 + 4 FA | Ci=Gi+Pi·Ci-1 | 74182 的 C0 |
| 16 位快速加法 | 组内+组间先行 | 顶层 CLA74182 + 4 个 4 位加法器 | 组间进位回送各组 | 组进位回送线 |
查漏补缺的具体做法:先合上报告,默画 8 位加减法器的 Sub 通路,画不出“取反 + 末位加一”就回去看 2.2;再默写 4 位先行进位的 C1~C4 展开式,卡在 P*、G* 定义就回看 3.2;最后口述 16 位的两级进位流程,说不清“组间进位回送到哪”就回看 4.1。三步都过,基本可以上考场。
还有一个小技巧:把三个实验的测试例统一改成同一组数,比如 X=1000 1100、Y=0100 0100,分别在 8 位、4 位、16 位下算一遍,观察进位在哪个位置产生、在哪个位置被传递。同一组数跑三遍,进位链的行为会比背公式记得牢。
我自己的教训是第一次做 16 位实验时,顶层 CLA74182 的组间进位忘了回送,低 8 位全对、高 8 位整体偏移,盯着波形查了两个小时才发现是一根线没连。从那以后我每次连先行进位电路,都强制走一遍“C0 有没有来源、PG有没有送出、组进位有没有回送”这三问,再开始测试。希望这份梳理帮到你,把三个实验当成一条进位链来复习,而不是三份互不相干的报告。
本文还有配套的精品资源,点击获取