《自己动手写CPU》学习记录(1)——第1章
引言
此专栏的文章记录自己学习《自己动手写CPU》的过程。算是一个学习笔记,里面也会夹杂个人的思考以及代码编写。希望自己可以像作者一样,坚持到最后。加油~~
本篇学习MIPS32处理器的基本架构。
致谢
感谢书籍《自己动手写CPU》及其作者雷思磊。一并感谢开源精神。
目录
引言
致谢
处理器与MIPS
1、计算机的简单模型
2、架构与指令集
3、MIPS的ISA演变
4、MIPS32 Release 1 指令集架构
1、数据类型
2、寄存器
3、字节次序
4、指令格式
5、指令集
6、寻址方式
7、协处理器CP0
8、异常
硬件描述语言 Verilog
处理器与MIPS
1、计算机的简单模型
计算机主要由三大组成部分构成:处理器、输入输出、存储器。
汇编指令将助记符进行译码,变为二进制数据,供计算机识别、执行。
高级语言先通过编译变为汇编语言,然后通过汇编指令将指令翻译为二进制编码数据。
2、架构与指令集
指令集架构(ISA):包括了一套指令集和一些寄存器。面向ISA编程的最大优点就是,程序的执行无关处理器类型,无关硬件。ISA本身是一个抽象物,不涉及任何实现的硬件与环境。
微架构:是ISA的具体实现。
同样的ISA,不同的微架构则会带来不同的性能。
根据不同的ISA,可将计算机分为两类:复杂指令集计算机(CISC)、精简指令集计算机(RISC)。二者的主要区别在于:
CISC指令编码长度不一致;
RISC指令编码长度一致且固定;
ISA种类:
x86:属CISC范畴
ARM:Acorn RISC Machine ,属RISC范畴,目前ARM公司仅作CPU内核设计,不做具体的芯片制造和生产。其产品侧重于低功耗、低成本,主要面向嵌入式应用。
SPARC:Scalable Processor ARChitecture ,可扩展处理器架构。属RISC范畴。
POWER:Performance Optimization With Enhanced RISC ,属RISC范畴。IBM公司的产品。
MIPS:Microprocessor without Interlocked Piped Stages,无内锁流水线处理器。属RISC范畴。其设计理念:使用简单的指令,结合优秀的编译器,采用流水线执行指令的硬件,就可以用更少的晶圆面积生产更快的处理器。龙芯处理器采用的就是此架构。
3、MIPS的ISA演变
4、MIPS32 Release 1 指令集架构
该参考数目的处理器设计就是遵循 MIPS32 Release 1 架构。
1、数据类型
- 位(b):长度为 1 bit;
- 字节(Byte):长度为8 bit;
- 半字(HalfWord):长度16 bit;
- 字(Word):长度为 32 bit;
- 双字(Double Word):长度为 64bit;
- 另:32位单精度浮点数,64位双精度浮点数;
2、寄存器
MIPS32的指令中处了 加载/存储 指令外,其他指令都是用寄存器或者立即数作为操作数。因为寄存器的存取可以在一个时钟周期内完成。
MIPS32中的寄存器类别:通用寄存器、特殊寄存器。
1、通用寄存器
MIPS32架构定义了 32 个 32 位宽的寄存器,用 $0 ~ $31表示。$0 一般用作常量 0;
实际使用中,寄存器一般遵循如下的约定:
2、特殊寄存器
MIPS32中的特殊寄存器有3个:PC(程序计数器)、HI(乘除结果高位寄存器)、LO(乘除结果地位寄存器)。乘法运算时,HI保存乘法结果的高32位,LO保存低32位。除法运算时,HI存储余数,LO存储商。
3、字节次序
数据在存储器中的存取都是以字节为单位的,所以当存取的数据的位宽多于1个字节时,就需要明确数据的大小端模式。
大端模式:MSB,数据高位存储于低地址;
小端模式: LSB,数据低位保存在低地址;
参考书中MIPS32的实现是大端模式。
示例:
4、指令格式
MIPS32的架构中,指令位宽都是32。
图中 op 为指令码;func 为功能码;
5、指令集
1、逻辑操作指令
包含8条指令:and 、andi 、or 、ori 、xor 、xori 、nor 、lui
2、移位操作指令
包含6条指令:sll 、sllv 、sra 、srav 、srl 、srlv
3、移动操作指令
包含6条指令:movn、movz、mfhi、mthi、mflo、mtlo
4、算术操作指令
包含21条指令:add、addi、addiu、addu、sub、subu、clo、clz、slt、slti、sltiu、sltu、mul、mult、multu、madd、maddu、msub、msubu、div、divu
5、转移指令
包含14条指令:jr 、jalr 、j、 jal、b、bal、beq、bgez、bgezal、bgtz、blez、bltz、bltzal、bne
6、加载存储指令
包含14条指令:lb、lbu、lh、lhu、ll、lw、lwl、lwr、sb、sc、sh、sw、swl、swr
7、协处理器访问指令
包含2条指令:mtc0、mfc0
8、异常相关指令
包含14条指令,其中12条自陷指令:teq、tge、tgeu、tlt、tltu、tne、teqi、tgei、tgeiu、tlti、tltiu、tnei;系统调用指令:syscall、异常返回指令:eret
9、其余指令
包含4条指令:nop、ssnop、sync、pref
6、寻址方式
MIPS32架构的寻址方式:寄存器寻址、立即数寻址、寄存器相对寻址、PC相对寻址。
1、寄存器相对寻址:
2、PC相对寻址
7、协处理器CP0
MIPS32架构提供了最多 4 个协处理器,分别是 CP0 ~ CP3。其中CP0用作系统控制,CP1、CP3作浮点处理单元。CP2用于特定实现。除CP0以外的协处理器都是可选的。
协处理器CP0,主要的作用:
配置CPU工作状态;
高速缓存控制;
异常控制;
存储单元管理;
8、异常
硬件描述语言 Verilog
此部分本人比较了解,就不再记录。建议初学者查看我的下面的专栏,快速了解Verilog HDL语法:
Verilog HDL 语法整理https://blog.csdn.net/qq_43045275/category_11341294.html?spm=1001.2014.3001.5482
《自己动手写CPU》学习记录(1)——第1章相关推荐
- 自己动手写CPU(2)第一条ori指令
本博客内容基于<自己动手写CPU>这本书 上一篇文章介绍了一下流水线思想.设计流程等,下面我们可以实操一下实现第一条ori指令. 其实实现一条ori指令不难,我目前对这一条指令的理解简单来 ...
- 自己动手写cpu 光盘_自己动手写CPU配套源码
自己动手写CPU的源代码,一共15章,可以完整实现MIPS的指令 文件:n459.com/file/25127180-476886294 以下内容无关: ----------------------- ...
- 【自己动手写CPU】异常相关指令的实现
MIPS架构中定义的异常类型 MIPS32架构中,有些事情打断程序的正常的执行流程,这些事情称为中断.陷阱.系统调用以及其他打断程序执行流程的情况,统称为异常. 此处的OpenMIPS处理器只实现了其 ...
- 自己动手写CPU(1)五级流水线及CPU第一条指令ori
自己动手写CPU(1)五级流水线及CPU第一条指令ori 动机 不知为何研一的自由时间突然多起来,可能人一闲下来就容易焦虑吧,hhhhhh.正好之前看到一本<自己动手写CPU>,就按照此书 ...
- 自己动手写CPU之第七阶段(10)——除法指令实现过程1
将陆续上传本人写的新书<自己动手写CPU>,今天是第33篇,我尽量每周四篇 亚马逊的销售地址如下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8/r ...
- 自己动手写CPU之第七阶段(5)——流水线暂停机制的设计与实现
将陆续上传本人写的新书<自己动手写CPU>,今天是第28篇.我尽量每周四篇 China-pub的预售地址例如以下(有文件夹.内容简单介绍.前言): http://product.china ...
- 自己动手写CPU(8)加载存储指令的实现
自己动手写CPU(8)加载存储指令的实现 好久没更新blog了,暑假提前放了.现在收假也该收收心了,继续捡起之前的CPU,自己开的坑不管咋样把它填完吧. 指令介绍 1.加载指令 2.存储指令 修改系统 ...
- 自己动手写CPU(7)转移指令的实现
自己动手写CPU(7)转移指令的实现 分支延迟槽 在MIPS五级流水线中,一条指令被分成了五个阶段:取指.译指.执行.仿存.回写.当第一条指令的执行阶段结束时,第二条指令的译指阶段也已经结束了. 那么 ...
- 自己动手写CPU(6)流水线暂停、乘累加减与除法器的实现
自己动手写CPU(6)流水线暂停.乘累加减与除法器的实现 流水线暂停 因为OpenMIPS设计乘累加.乘累减.除法指令在流水线执行阶段占用多个时钟周期,因此需要暂停流水线,以等待这些多周期指令执行完毕 ...
- 自己动手写CPU(5)简单算术操作指令实现_1
自己动手写CPU(5)简单算数操作指令实现_1 指令介绍 MIPS32指令集架构定义的所有算术操作指令,共有21条 共有三类,分别是: 简单算术指令 乘累加.乘累减指令 除法指令 算术指令操作介绍 一 ...
最新文章
- rpm、yum、编译安装轻松管理centos7程序包
- 中蒙最大陆路口岸2018年运行中欧班列1052列
- 监控io性能, free命令, ps命令, 查看网络状态, linux下抓包
- Octopress配置和部署
- 分布式事务中间件 Fescar - 全局写排它锁解读
- Algs4-1.4.8计算输入文件中相等的整数对的数量
- ImportError: No module named ‘pandas.io.data‘
- Linux 下报错:A Java RunTime Environment (JRE) or Java
- IEEE Fellow 2020名单揭晓!BDTC 2019重磅嘉宾周伯文、叶杰平、陈宝权上榜
- Android实现税博客,Android个人所得税计算器
- linux 内核空间与用户空间通信,liunx用户空间和内核空间之间的通信实现(在PPC下的实现)...
- ora-12555解决方案
- 友善串口助手 V2.5.8.0825 Serial Port Utility注册码
- 陪诊系统app开发,一个应用可切换不同身份
- 网站域名解析为什么错误?域名解析错误怎么解决?
- 扇贝python编程课_扇贝编程APP下载|扇贝编程python V1.1.35 安卓版下载 - 下载银行...
- J2EE平台WEB组件开发中如何使用定制标签
- JAVA虚拟机的安装以及JAVA的环境配置
- windows7安装Edge浏览器后无法登录微软账户
- iwebshop与MySQL无法并存吗_该如何做好iwebshop网上购物商场
热门文章
- 【深度学习实验报告】实验 1:PyTorch 使用简介
- 第11章-ThreadSpecificStorage
- 几个国内的 apple 相关社区
- 基于pytorch卷积人脸表情识别--毕业设计
- 计算机网络软件系统不包括,1period;计算机软件系统一般分为lpar; A rpar;两大部分...
- python 读写pcd
- FastAdmin下拉显示
- 2019全球IT行业薪酬报告:平均年薪超70万!最高薪职位竟是...
- Inception模块 GooLeNet网络
- 克里金方法内插生成高程曲面