单周期CPU当中的指令和控制信号
控制器的工作,就是根据当前执行的指令,生成一系列“命令”(即控制信号),精确地指挥数据通路上的各个部件应该做什么、不应该做什么。

一、 控制器的“输入”与“输出”
-
输入 (Input):控制器的唯一输入,是当前指令的6位操作码 (Opcode),即表格中的
OP[5:0]。控制器就像一个解码器,通过识别这6位二进制码,就能知道这是一条什么类型的指令(R型、lw、sw等)。 -
输出 (Output):控制器根据输入的操作码,生成一系列控制信号,这些信号是
1、0或×(无关项),用于控制数据通路上的各个“开关”和“旋钮”。
这张表,本质上就是定义了一个从6位输入到多个1位输出的组合逻辑电路。
二、逐条指令解析控制信号
1. R型指令 (OpCode = 000000)
-
功能:执行寄存器之间的算术或逻辑运算,如
add rd, rs, rt。 -
控制信号解读:
-
RegDst = 1: R型指令要将结果写入rd寄存器(指令的[15:11]位)。RegDst=1会让选择器(MUX)选择rd字段作为目标寄存器地址。 -
Branch = 0: 这不是分支指令。 -
MemtoReg = 0:写回寄存器的数据来自ALU的计算结果,而不是来自存储器。 -
WE (MemWrite) = 0: R型指令不访问数据存储器,因此禁止写入。 -
ALUSrc = 0: ALU的第二个操作数来自寄存器堆读出的rt的值,而不是指令中的立即数。 -
ALUOp = 10: 这是“两级控制”思想的体现。主控制器告诉ALU控制器:“这是一条R型指令”。ALU控制器会进一步查看指令的funct字段来确定具体是做加法、减法还是逻辑运算。 -
RegWr (RegWrite) = 1: 计算结果需要被写入目标寄存器。 -
Jump = 0: 这不是跳转指令。
-
2. lw 指令 (OpCode = 100011)
-
功能:从存储器加载一个字到寄存器,如
lw rt, offset(rs)。 -
控制信号解读:
-
RegDst = 1: (注意:这里表格中的1与经典MIPS设计不符,是一个很好的思辨点)。标准的MIPSlw指令将数据写入rt寄存器(指令的[20:16]位),此时RegDst应为0。如果RegDst为1,则意味着目标是rd寄存器,这是一种非标准的设计。在考研中,请以教材的标准为准,即lw的RegDst为0。 -
Branch = 0: 不是分支指令。 -
MemtoReg = 1: 核心信号! 这条指令的精髓在于将从数据存储器(Data Memory)读出的值写回寄存器,所以这个信号必须为1。 -
WE (MemWrite) = 0: 我们是从存储器读数据,而不是写。 -
ALUSrc = 1: ALU需要计算地址,其第二个操作数是指令中经过符号扩展的offset(立即数)。 -
ALUOp = 00: 主控制器告诉ALU控制器:“要做加法”,以计算rs寄存器值 +offset。 -
RegWr (RegWrite) = 1: 从存储器读出的数据最终要写入rt寄存器。 -
Jump = 0: 不是跳转指令。
-
3. sw 指令 (OpCode = 101011)
-
功能:将寄存器的数据存入存储器,如
sw rt, offset(rs)。 -
控制信号解读:
-
RegDst = ×: 无关项(Don't Care)。因为sw指令不写入任何寄存器(RegWrite=0),所以最终写哪个寄存器都无所谓,这个信号是0是1都可以,这在设计组合逻辑电路时有助于化简。 -
Branch = 0: 不是分支指令。 -
MemtoReg = ×: 同样是无关项。因为不写寄存器,所以选择写回的数据来源(ALU还是存储器)也变得无意义。 -
WE (MemWrite) = 1: 核心信号! 这条指令的唯一目的就是向数据存储器中写入数据。 -
ALUSrc = 1: 和lw一样,ALU需要计算地址,第二个操作数是立即数offset。 -
ALUOp = 00: 和lw一样,ALU执行加法来计算地址。 -
RegWr (RegWrite) = 0:sw不写回寄存器,这是它和lw的关键区别之一。 -
Jump = 0: 不是跳转指令。
-
4. beq 指令 (OpCode = 000100)
-
功能:如果两个寄存器相等,则分支跳转,如
beq rs, rt, label。 -
控制信号解读:
-
RegDst = ×,MemtoReg = ×,RegWr = 0:beq指令不写寄存器,所以这些都无关或无效。 -
Branch = 1: 核心信号! 激活分支逻辑。最终是否跳转,还要看ALU计算结果的Zero标志位是否为1。 -
WE (MemWrite) = 0: 不访问数据存储器。 -
ALUSrc = 0: ALU的两个操作数都来自寄存器(rs和rt),用于比较。 -
ALUOp = 01: 主控制器告诉ALU控制器:“要做减法”。通过判断rs-rt的结果是否为0,来判断rs和rt是否相等。 -
Jump = 0: 这是一条条件分支指令,不是无条件跳转。
-
5. jump 指令 (OpCode = 000010)
-
功能:无条件跳转到指定地址。
-
控制信号解读:
-
Jump = 1: 核心信号! 激活无条件跳转的数据通路,直接用指令中给出的地址更新PC。 -
其他大部分信号都是
0或无关项(×): 因为jump指令不写寄存器、不访问存储器、也不使用ALU进行计算(它的地址计算有专门的通路),所以数据通路上的大部分部件都处于不活动状态。
-