构建单周期CPU记录Ⅱ
本文最后更新于 2024年9月12日 下午
构建单周期CPU记录Ⅱ(add, sub, and, or, slt, beq)
新增信号
RegDst
1:从指令15:11位中读取数据到A3端口
0:从指令20:16位中读取数据到A3端口
ALUSrc
- 1:从EXT中读取符号扩展的立即数
- 0:从寄存器文件RD2端口中读取数据
MemtoReg
- 1:将从数据存储器中读取的数据输出到WD3
- 0:将从ALU中读取的数据输出到WD3
信号表
指令 | RegDst | ALUSrc | MemtoReg | ALUControl |
---|---|---|---|---|
R指令(add, sub, and, or, slt) | 1 | 0 | 0 | varies |
lw,sw | 0 | 1 | 1 | 010(+) |
beq | x | 0 | x | 110(-) |
ALU
ALUOp | 含义 | ALUOp | 含义 |
---|---|---|---|
00 | 加法 | 10 | 依赖于func |
01 | 减法 | 11 | 无定义 |
ALUOp | Funct | ALUControl |
---|---|---|
00 | X | 010(加) |
X1 | X | 110(减) |
1X | 100000(add) | 010(加) |
1X | 100010(sub) | 110(减) |
1X | 100100(and) | 000(与) |
1X | 100101(or) | 001(或) |
1X | 101010(slt) | 111(小于置位) |
- 这里引用图表来自黑皮书,采用两级判断(先判断ALUOp,再判断ALUControl值),这里我采用另一种方法,对于非R型指令直接输出ALUControl,对R型指令两级判断.(见后图CU)
add
000000(31:26) + rs(25:21) + rt(20:16) + rd(15:11) + 00000(10:6) + 100000(add,5:0)
sub
000000(31:26) + rs(25:21) + rt(20:16) + rd(15:11) + 00000(10:6) + 100010(sub,5:0)
and
000000(31:26) + rs(25:21) + rt(20:16) + rd(15:11) + 00000(10:6) + 100100(and,5:0)
or
000000(31:26) + rs(25:21) + rt(20:16) + rd(15:11) + 00000(10:6) + 100101(or, 5:0)
slt
000000(31:26) + rs(25:21) + rt(20:16) + rd(15:11) + 00000(10:6) + 101010(slt, 5:0)
beq
000100(31:26) + rs(25:21) + rt(20:16) + offset(15:0)
更新组件
ALU

CU

整体

构建单周期CPU记录Ⅱ
https://meteor041.git.io/2024/09/11/构建单周期CPUⅡ-add-sub-and-or-slt-beq/