代码放在github上
在之前实现的基础上继续增加了加载、存储指令,系统结构上增加了访存模块和RAM
之前操作的传送门:
单指令周期ori指令的实现
单指令周期CPU—–逻辑、移位操作和空指令
单指令周期CPU——移动操作指令的实现
单指令周期CPU—算术操作指令(1)—简单算术操作指令的实现
单指令周期CPU—转移指令的实现
指令介绍
1. 加载指令
- lb(指令码6’b100000):字节加载指令,用法:lb,rt,offset(base),作用:从内存中指定的加载地址处,读取一个字节,然后符号扩展至32位,保存到地址为rt的通用寄存器中
- lbu(指令码6’b100100):无符号字节加载指令,用法:lbu,rt,offset(base),作用:从内存中指定的加载地址处,读取一个字节,然后无符号扩展至32位,保存到地址为rt的通用寄存器中
- lh(指令码6’b100001):半字加载指令,用法:lh,rt,offset(base),作用:从内存中指定的加载地址处,读取一个半字,然后符号扩展至32位,保存到地址为rt的通用寄存器中该指令有地址对齐要求,要求计算出来的存储地址的最低两位为0
- lhu(指令码6’b100101):无符号半字加载指令,用法:lhu,rt,offset(base),作用:从内存中指定的加载地址处,读取一个半字,然后无符号扩展至32位,保存到地址为rt的通用寄存器中该指令有地址对齐要求,要求计算出来的存储地址的最低两位为0
- lw(指令码6’b100011):字加载指令,用法:lw,rt,offset(base),作用:从内存中指定的加载地址处,读取一个字,保存到地址为rt的通用寄存器中。该指令有地址对齐要求,要求加载地址的最低两位为00
2. 存储指令
- sb(指令码为6’b101000):字节存储指令,用法:sb rt,offset(base),作用:将地址为rt的通用寄存器的值存储到内存中的指定地址。
- sh(指令码为6’b101001):半字存储指令,用法:sh rt,offset(base),作用:将地址为rt的通用寄存器的值存储到内存中的指定地址。该指令有地址对齐要求,要求计算出来的存储地址的最低两位为0
- sw(指令码为6’b101011):字存储指令,用法:sw rt,offset(base),作用:将地址为rt的通用寄存器的值存储到内存中的指定地址。该指令有地址对齐要求,要求计算出来的存储地址的最低两位为00
修改系统结构
增加了访存阶段MEM模块和RAM,和相关的接口
1. 增加访存阶段MEM模块
之前因为不需要访问内存,所以在改变MIPS五级流水线线时省略了只用来传递数据的访存阶段,现在需要加上访存阶段,访存阶段需要通过执行阶段EX传递过来的信息,根据具体的加载、存储指令来对数据存储器RAM进行读/写操作
- 加载操作:可以加载字节、半字、字,根据字节选择信号(mem_sel_o)来选择有效字节占32位数据总线的多少
- 存储操作:可以存储字节、半字、字,根据字节选择信号(mem_sel_o)来选择有效字节占32位数据总线的多少
mem_sel_o宽度是4位,每一位代表一个字节是否有效,比如:
加载时mem_sel_o=4'b1000,说明加载加载地址处32位数据总线的最高字节
存储时mem_sel_o=4'b0011,说明存储要存储数据的最低两个字节
`include "defines.v"
module mem(
input wire rst,
//来自执行阶段的信息
input wire[`RegAddrBus] wd_i,
input wire wreg_i,
input wire[`RegBus] wdata_i,
input wire[`RegBus] hi_i,
input wire[`RegBus] lo_i,
input wire whilo_i,
input wire[`AluOpBus] aluop_i,
input wire[`RegBus] mem_addr_i,
input wire[`RegBus] reg2_i,
//送到回写阶段的信息
output reg[`RegAddrBus] wd_o,
output reg wreg_o,
output reg[`RegBus] wdata_o,
output reg[`RegBus] hi_o,
output reg[