作品简介

《自己动手写CPU》使用Verilog HDL 设计实现了一款兼容MIPS32指令集架构的处理器——OpenMIPS。OpenMIPS 处理器具有两个版本,分别是教学版和实践版。教学版的主要设计思想是尽量简单,处理器的运行情况比较理想化,与教科书相似,便于使用其进行教学、学术研究和讨论,也有助于学生理解课堂上讲授的知识。实践版的设计目标是能完成特定功能,发挥实际作用。

《自己动手写CPU》分为三篇。第一篇是理论篇,介绍了指令集架构、Verilog HDL的相关知识。第二篇是基础篇,采用增量模型,实现了教学版OpenMIPS处理器。首先实现了仅能执行一条指令的处理器,从这个最简单的情况出发,通过依次添加,实现逻辑操作指令、移位操作指令、空指令、移动操作指令、算术操作指令、转移指令、加载存储指令、协处理器访问指令、异常相关指令,最终实现了教学版OpenMIPS处理器。第三篇是进阶篇,通过为教学版OpenMIPS添加Wishbone总线接口,从而实现了实践版OpenMIPS处理器,并与SDRAM控制器、GPIO模块、Flash控制器、UART控制器、Wishbone总线互联矩阵等模块组成一个小型SOPC,然后下载到FPGA芯片以验证实现效果,最后为实践版OpenMIPS处理器移植了嵌入式实时操作系统μC/OS-II。

《自己动手写CPU》适合计算机专业的学生、FPGA开发人员、处理器设计者、嵌入式系统应用开发工程师、MIPS平台开发人员以及对处理器内部的实现感兴趣的读者阅读,也可以作为高等院校计算机原理、计算机体系结构等课程的实践参考书。

雷思磊,理工男,好静,倡导低碳生活,常以环保人士自居,喜读书,自幼笃信“博观而约取厚积而薄发”,是故,所读书籍甚为驳杂,年近而立,尚不确定根本兴趣目标,一日,驻足书架之前,细览所读书籍,惊觉随岁月增长,关注点依次从应用编程、操作系统、驱动设计转移至处理器结构,此一脉络极其清晰,遂如醍醐灌顶,幡然醒悟,原来余根本兴趣目标在“底层”,在于从根本上理解世界之运行,遂耗数年时间钻研处理器工作原理,乃有些微收获,拙作当为数年辛苦之小结,然学无止境,科技发展亦日新月异,唯有持续钻研,方能大成,屈子曰:路漫漫其修远兮,吾将上下而求索。此言甚是,余定谨记而遵行之。

作品目录

  • 前言
  • 第一篇 理论篇
  • 第1章 处理器与MIPS
  • 1.1 计算机的简单模型
  • 1.2 架构与指令集
  • 1.x86
  • 2.ARM
  • 3.SPARC
  • 4.POWER
  • 5.MIPS
  • 1.3 MIPS指令集架构的演变
  • 1.MIPS Ⅰ
  • 2.MIPS Ⅱ
  • 3.MIPS Ⅲ
  • 4.MIPS Ⅳ
  • 5.MIPS Ⅴ
  • 6.MIPS32/64
  • 7.microMIPS32/64
  • 1.4 MIPS32指令集架构简介
  • 1.通用寄存器
  • 2.特殊寄存器
  • 1.逻辑操作指令
  • 2.移位操作指令
  • 3.移动操作指令
  • 4.算术操作指令
  • 5.转移指令
  • 6.加载存储指令
  • 7.协处理器访问指令
  • 8.异常相关指令
  • 9.其余指令
  • 1.5 本书的目标与组织方式
  • 第2章 可编程逻辑器件与Verilog HDL
  • 2.1 可编程逻辑器件概述
  • 1.基于乘积项(Product-Term)结构的PLD器件
  • 2.基于查找表(Look-Up Table,LUT)结构的PLD器件
  • 2.2 基于PLD的数字系统设计流程
  • 1.原理图输入
  • 2.HDL文本输入
  • 2.3 Verilog HDL简介
  • 2.4 Verilog HDL中模块的结构
  • 1.模块声明
  • 2.端口定义
  • 3.数据类型说明
  • 4.逻辑功能描述
  • 2.5 Verilog HDL基本要素
  • 1.net型变量
  • 2.variable型变量
  • 2.6 Verilog HDL行为语句
  • 1.always过程语句
  • 2.initial过程语句
  • 1.持续赋值语句
  • 2.过程赋值语句
  • 1.if-else语句
  • 2.case语句
  • 1.for语句
  • 2.forever语句
  • 3.repeat语句
  • 4.while语句
  • 1.宏替换`define
  • 2.`include语句
  • 3.条件编译语句`ifdef、`else、`endif
  • 2.7 电路设计举例
  • 1.PC模块的设计与实现
  • 2.指令存储器ROM的设计与实现
  • 3.顶层文件
  • 2.8 仿真
  • 1.$stop
  • 2.$readmemh
  • 1.建立ModelSim工程
  • 2.开始仿真
  • 2.9 本章小结
  • 第二篇 基础篇
  • 第3章 教学版OpenMIPS处理器蓝图
  • 3.1 系统设计目标
  • 3.2 教学版OpenMIPS处理器接口
  • 3.3 文件说明
  • 3.4 实现方法
  • 第4章 第一条指令ori的实现
  • 4.1 ori指令说明
  • 4.2 流水线结构的建立
  • 1.PC模块
  • 2.IF/ID模块
  • 1.Regfile模块
  • 2.ID模块
  • 3.ID/EX模块
  • 1.EX模块
  • 2.EX/MEM模块
  • 1.MEM模块
  • 2.MEM/WB模块
  • 4.3 验证OpenMIPS实现效果
  • 4.4 MIPS编译环境的建立
  • 4.5 第一条指令实现小结
  • 第5章 逻辑、移位操作与空指令的实现
  • 5.1 流水线数据相关问题
  • 5.2 OpenMIPS对数据相关问题的解决措施
  • 5.3 测试数据相关问题的解决效果
  • 5.4 逻辑、移位操作与空指令说明
  • 1.and、or、xor、nor
  • 2.andi、xori指令
  • 3.lui指令
  • 4.sll、sllv、sra、srav、srl、srlv指令
  • 5.nop、ssnop、sync、pref指令
  • 5.5 修改OpenMIPS以实现逻辑、移位操作与空指令
  • 1.and指令的译码过程
  • 2.andi指令的译码过程
  • 3.sllv指令的译码过程
  • 4.lui指令的译码过程
  • 5.sll指令的译码过程
  • 5.6 测试程序1——测试逻辑操作实现效果
  • 5.7 测试程序2——测试移位操作与空指令实现效果
  • 5.8 小结
  • 第6章 移动操作指令的实现
  • 6.1 移动操作指令说明
  • 6.2 移动操作指令实现思路
  • 1.movn、movz指令实现思路
  • 2.mthi、mtlo指令实现思路
  • 3.mfhi、mflo指令实现思路
  • 6.3 修改OpenMIPS以实现移动操作指令
  • 1.修改EX模块
  • 2.修改EX/MEM模块
  • 1.修改MEM模块
  • 2.修改MEM/WB模块
  • 6.4 测试程序
  • 第7章 算术操作指令的实现
  • 7.1 简单算术操作指令说明
  • 1.add、addu、sub、subu、slt、sltu指令
  • 2.addi、addiu、slti、sltiu指令
  • 3.clo、clz指令
  • 4.multu、mult、mul指令
  • 7.2 简单算术操作指令实现思路
  • 7.3 修改OpenMIPS以实现简单算术操作指令
  • 1.add指令的译码过程
  • 2.addi指令的译码过程
  • 3.slt指令的译码过程
  • 4.slti指令的译码过程
  • 5.mult指令的译码过程
  • 6.mul指令的译码过程
  • 7.clo指令的译码过程
  • 7.4 测试简单算术操作指令实现效果
  • 7.5 流水线暂停机制的设计与实现
  • 1.CTRL模块的实现
  • 2.修改取指阶段
  • 3.修改译码阶段
  • 4.修改执行阶段
  • 5.修改访存阶段
  • 6.修改顶层模块OpenMIPS
  • 7.6 乘累加、乘累减指令说明
  • 7.7 乘累加、乘累减指令实现思路
  • 7.8 修改OpenMIPS以实现乘累加、乘累减指令
  • 7.9 测试乘累加、乘累减指令实现效果
  • 7.10 除法指令说明
  • 7.11 除法指令实现思路
  • 7.12 修改OpenMIPS以实现除法指令
  • 7.13 测试除法指令实现效果
  • 7.14 数据流图的修改
  • 第8章 转移指令的实现
  • 8.1 延迟槽
  • 8.2 转移指令说明
  • 1.跳转指令
  • 2.分支指令
  • 8.3 转移指令实现思路
  • 8.4 修改OpenMIPS以实现转移指令
  • 1.修改ID模块
  • 2.修改ID/EX模块
  • 8.5 测试转移指令的实现效果
  • 第9章 加载存储指令的实现
  • 9.1 加载存储指令说明
  • 9.2 加载存储指令实现思路
  • 1.加载指令实现思路
  • 2.存储指令实现思路
  • 9.3 修改OpenMIPS以实现加载存储指令
  • 1.修改ID模块
  • 2.修改ID/EX模块
  • 1.修改EX模块
  • 2.修改EX/MEM模块
  • 1.lb指令的访存过程
  • 2.lwl指令的访存过程
  • 3.sb指令的访存过程
  • 4.swl指令的访存过程
  • 9.4 修改最小SOPC
  • 9.5 测试程序
  • 9.6 链接加载指令ll、条件存储指令sc说明
  • 9.7 ll、sc指令实现思路
  • 9.8 修改OpenMIPS以实现ll、sc指令
  • 1.修改MEM模块
  • 2.修改MEM/WB模块
  • 9.9 测试ll、sc指令实现效果
  • 9.10 load相关问题
  • 9.11 修改OpenMIPS以解决load相关问题
  • 9.12 测试load相关问题解决效果
  • 9.13 小结
  • 第10章 协处理器访问指令的实现
  • 10.1 协处理器介绍
  • 10.2 协处理器CP0中的寄存器
  • 1.Count寄存器(标号为9)
  • 2.Compare寄存器(标号为11)
  • 3.Status寄存器(标号为12)
  • 4.Cause寄存器(标号为13)
  • 5.EPC寄存器(标号为14)
  • 6.PRId寄存器(标号为15)
  • 7.Config寄存器(标号为16)
  • 10.3 协处理器CP0的实现
  • 10.4 协处理器访问指令说明
  • 10.5 协处理器访问指令实现思路
  • 1.mtc0实现思路
  • 2.mfc0实现思路
  • 10.6 修改OpenMIPS以实现协处理器访问指令
  • 1.修改EX模块
  • 2.修改EX/MEM模块
  • 1.修改MEM模块
  • 2.修改MEM/WB模块
  • 10.7 测试程序
  • 第11章 异常相关指令的实现
  • 11.1 MIPS32架构中定义的异常类型
  • 11.2 精确异常
  • 11.3 异常处理过程
  • 11.4 异常相关指令介绍
  • 1.不包含立即数的自陷指令
  • 2.包含立即数的自陷指令
  • 11.5 异常处理实现思路
  • 11.6 修改OpenMIPS以实现异常处理
  • 1.修改PC模块
  • 2.修改IF/ID模块
  • 1.修改ID模块
  • 2.修改ID/EX模块
  • 1.修改EX模块
  • 2.修改EX/MEM模块
  • 1.修改MEM模块
  • 2.修改MEM/WB模块
  • 1.中断
  • 2.系统调用异常
  • 3.无效指令异常
  • 4.自陷异常
  • 5.溢出异常
  • 6.异常返回指令eret
  • 11.7 再次修改最小SOPC
  • 11.8 测试程序
  • 11.9 教学版OpenMIPS处理器实现小结
  • 第三篇 进阶篇
  • 第12章 实践版OpenMIPS处理器设计与实现
  • 12.1 实践版OpenMIPS处理器的设计目标
  • 12.2 Wishbone总线介绍
  • 12.3 实践版OpenMIPS处理器接口
  • 12.4 实践版OpenMIPS处理器的实现思路
  • 12.5 从教学版OpenMIPS到实践版OpenMIPS
  • 12.6 实践版OpenMIPS处理器实现小结
  • 第13章 基于实践版OpenMIPS的小型SOPC
  • 13.1 小型SOPC的结构
  • 1.共享总线
  • 2.交叉互联
  • 13.2 Wishbone总线互联矩阵WB_CONMAX
  • 13.3 GPIO
  • 13.4 UART控制器
  • 13.5 Flash控制器
  • 13.6 SDRAM控制器
  • 13.6.1.1 SDRAM结构
  • 13.6.1.2 SDRAM的刷新
  • 13.6.1.3 SDRAM的命令
  • 13.6.1.4 SDRAM初始化
  • 13.6.1.5 模式寄存器
  • 13.6.1.6 Bank行激活
  • 13.6.1.7 SDRAM读写
  • 13.6.1.8 SDRAM的时间参数
  • 13.7 实现基于实践版OpenMIPS的小型SOPC
  • 13.8 本章小结
  • 第14章 验证实践版OpenMIPS处理器
  • 14.1 DE2平台简介
  • 14.2 测试需要的硬件连接
  • 14.3 QuartusII工程建立
  • 14.4 测试步骤说明
  • 14.5 测试一——GPIO实验
  • 14.6 测试二——UART实验
  • 14.7 测试三——模拟操作系统的加载过程
  • 14.8 本章小结
  • 第15章 为OpenMIPS处理器移植μC/OS-II
  • 15.1 为什么需要操作系统
  • 1.魔幻家角色
  • 2.管理者角色
  • 15.2 嵌入式实时操作系统介绍
  • 1.嵌入式操作系统
  • 2.实时操作系统
  • 15.3 μC/OS-II简介
  • 15.4 μC/OS-II特点
  • 1.提供源代码
  • 2.可移植(Portable)
  • 3.可固化(ROMable)
  • 4.可裁剪(Scalable)
  • 5.可剥夺型(Preemptive)
  • 6.多任务
  • 7.可确定性
  • 8.任务栈
  • 9.系统服务
  • 10.中断管理
  • 11.稳定性与可靠性
  • 15.5 μC/OS-II的几个概念
  • 15.6 μC/OS-II的基本功能
  • 15.7 μC/OS-II的文件体系
  • 15.8 μC/OS-II的移植条件
  • 1.处理器的C编译器能产生可重入代码
  • 2.用C语言可打开和关闭中断
  • 3.处理器支持中断并且能产生定时中断
  • 4.处理器支持能够容纳一定量数据的硬件堆栈
  • 5.处理器有将堆栈指针和CPU其余寄存器读出和存储到堆栈(或内存)的指令
  • 15.9 C语言中使用汇编代码
  • 1.汇编语句模板
  • 2.输出部分
  • 3.输入部分
  • 4.破坏描述部分
  • 15.10 MIPS函数调用规范
  • 1.使用堆栈传递参数
  • 2.使用寄存器传递参数
  • 1.参数传递示例
  • 2.函数返回值示例
  • 3.非叶子函数堆栈布局示例
  • 4.叶子函数堆栈布局示例
  • 15.11 μC/OS-II在OpenMIPS处理器上的移植
  • 1.数据类型定义
  • 2.进、出临界区的宏
  • 3.定义堆栈生长方向
  • 4.用于任务切换的宏定义
  • 5.一些函数声明
  • 1.异常处理例程
  • 2.一些常数
  • 3.函数OS_CPU_SR_Save
  • 4.函数OS_CPU_SR_Restore
  • 5.函数InterruptHandler
  • 6.函数OSIntCtxSw
  • 7.函数ExceptionHandler
  • 8.函数OSStartHighRdy
  • 9.函数TickInterruptClear
  • 10.函数CoreTmrInit
  • 11.函数TickISR
  • 12.函数DisableInterruptSource
  • 13.函数EnableInterruptSource
  • 1.函数OSTaskStkInit
  • 2.函数BSP_Interrupt_Handler
  • 3.函数BSP_Exception_Handler
  • 15.12 测试程序
  • 15.13 编译指示文件的建立
  • 1.新建链接脚本文件ram.ld
  • 2.新建config.mk、Makefile文件
  • 3.在Common目录下添加Makefile文件
  • 4.在ucos目录下添加Makefile文件
  • 5.在port目录下添加Makefile文件
  • 15.14 OpenMIPS处理器运行移植后的μC/OS-II
  • 15.15 本章小结
  • 附录A 教学版OpenMIPS各个模块的接口说明
  • A.1 PC模块接口说明
  • A.2 IF/ID模块接口说明
  • A.3 ID模块接口说明
  • A.4 Regfile模块接口说明
  • A.5 ID/EX模块接口说明
  • A.6 EX模块接口说明
  • A.7 DIV模块接口说明
  • A.8 EX/MEM模块接口说明
  • A.9 MEM模块接口说明
  • A.10 MEM/WB模块接口说明
  • A.11 CP0模块接口说明
  • A.12 LLbit模块接口说明
  • A.13 HILO模块接口说明
  • A.14 CTRL模块接口说明
  • 附录B OpenMIPS实现的所有指令及对应的机器码
  • B.1 逻辑操作指令
  • B.2 移位操作指令
  • B.3 移动操作指令
  • B.4 算术操作指令
  • B.5 转移指令
  • B.6 加载存储指令
  • B.7 协处理器访问指令
  • B.8 异常相关指令
  • B.9 空指令及其他指令
  • 参考文献
展开全部