单周期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进行计算(它的地址计算有专门的通路),所以数据通路上的大部分部件都处于不活动状态。
-