目录
自己动手写CPU day1-ORI的实现
目标
- 初步建立最简单的MIPS五级流水线
- 实现第一个指令:ORI
- 在modelsim上仿真
1.取指阶段的实现
1.1.PC模块
-
功能:给出指令的地址
-
接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 clk 1 I clock 3 pc 32 O 要读取的指令地址 4 ce 1 O 指令存储器使能
1.2 IF/ID模块
- 功能:1. 暂存取指阶段的指令2.暂存指令地址3.在下一个clk传递给译码
- 接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 clk 1 I clock 3 if_pc 32 I 取指阶段指令地址 4 if_inst 32 I 取指阶段指令 3 id_pc 32 O 译码阶段指令地址 4 id_inst 32 O 译码阶段指令
2. 译码阶段的实现
2.1. Regfile
-
功能:1.实现32个32位通用整数寄存器2.同时1W2R
-
接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 clk 1 I clock 3 waddr 5 I 要写入的寄存器地址 4 wdata 32 I 要写入的数据 5 we 1 I 写使能 6 raddr1 5 I 第一个读取口要读取的地址 7 re1 1 I 第一个读取口使能 8 rdata1 32 O 第一个读取口的输出值 9 raddr2 5 I 第二个读取口要读取的地址 10 re1 2 I 第二个读取口使能 11 rdata2 32 O 第二个读取口的输出值
2.2 ID
- 功能:对指令进行译码
- 接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 pc_i 32 I 译码阶段指令对应地址 3 inst_i 32 I 译码阶段指令 4 reg1_data_i 32 I 从regfile的第一个读寄存器端口输入 5 reg1_data_i 32 I 从regfile的第二个读寄存器端口输入 6 reg1_read_o 1 O regfile的第一个端口读使能 7 reg2_read_o 1 O regfile的第二个端口读使能 8 reg1_addr_o 5 O regfile的第一个端口读地址 9 reg2_addr_o 5 O regfile的第二个端口读地址 10 aluop_o 8 O 译码阶段指令要进行的运算的子类型 11 alusel_o 3 O 译码阶段指令要进行的运算的类型 12 reg1_o 32 O 译码阶段指令要进行的运算的源操作数1 13 reg2_o 32 O 译码阶段指令要进行的运算的源操作数2 14 wd_o 5 O 译码阶段指令要写入的目的寄存器地址 15 wreg_o 1 O 译码阶段指令是否有要写入的寄存器
2.3 ID/EX
- 功能:将译码取得的运算类型、源操作数和目的寄存器传递给执行阶段
- 接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 clk 1 I clock 3 id_aluop 8 I 译码阶段运算子类型 4 id_alusel 3 I 译码阶段运算的类型 5 id_reg1 32 I 译码阶段源操作数1 6 id_reg2 32 I 译码阶段源操作数2 7 id_wd 5 I 译码阶段写回地址 8 id_wreg 1 I 译码阶段是否有写回 9 ex_aluop 8 O 执行阶段运算子类型 10 ex_alusel 3 O 执行阶段运算的类型 11 ex_reg1 32 O 执行阶段源操作数1 12 ex_reg2 32 O 执行阶段源操作数2 13 ex_wd 5 O 执行阶段写回地址 14 ex_wreg 1 O 执行阶段是否有写回
3.执行阶段的实现
3.1. EX
- 功能:运算
- 接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 aluop_i 8 I 运算子类型 3 alusel_i 3 I 运算类型 4 reg1_i 32 I 源操作数1 5 reg2_i 32 I 源操作数2 6 wd_i 5 I 写回地址 7 wreg_i 1 I 是否有写回 8 wd_o 5 O 写回地址 9 wreg_o 1 O 是否有数据写回 10 wdata_o 32 O 要写回的数据
3.2. EX/MEM
- 功能:传递
- 接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 clk 1 I clock 3 ex_wd 5 I 写回地址 4 ex_wreg 1 I 是否有写回 5 ex_wdata 32 I 要写回的数据 6 mem_wd 5 O 写回地址 7 mem_wreg 1 O 是否有写回 8 mem_wdata 32 O 要写回的数据
4. 访存阶段的实现
41. MEM
- 功能:
- 接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 wd_i 5 I 写回地址 3 wreg_i 1 I 是否有写回 4 wdata_i 32 I 要写回的数据 5 wd_o 5 O 写回地址 6 wreg_o 1 O 是否有数据写回 7 wdata_o 32 O 要写回的数据
4.2. MEM/WB
- 功能:数据传递
- 接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 clk 1 I clock 3 mem_wd 5 I 写回地址 4 mem_wreg 1 I 是否有写回 5 mem_wdata 32 I 要写回的数据 6 wb_wd 5 O 写回地址 7 wb_wreg 1 O 是否有写回 8 wb_wdata 32 O 要写回的数据
5. 回写阶段的实现
在regfile中实现了
6. 顶层模块的实现
- 接口描述
序号 接口名称 宽度 I/O 作用 1 rst 1 I reset 2 clk 1 I clock 3 rom_data_i 32 I rom的数据读入 4 rom_addr_o 32 O rom的地址给出 5 rom_ce_o 1 O rom读取使能
7. ROM的实现
- 接口描述
序号 接口名称 宽度 I/O 作用 1 ce 1 I 使能 2 addr 32 I 地址输入 3 inst 32 O 命令输出
参考
- 参考书目:《自己动手写CPU》 雷思磊
- gitee仓库:https://gitee.com/xuyu__dadada/my-mips-cpu.git