简单设计 MIPS 单周期 CPU (7条指令)
明儿就是 Computer Organization and Design 的考试了,然而我复习不下去惹。
不如来写点东西
这次介绍的是单周期 CPU 的设计,使用的 ISA 是 MIPS 。关于详细信息:
Reference:
http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html
本次文章为 Computer Organization and Design 课程的实验2总结,同时也包括部分章节知识。本次实验的所有知识来自网络和书本 Computer Organization And Design MIPS Edition。
今后还有 多周期 CPU 、 流水线 CPU 的实验记录,欢迎持续关注。
目标:实现7条 Instruction
- addu
- subu
- ori
- lw
- sw
- beq
- jal
在介绍指令之前,我们来了解一下 MIPS ISA (Instruction Set Architecture) 的格式。
MIPS ISA format
本次实验中,我们将指令简单分为三种类型
- R-Type (Register type)
- I-Type (Immediate type)
- J-Type (Jump)
R-Type
- [31:26] OP
- [25:21] Rs
- [20:16] Rt
- [15:11] Rd
- [10:6] shamt
- [5:0] funct
I-Type
- [31:26] OP
- [25:21] Rs
- [20:16] Rt
- [15:0] Immediate
J-Type
- [31:26] OP
- [25:0] Address Offset
R-Type 指令用于处理从 Reg 中读取两个数的操作,I-Type 指令用于处理一个从 Reg 中读取,另一个为立即数(Immediate)的操作,J-Type 则用于处理跳转指令。
OP & funct
以下是这些指令的 OP 和 funct 表
Instr | op | funct | desc |
---|---|---|---|
addu | 6'b000000 | 6'b100001 | add unsigned |
subu | 6'b000000 | 6'b100011 | sub unsigned |
ori | 6'b001101 | Immediate | or immediate |
lw | 6'b100011 | Immediate | load word |
sw | 6'b101011 | Immediate | save word |
beq | 6'b000100 | Immediate | branch equal |
jal | 6'b000011 | Immediate | jump and link |
不难看出,addu 和 subu 为 R-Type ,jal 为 J-Type ,其余指令则为 I-Type。
设计架构图
这是一个简单的设计架构图。此次设计的简单单周期 CPU 由多个单元组成,我将从左边至右边一一介绍。
PC
用于存储 PC 地址。程序正常运行情况下,当一个周期被激活,PC 中的地址将被更新为 PC+4 。如果 Branch 或者 Jump 指令生效,PC 中将存放下一个分支或者跳转点的地址。
Instruction Memory
顾名思义,指令寄存器。CPU 运行过程中,将根据 PC 取指。
Register File
寄存器。Read Addr 和 Read Data 绑定,Read Addr 将根据它前面的多路选择器选择合适的地址。Write Addr 与 Write Data 绑定,当信号 RegWrite 被激活时,将对应 Data 写入对应 Addr。
ALU
运算单元。ALU 将根据 ALU Control 传入的 ALU 控制信号,将左边传入的两个数据进行运算,并从右边输出。
Zero 输出表示这两个数是否相等,用于 beq 指令的判断。当 Zero 指令与 Branch 指令同为1时,PCSrc 信号选择 PCSource 为计算后的 PC 值,否则保持原来的 PC+4 不变。
本次实验并没有使用 ALU Control 单元,而是直接将 funct 在 Control Unit 中解析,并将对应的 ALUOp 传入 ALU。
Data Memory
数据存储器。左边传入 Addr 与右边的 Read Data 绑定。当信号量 MemWrite 被激活,则将左边传入的 Write Data 写入 DM。
Control Unit
控制单元,根据 MIPS ISA 规定的标准,解析 OP 并将控制信号传给对应的 CPU 单元。这是整个 CPU 的核心,但是并不复杂。举个例子,当实现了 addu 之后,只需在 ALU 中稍加判断并定义更多的 ALUOp ,就可以将 R-Type 的几乎所有事件实现。
另
代码详见 https://github.com/HoshinoTouko/MonocycleCPU_MIPS/
以后可能还会根据需求更新更多的细节。但是直接更新多周期处理器介绍的可能性更大。
- 上一篇: [Bot Framework Tutorial] [episode.1] 数据存储和对话
- 下一篇: 没有了