自己动手写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指令不难,我目前对这一条指令的理解简单来 ...
最新文章
- c#.net常用函数和方法集
- func_num_args()
- java综合图形界面程序设计_java综合图形界面程序设计.doc
- linux找数组规矩,linux shell 数组建立及使用技巧(示例代码)
- 47不用加减乘除做加法
- Curie%20Module有什么用
- 在VSCode中编辑HTML文档时,在Dom标签上写style属性时智能提示的问题
- 找出数组的最大公约数
- 计数译码显示电路实验报告总结_译码器及其应用
- 剑指offer——面试题42-2:翻转单词顺序
- 最易理解的傅里叶分析讲解
- 八卦图代码matlab,12行javascript代码绘制一个八卦图_javascript技巧
- windows下怎么用basename_比较下养殖用铁丝网还是尼龙网,你会怎么选择?
- 数据仓库整合各系统码表和参数表
- 4、Hive数据仓库——加载数据
- C语言libiconv编程,libiconv字符集转换库在C#中的使用
- JavaScript之表单验证
- c++如何侦测鼠标点击?
- JTAG各类接口针脚定义、含义以及SWD接线方式
- Qt 5.7 亮瞎眼的更新
热门文章
- Change code to ensure that OPA5 work also in WebIDE
- SAP UI5 application - model propagation
- 处理ABAP Netweaver gateway service使用过程中遇到的400 error - invalid key predicate type for guid
- Cloud for Customer里的使用的一个第三方js库,用于gzip处理
- Marketing Cloud里使用了哪个版本的UI5 Odata模型?
- How is Attachment property retrieved
- 使用test BSP application CRM_THTMLB_TEST
- Service order save debug for distribution lock set logic
- why my filter by titleID does not work
- SAP S/4HANA生产订单释放后自动同步到MES系统