单指令周期CPU---加载存储指令的实现

代码放在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[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值