单周期CPU的R型和lw指令:主控大人的调教艺术!(ω)
下面我们仍然以 lw $2, 100($3)
和 add $1, $2, $3
为例,详细讲解图中所示的主要控制信号的取值。
图中的主控制单元(Main Control)根据指令的 op
字段(指令[31-26])产生以下5个核心控制信号:
-
RegDst
-
ALUSrc
-
MemtoReg
-
RegWr
(Register Write) -
WE
(Write Enable for Data Memory, 图中未明确标出信号名,但连接到数据存储器的WE端口) -
ALUOp
(送往ALU控制单元)
1. lw $2, 100($3)
指令执行期间的控制信号
回顾指令目标:计算内存地址($3
的内容 + 100
),从该地址读取数据,并将该数据写回寄存器$2
。
控制信号 | 取值 | 解释 (Why?) |
---|---|---|
RegDst |
0 | 目标寄存器地址来源:lw 指令的目标寄存器是$2 ,它在指令的rt 字段([20-16])。查看数据通路图,rt 字段连接到RegDst MUX的0 号输入端。因此,选择0 ,将rt 作为写地址。 |
ALUSrc |
1 | ALU操作数来源:ALU需要计算 $3 的内容 + 100 。第一个操作数来自寄存器堆($3 的内容),第二个操作数必须是立即数100 。立即数来自符号扩展单元,它连接到ALUSrc MUX的1 号输入端。因此,选择1 。 |
MemtoReg |
1 | 写回数据来源:指令最终要写回寄存器的是从数据存储器中读出的数据。该数据连接到MemtoReg MUX的1 号输入端。ALU的计算结果(地址)连接到0 号输入端。因此,选择1 。 |
RegWr |
1 | 是否写寄存器:lw 指令需要将结果写回寄存器$2 ,所以必须使能寄存器堆的写入功能。 |
WE (访存) |
0 | 是否写内存:lw 是 读(Load) 内存指令,不是 写(Store) 内存指令。因此,数据存储器的写使能信号必须为0 (无效)。 |
ALUOp |
例如00 |
ALU操作类型:主控制单元告诉ALU控制单元,这是一个需要做地址计算的I型指令,通常是加法。ALU控制单元接收到这个信号后,会命令ALU执行加法操作。 |
总结 lw
指令:控制信号的设置为 {RegDst=0, ALUSrc=1, MemtoReg=1, RegWr=1, WE=0}
,这一组值精确地配置了数据通路,使其先完成“寄存器+立即数”的地址计算,然后从内存读数据,最后将内存数据写入由rt
字段指定的寄存器。
2. add $1, $2, $3
(R型) 指令执行期间的控制信号
回顾指令目标:将寄存器$2
和$3
的内容相加,并将结果写回寄存器$1
。
控制信号 | 取值 | 解释 (Why?) |
---|---|---|
RegDst |
1 | 目标寄存器地址来源:R型指令的目标寄存器是$1 ,它在指令的rd 字段([15-11])。查看数据通路图,rd 字段连接到RegDst MUX的1 号输入端。因此,选择1 ,将rd 作为写地址。 |
ALUSrc |
0 | ALU操作数来源:ALU需要计算 $2 的内容 + $3 的内容。两个操作数都来自寄存器堆。第二个操作数($3 的内容)来自寄存器堆的读数据2端口,它连接到ALUSrc MUX的0 号输入端。因此,选择0 。 |
MemtoReg |
0 | 写回数据来源:指令最终要写回寄存器的是ALU的计算结果。ALU的结果连接到MemtoReg MUX的0 号输入端。因此,选择0 。 |
RegWr |
1 | 是否写寄存器:add 指令需要将结果写回寄存器$1 ,所以必须使能寄存器堆的写入功能。 |
WE (访存) |
0 | 是否写内存:add 指令是算术运算,完全不涉及数据存储器。因此,写使能信号必须为0 。 |
ALUOp |
例如10 |
ALU操作类型:主控制单元告诉ALU控制单元,这是一个R型指令。ALU控制单元接收到这个信号后,会进一步查看指令的funct 字段([5-0])来确定具体是add , sub 还是其他操作,并命令ALU执行加法。 |
总结 add
指令:控制信号的设置为 {RegDst=1, ALUSrc=0, MemtoReg=0, RegWr=1, WE=0}
,这组值配置了数据通路,使其从寄存器堆读取两个操作数,在ALU中计算,最后将计算结果写回由rd
字段指定的寄存器。
对比表格与考点分析
这张表格是408考试中非常高频的考点,必须熟练掌握。
控制信号 | lw 指令取值 |
add 指令取值 |
核心作用与区别 |
---|---|---|---|
RegDst |
0 (rt ) |
1 (rd ) |
决定目标寄存器是谁。I型指令用rt ,R型指令用rd 。 |
ALUSrc |
1 (立即数) | 0 (寄存器) | 决定ALU的第二个操作数来源。是区分I型运算指令和R型指令的关键。 |
MemtoReg |
1 (内存) | 0 (ALU) | 决定写回寄存器的数据来源。是区分访存指令和运算指令的关键。 |
RegWr |
1 | 1 | lw 和add 都需要写回寄存器。对于sw 或beq 这类不写回的指令,该值为0 。 |
WE |
0 | 0 | lw 和add 都不写内存。对于sw 指令,该值为1 。 |
常考陷阱与命题方式:
-
直接考查:题目直接给出一条指令,问某个控制信号的取值。
-
反向推理:题目给出一组控制信号的取值(例如
{RegDst=1, ALUSrc=0, MemtoReg=0}
),问CPU正在执行哪一类指令(答案是R型运算指令)。 -
纠错题:给出一个指令和一组错误的控制信号,问会导致什么错误的结果。例如,如果执行
lw
指令时,误将MemtoReg
设为0
,那么最终写入$2
的将是计算出的内存地址,而不是内存中的数据,这是一个非常经典的错误。 -
设计题:要求为一条新指令设计其对应的控制信号取值。
掌握这些控制信号的逻辑,你就能从根本上理解数据是如何在CPU内部被精确引导和处理的。