这本书的课后习题,第5章是公认的分水岭。前面几章还能靠背概念混过去,到了第5章,画数据通路、算时序、推微操作序列、判流水线相关,一个都躲不掉,稍微一含糊就整道题连锁崩盘。我前后带过几届学弟学妹过《计算机组成原理》这门课,也自己啃过“微课版”这本教材不止一遍,答疑记录攒了厚厚一沓,翻下来问题最集中的就是第5章——也就是中央处理器这一块。很多同学私信我说,前面存储系统、指令系统还能看懂,一翻到CPU就直接懵了,课后题更是无从下手。
所以我打算把第5章课后习题按题型系统整理一遍,不是只给答案,而是把每类题背后的原理、推导过程、易错点全部摊开讲。你看完之后,不管手上的题号怎么变,题型怎么绕,都能自己顺下来。这篇文章适合正在赶作业、准备期末、或者准备考研复试要重刷组成原理的同学,小白也能看懂,我会尽量用生活化的比喻把抽象概念讲透。
1. 第5章到底考什么:先搞清楚章节骨架,再谈做题
1.1 微课版第5章的定位和知识地图
翻开微课版这本教材,第5章的标题基本就是“中央处理器”。这一章在整门课里的地位很特殊,前面第3章讲的存储系统、第4章讲的指令系统,其实都是在给第5章铺垫——CPU是那个“把所有零件串起来干活的总指挥”。你可以把它想象成一个餐厅后厨:指令系统是菜谱,存储系统是冰箱和储物架,而CPU就是那个同时负责接单、取料、炒菜、装盘的主厨,数据通路是他的手和灶台,控制器是他的大脑。
第5章主要包含五块内容:CPU的功能与基本结构、指令周期、数据通路与微操作、控制器(又分硬布线和微程序两种实现)、以及指令流水线。这五块不是孤立的,它们是一条线串下来的——先讲CPU要干什么(功能),再讲干一件事要花多久(指令周期),然后讲具体怎么动手(数据通路和微操作),接着讲谁指挥动手(控制器),最后讲怎么干得更快(流水线)。理解了这条主线,你做题的时候就能判断每道题卡在链条的哪一环。
我给学弟学妹的建议是:做第5章题目之前,务必先自己动手把教材上的那张“CPU内部结构框图”默画一遍,标清楚AC、MQ、PC、IR、MAR、MDR这些寄存器和ALU之间的连线。为什么这么做?因为第5章至少一半的题目,本质都是在问“某个数据从哪个寄存器出发,经过哪些部件,最后落到哪里”,框图不清楚,全是空谈。
1.2 三类高频题型和分值分布
按我整理的答疑记录来看,第5章课后题大致能归成三类,每类的解题套路完全不同,分值权重也不一样。我把它们整理成一张表,你对照自己的教材题号就能对上号。
| 题型类别 | 典型考法 | 解题核心 | 分值占比(估算) |
|---|---|---|---|
| 时序与周期类 | 计算指令执行时间、画时序图 | 分清三种周期关系 | 约25% |
| 微操作与控制类 | 写微操作序列、算控制存储器容量 | 寄存器传输语言、微指令编码 | 约40% |
| 流水线类 | 判相关、算加速比与吞吐率 | 冒险判定、时空图 | 约35% |
第一类偏计算,靠公式和细心就能拿满;第二类是重灾区,很多同学在微操作序列上栽跟头,其实规律性极强;第三类流水线是近几年的热门,也是热词里反复出现的“数据相关、结构相关”,必须吃透。
提示:别一上来就逐题做。先把上面三类分开,集中做同一类题,做完一类再换下一类。同类型题目的套路一旦形成肌肉记忆,考试时反应速度会快很多。
1.3 做题前必须钉死的三个前置概念
在动手之前,有三个概念必须先钉死,否则后面全是坑。
第一个是寄存器传输语言的书写规范。教材里描述微操作时用的是PC → MAR、M(MAR) → MDR这种箭头记法,箭头方向、括号含义(括号表示“取其中的内容”)一定要分清楚。MAR → M(MAR)和M(MAR) → MDR是两回事,前者是往存储器写地址,后者是从存储器读数据。
第二个是主存与CPU的交互时序。很多题目会问“取指阶段需要几个机器周期”,答案取决于数据通路的组织方式。如果采用单总线结构,取一条指令至少要经过“PC送MAR、读主存到MDR、MDR送IR、PC自增”这几个节拍,通常需要2到3个机器周期。
第三个是控制信号的有效逻辑。有些教材标注的是高电平有效,有些用带圈表示低电平有效。做控制器题时如果不注意这个,最后写出来的控制信号全是反的。
这三条看着简单,但我见过太多人就是在这上面丢分。概念不清就做题,等于闭着眼睛开车。
2. 指令周期与执行流程类习题:把时序走一遍就不会错
2.1 指令周期、机器周期、时钟周期的三级关系
这类题的第一步永远是分清三个“周期”。我用一个生活化的类比:把执行一条指令想象成做一顿饭。时钟周期(也叫节拍)是你手腕上一次摆动的节奏,是最小单位;机器周期(也叫CPU周期)是完成一个阶段动作比如“切菜”的时间,通常包含若干个时钟周期;指令周期是做完一整道菜的时间,包含取指、译码、执行等若干个机器周期。
三者是层层包含的关系:指令周期 > 机器周期 > 时钟周期。教材里常给的一个经典数据是:一个机器周期包含4个时钟周期,一个指令周期包含2到4个机器周期,具体看指令类型。为什么机器周期要用4个时钟周期?因为主存的一次读写大约需要这么长时间来稳定信号,这个数不是随便定的,是和存储器芯片的存取速度匹配的。
做题时最容易错的地方是:题目给的是“主频为X GHz”,然后问“执行一条指令需要多少纳秒”。这时候要先算时钟周期 = 1/主频,再乘以时钟周期总数。我遇到过很多同学直接把主频拿来当周期用,结果差了整整一个数量级。
2.2 典型题目和答案拆解
我构造一道第5章最常见的题,你对照自己书上的题看套路是否一致。
题目:某CPU主频为500 MHz,机器周期包含4个时钟周期。某指令的指令周期包含3个机器周期,其中取指周期2个机器周期,执行周期1个机器周期。求执行这条指令需要多少纳秒?
解题过程:先求时钟周期,T = 1 / (500 × 10⁶) = 2 ns。一个机器周期 = 4 × 2 = 8 ns。指令周期 = 3 × 8 = 24 ns。答案就是24纳秒。
这道题看似简单,但陷阱在于“取指周期2个机器周期”这个描述。有的题目会写得含糊,说“取指需要访问两次主存”,你要能自己换算成机器周期。取指为什么要访问两次?因为第一次从主存读出指令送到MDR,第二次……其实标准单总线结构取指是一次访存,但有些组织方式下PC自增和读指令分属两个机器周期,这个要结合教材的框图判断。
变式题:如果等长的指令都执行100条,问总时间,那就是24 × 100 = 2400 ns,即2.4微秒。这类题还会和小数位结合,问“执行1000条需要多少毫秒”,注意单位换算链:ns → μs → ms 是每级1000倍。
注意:单位换算是这类题的隐形杀手。主频用Hz、时间用ns,中间隔着10⁹;主频用MHz和ns正好是倒数关系(1 MHz对应1000 ns)。养成写单位、写换算过程的习惯,别跳步。
2.3 时序图画法:拿分的关键动作
如果题目要求画时序图,那一定要按节拍一格一格画,横轴是时间节拍,纵轴列出各部件或信号线。取指阶段标出“PC → MAR”,读主存阶段标出“M → MDR”,送指令标出“MDR → IR”。每个信号占几个节拍要标清楚,别画成一团。
我个人的习惯是:先在草稿上列出所有微操作,按先后顺序排好,再往格子里填。顺序错了图就全反了。还有一种常见要求是“画出取指周期的微操作流程图”,这个在第3节会详细讲。
3. 数据通路与微操作:写出正确的寄存器传输序列
3.1 微操作序列的书写逻辑
这是第5章的核心考点,也是丢分最多的地方。所谓微操作,就是控制部件发出的、能在一个时钟节拍内完成的最小操作。多条微操作按顺序排在一起,就构成了一条指令的执行序列。
写微操作序列的黄金法则是:每一步只能有一个数据源和一个数据目的,且不能同时占用同一组总线。这就是为什么单总线结构下,很多操作要拆成好几步。比如要把PC的内容经过MDR送进IR,单总线上没法一步到位,必须先 PC → MAR,再读主存,再 M(MAR) → MDR,再 MDR → IR,一步步来。
为什么要有这个限制?因为总线是共享的,同一时刻只能有一个部件往里送数据,也只能有一个部件从里取数据。这就像一根管道,同一时刻只能水流一个方向、服务一对端点。理解了这条物理限制,你就明白为什么教材里的微操作总是拆得很碎。
3.2 取指周期的标准微操作序列
取指周期的微操作序列几乎是必考题,这里给你一个标准模板,对照教材可能有小差异,但主干一致:
(PC) → MAR M(MAR) → MDR (MDR) → IR (PC) + 1 → PC第一条把PC里的指令地址送给地址寄存器;第二条启动读操作,从主存取出指令内容送到数据寄存器;第三条把指令送到指令寄存器;第四条PC自增,指向下一条指令。
这里有个细节常被问:第三条和第四条能不能换顺序?答案是可以,因为它们操作的是不同部件(IR和PC),互不干扰。但如果题目问的是“最紧凑的排法”,那通常把 (PC)+1 → PC 和 M(MAR) → MDR 并行安排,因为PC自增和从主存取数用的部件不同,可以同时进行。这就是微操作并行性的考点。
3.3 间接寻址与执行周期的微操作
间接寻址的题目也很典型。当指令采用间接寻址时,取指结束后拿到的不是操作数,而是操作数的地址。这时要多走一轮访存:
(IR)的地址字段 → MAR M(MAR) → MDR (MDR) → IR的地址字段(形成有效地址)这个过程叫“间址周期”。很多同学在这里搞混——为什么又要访问一次主存?因为间接寻址的特点就是“地址的地址”,指令里给的是指针,得顺着指针再取一次才拿到真正的操作数地址。
执行周期的微操作则完全取决于指令类型。加法指令(ADD)的典型序列是:
(IR)的地址字段 → MAR M(MAR) → MDR(取操作数) (MDR) + (AC) → AC(累加)这里要注意:如果该机器有MQ(乘商寄存器)参与,乘除法的微操作会更复杂,通常是“累加器清零、被乘数送MQ、循环加/移位”这一套。做这类题时,先把指令的操作语义想清楚,再拆成一步步微操作,大概率不会错。
心得:写微操作序列时,我习惯在每一步后面标注它占用的部件,比如“→ MAR(占用总线、MAR)”。这样排下来一眼就能看出哪两步冲突、哪些能并行,检查起来特别快。这个小习惯帮我在考试里省了不少时间。
4. 微程序控制与硬布线控制:控制存储器容量怎么算
4.1 微指令格式与编码方式
控制器有两种实现方式:硬布线(也叫组合逻辑控制)和微程序控制。第5章的题型里,微程序控制的计算题出现频率很高,因为它需要算数、需要理解编码,综合性更强。
微程序控制的核心思想是:把每条机器指令的执行过程,翻译成一段存放在控制存储器里的微程序,微指令一条条读出来,对应的控制信号就依次发出。这样就不需要设计复杂的组合逻辑电路,用“读表”的方式实现控制,灵活性高。
微指令的格式分两部分:操作控制字段和顺序控制字段。前者决定这一拍发出哪些控制信号,后者决定下一条微指令的地址。操作控制字段的编码方式又分三种:直接编码(一位对应一个信号,速度最快但位数最多)、字段直接编码(把互斥的信号编成一组,节省位数但慢一点)、字段间接编码(更省但更复杂)。教材里常考的是直接编码和字段直接编码。
4.2 控制存储器容量计算题
这是我等下要重点讲的必考题型。控制存储器的容量 = 微指令条数 × 微指令字长。微指令条数由微程序的总条数决定,微指令字长等于操作控制字段位数加顺序控制字段位数。
典型题目:某机采用微程序控制,共有机器指令20条,每条指令对应平均5条微指令,另有一个公共取指微程序含4条微指令,微指令采用直接编码方式。若控制信号共40个,微指令采用断定方式(顺序控制字段8位),求控制存储器容量至少多少位?
解题过程:微指令总条数 = 20 × 5 + 4 = 104 条(取指微程序公共,只算一次,这正是微程序控制“公共取指共享”的优势所在,也是常考的点)。直接编码下,操作控制字段位数 = 控制信号数 = 40 位。加上顺序控制字段8位,微指令字长 = 48 位。控制存储器容量 = 104 × 48 = 4992 位。
这道题的关键点有两个。第一个是“公共取指微程序不重复计算”,很多人会把每条指令都加一次取指,导致总数虚高。第二个是“直接编码下操作控制字段位数就是控制信号总数”,如果题目改成字段直接编码,那就要把40个信号分成若干互斥组,每组用log₂(组信号数)位,位数会明显下降。
换成字段直接编码的版本:假如40个信号分成10组,每组平均4个信号,那么每组需要 ⌈log₂4⌉ = 2 位,10组共20位。微指令字长 = 20 + 8 = 28 位。容量 = 104 × 28 = 2912 位。对比直接编码,省了将近40%的空间,但代价是译码电路更复杂、速度略慢。这道对比题经常作为综合题出现在期末卷上。
4.3 微地址的确定方式:别在细节上翻车
微指令执行完下一条去哪,这个“微地址确定方式”也是考点。常见三种:计数器方式(顺序执行,遇到转移修改)、断定方式(由下地址字段直接给)、多路转移。教材里最常考的是断定方式,因为它的下地址字段位数好算。
有一类题会问“若采用计数器方式,下地址字段需要多少位”。这时候要看微程序是否支持无条件转移和条件转移,如果支持,要留出转移地址字段,通常不能只靠计数器自增。我当年就在这小坑上翻过车——把断定方式和计数器方式的下地址字段位数搞混了。记住:断定方式需要完整的下地址字段,位数等于微指令地址位数;计数器方式则可能只需要少量标志位。
5. 流水线三大相关:数据相关、结构相关、控制相关怎么判
5.1 三类相关的本质与判定方法
流水线是第5章的后半段重点,也是热词里反复冒出来的内容。指令流水线的思路就是把一条指令的执行拆成取指、译码、执行、访存、写回五个阶段,让多条指令错开时间重叠执行。但重叠就有冲突,冲突主要分三类。
结构相关:也叫资源相关,是因为多条指令争抢同一个硬件部件产生的。比如第i条指令在第4拍要访存,第i+3条指令在同一拍要取指,而机器只有一个存储器,就会撞车。解决办法是让指令和数据分开存储(哈佛结构),或者加停顿。
数据相关:是因为后面的指令要用前面指令还没算出来的结果。典型例子:ADD R1, R2后面紧跟SUB R4, R1,SUB要用R1,但ADD还没写回。数据相关又细分为写后读、读后写、写后写,但最常见的是写后读。
控制相关:是因为分支指令改变了执行顺序,导致后面已经预取进来的指令作废。比如JMP之后紧跟的几条指令,其实是要跳过去的,不相关。
判定相关的方法是:把每条指令拆成阶段占用时间,画成时空图,看有没有两格重叠在同一个部件上(结构相关),或者后面指令的某个阶段和前面指令的写回阶段冲突(数据相关)。我个人的习惯是先标出每条的读写寄存器,一眼就能看出数据相关。
5.2 流水线性能计算:加速比与吞吐率
这块的公式必须记住。设流水线有k段,每段执行时间相等为Δt,则:
- 非流水线执行n条指令时间 = n × k × Δt
- 流水线执行n条指令时间 = (k + n - 1) × Δt
- 加速比 S = (n × k) / (k + n - 1)
- 吞吐率 TP = n / [(k + n - 1) × Δt],当n趋于无穷时,最大吞吐率 TPmax = 1 / Δt
为什么公式里是 n + k - 1?因为第一条指令填满流水线需要k拍,之后每拍就能流出一条新的指令,总共n条就是 k + (n-1) 拍。这个推导用“装水”来理解最直观:k级流水线就像k级台阶的水渠,第一杯水要一级一级流到底花k个单位时间,之后每过1个单位时间就有一杯水流出,n杯水总共花 k + n - 1 个时间单位。
典型题目:5段流水线,每段耗时2 ns,连续执行100条指令,求加速比和吞吐率。
答案:非流水线 = 100 × 5 × 2 = 1000 ns;流水线 = (5 + 100 - 1) × 2 = 208 ns;加速比 = 1000 / 208 ≈ 4.81;吞吐率 = 100 / 208 ≈ 0.48 条/ns,即4.8 × 10⁸ 条/秒。
注意加速比的渐近值是k=5,但100条时只有4.81,指令数越多越接近5。这也是为什么流水线对长程序更友好。这类题还会问“要想加速比达到4.5,至少执行多少条指令”,这就是解不等式。
避坑:流水线时空图的横轴是时间拍,纵轴是指令。画的时候注意第i条指令的各阶段是斜着往右下排的,不是水平排。当初我把每条指令画成横着展开,结果看相关的时候全看错位置,白画半天。
6. 加法器进位链:组间串行进位与并行进位
6.1 进位概念的三种层次
热词里出现了“组间串行进位”,这块内容虽然常被归到运算器章节,但在第5章ALC(算术逻辑部件)相关的综合题里经常被拉出来一起考,所以必须讲清楚。
进位链有几种组织形式,从慢到快、从省到贵依次是:串行进位(逐位传递,最慢)、组内并行、组间串行(组内用并行进位逻辑快速产生,组与组之间还是一位位传)、组内并行、组间并行(也叫全并行,最快但电路最复杂)。
串行进位的问题是每一个全加器都要等低位的进位到了才能算,n位加法器就要等n级门延迟,位数越多越慢。组内并行组间串行是个折中:把n位分成若干组,每组内部用超前进位逻辑一次算出,组之间再用串行波传。这样延迟降到了“组内并行延迟 + 组间传递延迟”。
6.2 进位延迟计算题
典型题目:某加法器为16位,分4组每组4位,采用组内并行、组间串行进位方式。设一位进位门的延迟为t,超前进位逻辑延迟为2t。求最长进位传递延迟。
解题过程:组内由超前进位一次产生,延迟2t。组间是串行,从最低组传到最高组要经过3次组间传递(4组之间传递3次),每次传递算一个进位门延迟t,所以组间延迟 = 3t。总延迟 = 2t + 3t = 5t。
对比全串行的16位(延迟16t)和全并行的方案(延迟约2t但要大量逻辑门),5t是一个很划算的折中。这道题的得分点在于分清“组内”和“组间”分别用了哪种方式、延迟怎么叠加。很多同学直接把16位算成16t,忘了组内是并行产生的,一下就丢了分。
这里还有个隐藏考点:为什么要分组?因为超前进位逻辑的门数随位数增长很快,全16位并行实现的电路规模太大、扇入太高,工程上不现实。分组就是把复杂度控制在一个可接受的范围内,这是典型的“空间换时间再折中”的工程思维。
7. 常见问题与排查技巧实录
7.1 高频错误速查表
整理完题型,我把大家在第5章最容易踩的坑汇总成一张表,做题前扫一眼,能避免大半失误。
| 错误类型 | 具体表现 | 正确做法 |
|---|---|---|
| 周期混淆 | 把主频当周期用 | 时钟周期 = 1/主频,先换算再计算 |
| 单位错乱 | MHz与ns换算错误 | 记住1 MHz ↔ 1000 ns |
| 微操作冲突 | 同一拍写了两个数据源 | 单总线同一时刻只能一对端点通信 |
| 取指重复 | 每条指令都补计算一次取指微程序 | 公共取指程序只算一次 |
| 编码位数 | 直接编码和字段编码位数搞混 | 直接编码位数=信号数,字段编码要取对数 |
| 流水线公式 | 用n×Δt而漏掉k-1 | 记住 k + n - 1 |
| 相关判定 | 把资源冲突和数据相关混为一谈 | 结构相关看部件占用,数据相关看读写寄存器 |
7.2 三个独家排查技巧
第一个技巧是倒推法验算微操作序列。写完之后,从最后一个寄存器状态倒着推,看能不能回到初始状态,如果推不回去,说明中间某步写反了或者漏了。这个方法我用了很多年,特别管用。
第二个技巧是给流水线指令标读写集。每条指令在草稿上列出它读哪些寄存器、写哪些寄存器,然后两两比较:如果后面指令读的寄存器正好在前面指令的写集合里,就是数据相关。这个办法比画时空图快,适合考试时快速判断。
第三个技巧是单位先统一再计算。把所有时间量的单位先统一成ns,把所有频率统一成Hz或MHz,再代入公式。我见过太多错误其实是计算过程没错、单位错了。这一步花不了几秒,但能救命。
7.3 复习节奏和刷题建议
最后说说复习节奏。第5章内容多、绕,一口气全刷完容易崩。我的建议是分三天:第一天啃指令周期和数据通路,把微操作序列写到闭着眼能默写;第二天攻控制器和微程序容量计算,把直接编码和字段编码两种算各做5道;第三天集中刷流水线,重点练相关判定和性能计算。
刷题时不要只对答案。每道错题都要问自己“是概念没懂,还是算错了,还是看图看错了”,分类记录。我当年把错题按这三类分开记,两周后重做,概念类的题基本全对了,剩下的就是计算细心问题。
顺便提一句,如果你所在学校用的是不同版本的教材,题号肯定对不上,但题型是通的。第5章翻来覆去就这几个套路,你把上面三类题型吃透,换哪本书都能应付。我给你的这些题都是按“最典型的形态”构造的,你对照自己书上的题找对应类别的来做就行。真正考试的时候,拼的不是做过多少原题,而是看到一个陌生题能不能瞬间归到某一类、然后调出对应的解法。这个能力,只能靠分类刷题练出来。