自己动手写CPU(4)移动操作指令的实现

自己动手写CPU(4)移动操作指令的实现

指令说明

MIPS32指令集架构中定义的移动操作指令共有6条: movn、movz、mfhi、mthi、mflo、mtlo,后4条指令涉及对特殊寄存器HI、LO的读/写操作。HI、LO寄存器用于保存乘法、除法结果。当用于保存乘法结果时,HI寄存器保存结果的高32位,LO寄存器保存结果的低32位;当用于保存除法结果时,H寄存器保存余数,LO寄存器保存商。

指令格式

1.jpg

MOVN

当功能码为6’b001011时,表示是movn指令。指令用法为:movn rd, rs,rt。

指令作用为: if rt ≠0 then rd <- rs,判断地址为rt的通用寄存器的值。如果不为零,那么将地址为rs 的通用寄存器的值赋给地址为rd的通用寄存器;反之,保持地址为rd的通用寄存器不变。movn是 Move Conditional on Not Zero的意思。

MOVZ

当功能码为6’b001010时,表示是movz指令。指令用法为:movz rd, rs, rt。
指令作用为: if rt = 0 then rd <- rs,与上面movn指令的作用正好相反,判断地址为rt的通用寄存器的值。如果为零,那么将地址为rs 的通用寄存器的值赋给地址为rd的通用寄存器;反之,保持地址为rd的通用寄存器不变。movz是 Move Conditional on Zero 的意思。

MFHI

当功能码为6’b010000时,表示是 mfhi 指令。指令用法为:mfhi rd。
指令作用为: rd <- hi,将特殊寄存器H的值赋给地址为rd的通用寄存器。

MFLO

当功能码为6’b010010时,表示是mflo指令。指令用法为:mflo rd。
指令作用为:rd <- lo,将特殊寄存器LO的值赋给地址为rd的通用寄存器。

MTHI

当功能码为6’b010001时,表示是mthi 指令。指令用法为: mthi rs。
指令作用为: hi<- rs,将地址为rs的通用寄存器的值赋给特殊寄存器HI。

MTLO

当功能码为6’b010011时,表示是mtlo指令。指令用法为:mtlo rs。
指令作用为: lo <- rs,将地址为rs的通用寄存器的值赋给特殊寄存器LO。

助记

MFxx为move from,MTxx为move to,这样是否需要读写特殊寄存器就可以记清了。

修改之处

主要需注意的地方是读取HI、LO寄存器时仍会存在数据相关问题,解决方式仍是使用数据前推,将处于访存阶段、回写阶段的指令对HI、LO寄存器的操作信息反馈到执行阶段,执行阶段依据这些信息,确定HI、LO寄存器的正确值。

修改后的系统结构

move_struct.png

仿真结果

移动操作指令仿真测试结果1.png

移动操作指令仿真测试结果2.png

实验心得

开始时reg[4]最后的状态总是不对,不能到全0状态,debug后发现mfhi和mflo两条指令的译码阶段出现问题;分析代码后在译码模块中发现错误,inst[31:21]为全0的话会进另一个逻辑去判断而不会进op3的case语句中。以后编写代码时仍需谨慎!

项目链接

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日拱一卒_未来可期

若复习顺利望有闲钱的同学支持下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值