自己动手写CPU(3)逻辑、移位操作与空指令
自己动手写CPU(3)逻辑、移位操作与空指令
指令说明
MIPS32指令集架构中定义的逻辑操作指令有8条: and、andi、or、ori、xor、xori、nor、lui,其中 ori指令已经实现。
MIPS32指令集架构中定义的移位操作指令有6条: sll、sllv、sra、srav、srl、srlv。
MIPS32指令集架构中定义的空指令有2条: nop、ssnop。其中 ssnop是一种特殊类型的空操作,在每个周期发射多条指令的CPU中,使用ssnop指令可以确保单独占用一个发射周期。OpenMIPS 设计为标量处理器,也就是每个周期发射一条指令,所以ssnop 的作用与nop相同,可以按照nop指令的处理方式来处理ssnop指令。
此外还有sync、pref这两条指令,其中sync指令用于保证加载、存储操作的顺序,但对于OpenMIPS而言,它是严格按照指令顺序执行的,加载、存储操作也是按照操作顺序进行的,所以可以将sync指令当做nop指令处理;pref指令用于缓存预取,OpenMIPS未实现缓存,所以也将该指令当做nop指令处理。
指令格式
and、or、xor、nor指令格式
and指令,功能码是6’b100100,逻辑“与”运算。
指令用法:and rd, rs,rt (rd <- rs AND rt)
or指令,功能码是6’b100101,逻辑“或”运算。
指令用法:or rd, rs,rt (rd <- rs OR rt)
xor指令,功能码是6’b100110,异或运算。
指令用法:xor rd, rs,rt (rd <- rs XOR rt)
nor指令,功能码是6’b100111,或非运算。
指令用法:nor rd, rs,rt (rd <- rs NOR rt)
andi、xori指令格式
andi指令,指令码是6’b001100,逻辑“与”运算。
指令用法:andi rt, rs,imm ( rt <- rs AND zero_extended(imm) )
xori指令,指令码是6’b01110,逻辑“异或”运算
指令用法:xori rt, rs,imm ( rt <- rs XORI zero_extended(imm) )
lui指令格式
指令用法:lui rt,imm ( rt <- imm || 0^16 , 即将指令中的16bit立即数保存到地址为rt的通用寄存器的高16位,低16位用0填充)
sll、srl、sra、sllv、srlv、 srav指令格式
sll指令,功能码是6’b000000,逻辑左移
指令用法:sll rd,rt,sa ( rd <- rt << sa(logic) rt的值向左移位sa位,空出来的位置用0填充,结果保存到地址为rd的通用寄存器中)
srl指令,功能码是6’b000010,逻辑右移
指令用法:srl rd,rt,sa ( rd <- rt >> sa(logic) rt的值向右移位sa位,空出来的位置用0填充,结果保存到地址为rd的通用寄存器中)
sra指令,功能码是6’b000011,算术右移
指令用法:sra rd,rt,sa ( rd <- rt >> sa(arithmetic) rt的值向右移位sa位,空出来的位置用rt[31]的值填充,结果保存到地址为rd的通用寄存器中)
sllv指令,功能码是6’b000100,逻辑左移
指令用法:sllv rd,rt,rs ( rd <- rt << rs[4:0] rt的值向左移位rs[4:0]位,空出来的位置用0填充,结果保存到地址为rd的通用寄存器中)
srlv指令,功能码是6’b000110,逻辑右移
指令用法:srlv rd,rt,rs ( rd <- rt >> rs[4:0] rt的值向右移位rs[4:0]位,空出来的位置用0填充,结果保存到地址为rd的通用寄存器中)
srav指令,功能码是6’b000111,算术右移
指令用法:srav rd,rt,rs ( rd <- rt >> rs[4:0] rt的值向右移位rs[4:0]位,空出来的位置用rt[31]填充,结果保存到地址为rd的通用寄存器中)
nop、ssnop、sync、pref指令格式
指令说明:空指令
修改代码
为了实现逻辑、移位操作与空指令(其中 nop、ssnop不用特意实现,可以认为是特殊的逻辑左移指令sll),只需要修改OpenMIPS 的如下两个模块。
- 修改译码阶段的ID模块,用以实现对上述指令的译码。
- 修改执行阶段的EX模块,使其按照译码结果进行运算。
确定指令种类的过程
疑问之处:书上提供的sync指令的op[10:6]=00001
,但代码中判断认为op[10:6]=00000
,查阅MIPS32手册后发现,op[10:6]
为stype码,可以指定多种类型,全0和00001都在其中,如下图
仿真结果
逻辑功能测试波形图
移位功能测试波形图
与书上提供的汇编代码结果进行核验后完全正确,功能正常实现。其中调试逻辑功能波形图时,寄存器出现X的情况,调试了近两个小时发现是顶层连线连错了,真是个低级错误,希望大家认真仔细,不要重蹈我的覆辙。
项目链接
自己动手写CPU(3)逻辑、移位操作与空指令相关推荐
- 《自己动手写CPU》第五章--逻辑、移位操作与空指令的实现
5.1流水线数据相关问题 流水线中经常有一些被称为"相关"的情况发生,它使得指令序列中下一条指令无法按照设计的时钟周期执行,这些"相关"会降低流水线的性能.流水 ...
- 自己动手写CPU之第五阶段(1)——流水线数据相关问题
将陆续上传本人写的新书<自己动手写CPU>(尚未出版),今天是第15篇,我尽量每周四篇 上一章建立了原始的OpenMIPS五级流水线结构,可是仅仅实现了一条ori指令,从本章開始,将逐步完 ...
- 自己动手写CPU(6)流水线暂停、乘累加减与除法器的实现
自己动手写CPU(6)流水线暂停.乘累加减与除法器的实现 流水线暂停 因为OpenMIPS设计乘累加.乘累减.除法指令在流水线执行阶段占用多个时钟周期,因此需要暂停流水线,以等待这些多周期指令执行完毕 ...
- 自己动手写CPU(4)移动操作指令的实现
自己动手写CPU(4)移动操作指令的实现 指令说明 MIPS32指令集架构中定义的移动操作指令共有6条: movn.movz.mfhi.mthi.mflo.mtlo,后4条指令涉及对特殊寄存器HI.L ...
- 自己动手写CPU(1)五级流水线及CPU第一条指令ori
自己动手写CPU(1)五级流水线及CPU第一条指令ori 动机 不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh.正好之前看到一本<自己动手写CPU>,就按照此书 ...
- 自己动手写CPU之第九阶段(2)——加载存储指令说明2(lwl、lwr)
将陆续上传新书<自己动手写CPU>,今天是第38篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发 ...
- 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)
将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书站点上, ...
- 【自己动手写CPU】异常相关指令的实现
MIPS架构中定义的异常类型 MIPS32架构中,有些事情打断程序的正常的执行流程,这些事情称为中断.陷阱.系统调用以及其他打断程序执行流程的情况,统称为异常. 此处的OpenMIPS处理器只实现了其 ...
- 自己动手写CPU(2)第一条ori指令
本博客内容基于<自己动手写CPU>这本书 上一篇文章介绍了一下流水线思想.设计流程等,下面我们可以实操一下实现第一条ori指令. 其实实现一条ori指令不难,我目前对这一条指令的理解简单来 ...
最新文章
- 剑桥大学发布2019年度AI发展报告,预测未来12个月AI产业6件大事
- 2020年人工神经网络第二次作业-参考答案第五题
- 【计算机网络】网络层 : 网络层设备 ( 路由器 | 输入端口处理 | 输出端口处理 | 物理层、数据链路层、网络层 设备对比 | 路由表 与 路由转发 )
- [Python]理解 if __name__ == ‘__main__‘
- python opencv图像匹配_关于python:OpenCV功能匹配多个图像
- C++语言 如何用G++进行编译和运行程序
- 鱼塘钓鱼(信息学奥赛一本通-T1373)
- mysql lru scan depth_如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒。设置可能不是最佳的”?...
- 简析:世博会燃印刷业激情
- android 高仿国美,iOS高仿国美、二次元应用、点赞喷射动画、电影筛选页等源码...
- ug建模文本怎么竖着_ug模型如何雕刻立体汉字
- MySQL(管理员常用命令)
- 查看本地MYSQL数据库的IP地址
- 嵌入式linux开发,.mak是什么文件
- whose UTF8 encoding is longer than the max length 32766
- 买服务器为何选择华为云?
- AD通孔焊盘单独设置铺铜规则
- 接口练习--设计一个辅助英雄 接口实现技能治疗
- c语言字符数组重置,C语言字符数组初始化
- 一个基于.Net开发的Windows截屏录制工具
热门文章
- Twice enter press click will trigger backend roundtrip
- How does gateway system determine whether cache is hit
- 从手机App通过WebSocket向浏览器推送数据
- SAP APF框架错误消息Filter is too complex的处理
- 如何处理CRM_ORGMAN 300 error message
- workaround: 从product category移除settype时绕过check
- 利用代码生成right scope数据
- SAP UI5框架 component.js的加载原理
- 怎么实现阵列装配_第九篇:磁盘阵列和群晖SHR
- Java Array.sort的六种常用方法总结