单周期CPU的R型和lw指令:主控大人的调教艺术!(ω)

下面我们仍然以 lw $2, 100($3)add $1, $2, $3 为例,详细讲解图中所示的主要控制信号的取值。

图中的主控制单元(Main Control)根据指令的 op 字段(指令[31-26])产生以下5个核心控制信号:


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 lwadd都需要写回寄存器。对于swbeq这类不写回的指令,该值为0
WE 0 0 lwadd都不写内存。对于sw指令,该值为1

常考陷阱与命题方式:

  1. 直接考查:题目直接给出一条指令,问某个控制信号的取值。

  2. 反向推理:题目给出一组控制信号的取值(例如{RegDst=1, ALUSrc=0, MemtoReg=0}),问CPU正在执行哪一类指令(答案是R型运算指令)。

  3. 纠错题:给出一个指令和一组错误的控制信号,问会导致什么错误的结果。例如,如果执行lw指令时,误将MemtoReg设为0,那么最终写入$2的将是计算出的内存地址,而不是内存中的数据,这是一个非常经典的错误。

  4. 设计题:要求为一条新指令设计其对应的控制信号取值。

掌握这些控制信号的逻辑,你就能从根本上理解数据是如何在CPU内部被精确引导和处理的。