控制信号速查表
| RegWrite | ALUSrc | PCSrc | MemRead | MemWrite | MemtoReg | |
|---|---|---|---|---|---|---|
| 0 | / | 第二个 ALU 操作数来自寄存器堆的第二个输出(读数据 2 / Read data 2)。 | PC 被计算 \(PC+4\) 值的加法器输出所替代。 | / | / | 馈送到寄存器“写数据(Write data)”输入端的值来自 ALU。 |
| 1 | 寄存器目标输入端被写入“写数据(Write data)”输入端上的值。 | 第二个 ALU 操作数是指令中低 16 位的符号扩展(sign-extended)。 | PC 被计算分支目标(branch target)的加法器输出所替代。 | 目标地址输入所指定的业务数据内存(Data memory)内容被放置到“读数据(Read data)”输出端。 | 目标地址输入所指定的业务数据内存(Data memory)内容被“写数据(Write data)”输入端上的值所替代。 | 馈送到寄存器“写数据(Write data)”输入端的值来自数据内存(Data memory)。 |
-
Instruction (指令):正在执行的指令类型(如算术运算、访存、分支跳转等)。
-
Opcode (操作码):指令中用于标识该指令类型的二进制编码。
-
ALUSrc (ALU源操作数选择):决定 ALU 的第二个操作数来自寄存器堆(0)还是指令中的立即数(1)。
-
MemToReg (内存到寄存器):多路选择器信号,决定写回寄存器的数据是来自 ALU 计算结果、数据内存还是 PC+4。
-
RegWrite (寄存器写使能):是否允许将数据写入目标寄存器。
-
MemRead (内存读使能):是否需要从数据内存中读取数据(如
Ld指令)。 -
MemWrite (内存写使能):是否需要将数据写入数据内存(如
Sd指令)。 -
Branch (分支条件):标识当前是否为条件分支指令(如
beq)。 -
Jump (无条件跳转):标识当前是否为无条件跳转指令(如
Jal)。 -
ALUOp1 / ALUOp2 (ALU操作码控制):控制内部 ALU 控制单元的多位信号,用以决定 ALU 到底执行加、减、与、或还是其他具体运算。
| 指令 (Instruction) | 操作码 (Opcode) | ALUSrc | MemToReg | RegWrite | MemRead | MemWrite | Branch | Jump | ALUOp1 | ALUOp2 |
|---|---|---|---|---|---|---|---|---|---|---|
| R-format (R型指令) | 0110011 | 0 | 00 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
| Ld (加载双字) | 0000011 | 1 | 01 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
| Sd (存储双字) | 0100011 | 1 | xx | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| beq (相等则分支) | 1100111 | 0 | xx | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
| Jal (跳转并链接) | 1101111 | x | 10 | 1 | 0 | 0 | 0 | 1 | x | x |