写在前面
31条MIPS指令CPU 算是计组课设第一个比较大的项目了,好在他不是很难,到后面流水线,其实基本上就没有人写的出来了,虽说计科作业一大抄(我愿称之为站在巨人的肩膀上),但是我觉着这个项目还是值得写一写的,完成这个项目,会对CPU的核心功能有非常深刻的认识和理解,并且会对前面学过的知识有一个非常充分的理解和应用.
整个31条指令CPU从开始到完成用了整整3天时间,不同于写软件,硬件是要慢工出细活,不然哪里理解有错误,就要返工,如此以往就会一不小心打开Github找代码浪费非常多的时间
好了废话不多说,我们进入正题, 先从 画好数据通路图开始
,理解画好通路图,基本上一天就能debug完所有的CPU.
MIPS上有一份文档,对31条指令的讲解算比较详细的,这里我就直接截图到每个指令下面去了.
R型指令
通路类型1
1.ADD
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A + B -> RES)
ans -> in
2.ADDU
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A + B -> RES)
ans -> in
3.SUB
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A - B -> RES)
ans -> in
4.SUBU
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A - B -> RES)
ans -> in
5.AND
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A & B -> RES)
ans -> in
6.OR
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A | B -> RES)
ans -> in
7.XOR
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A ⊕ B -> RES)
ans -> in
8.NOR
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A ⊙ B -> RES)
ans -> in
通路类型2
9.SLT
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A - B -> ans) //相减判断,负数则为Rs中数小
negative -> EXT1 //注意要做扩展
EXT1 -> in
10.SLTU
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1 -> A , out2 -> B
(A - B -> ans) //相减判断,负数则为Rs中数小
negative -> EXT1 //注意要做扩展
EXT1 -> in
通路类型3
11.SLL
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[10:6] -> EXT5
EXT5 -> A
out2 -> B
(B<<A -> ans)
ans -> in
12.SRL
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[10:6] -> EXT5
EXT5 -> A
out2 -> B
(B>>A -> ans)
ans -> in
13.SRA
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[10:6] -> EXT5
EXT5 -> A
out2 -> B
(B>>A -> ans)
ans -> in
通路类型4
14.SLLV
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1[4:0] -> EXT5
EXT5 -> A
out2 -> B
(A<<B -> ans)
ans -> in
15.SRLV
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1[4:0] -> EXT5
EXT5 -> A
out2 -> B
(A >> B -> ans)
ans -> in
16.SRAV
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
out1[4:0] -> EXT5
EXT5 -> A
out2 -> B
(A >> B -> ans)
ans -> in
通路类型5
17.JR
PC -> IMEM
PC + 4 -> NPC //无关指令
out1 -> MUX
MUX_OUT -> PC
NPC -> MUX //无关指令
I型指令
通路类型6
18.ADDI
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16-> B
out1 -> A
(A + B -> RES)
ans -> Rd
19.ADDIU
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16-> B
out1 -> A
(A + B -> RES)
ans -> Rd
20.ANDI
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16-> B
out1 -> A
(A & B -> RES)
ans -> Rd
21.ORI
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16-> B
out1 -> A
(A | B -> RES)
ans -> Rd
22.XORI
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16-> B
out1 -> A
(A ⊕ B -> RES)
ans -> Rd
通路类型7
###23.LW
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16 -> B
out1 -> A
(A + B -> ans)
ans -> DMEM_ADDR
data -> in
通路类型8
24.SW
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16_OUT -> B
out1 -> A
(A + B -> ans)
out2 -> DMEM
ans -> DMEM_ADDR
通路类型9
25.BEQ
PC -> IMEM
PC + 4 -> NPC
NPC -> MUX
IMEM[15:0] || 02 -> EXT18
EXT18_OUT -> ADD_A
NPC -> ADD_B
(ADD_A + ADD_B -> ADD_OUT)
ADD_OUT -> MUX
out1 -> A
out2 -> B
(A - B -> RES)
zero -> MUX
MUX -> PC
26.BNE
PC -> IMEM
PC + 4 -> NPC
NPC -> MUX
IMEM[15:0] || 02 -> EXT18
EXT18_OUT -> ADD_A
NPC -> ADD_B
(ADD_A + ADD_B -> ADD_OUT)
ADD_OUT -> MUX
out1 -> A
out2 -> B
(A - B -> RES)
zero -> MUX
MUX -> PC
通路类型10
27.SLTI
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16 -> B
out1 -> A
(A - B -> RES)
Carry -> EXT1
EXT1 -> in
28.SLTIU
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16 -> B
out1 -> A
(A - B -> ans)
Carry -> EXT1
EXT1 -> in
通路类型11
29.LUI
PC -> IMEM
PC + 4 -> NPC
NPC -> PC
IMEM[15:0] -> EXT16
EXT16 -> B
res -> in
J型指令
通路类型12
30.J
PC -> IMEM
PC + 4 -> NPC
NPC -> MUX
PC[31:28] -> ||_A
IMEM[25,0] || 00 -> ||_B
||_OUT -> MUX
MUX_OUT -> PC
通路类型13
31.JAL
顶层控制器和数据总通路图
到这一步你的CPU 就算完成**70%**了,剩下的就是完成顶层控制器和调试,控制器我使用了布硬线的方法,因为微程序我不会对照着真值表弄好你的数据选择器即可.
数据总通路图
顶层控制器真值表
ALU(看不懂可以跳过这张图)
源代码
原代码太多我就不一个一个写了,项目里有我的报告,如果对你有帮助,希望支持下我的CSDN和我的博客(现在正在加急开发中,以后会有更多功能上限)
我的博客网址 : https://zzhaire.github.io/
我的CSDN :
项目源代码 : https://github.com/zzhaire/31SinglePeriodMipsCpu