自己动手写CPU

自己动手写CPU

暂无评价综合评分的显示会考虑用户真实性等多项因素,每部作品出现综合评分的时间不定。
8.955 评价豆瓣读书
¥35.20¥21.12
今日特价截止至:2024-03-30 02:00:00了解详情

作品简介

《自己动手写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. 前言
  2. 第一篇 理论篇
  3. 第1章 处理器与MIPS
  4. 1.1 计算机的简单模型
  5. 1.2 架构与指令集
  6. 1.x86
  7. 2.ARM
  8. 3.SPARC
  9. 4.POWER
  10. 5.MIPS
  11. 1.3 MIPS指令集架构的演变
  12. 1.MIPS Ⅰ
  13. 2.MIPS Ⅱ
  14. 3.MIPS Ⅲ
  15. 4.MIPS Ⅳ
  16. 5.MIPS Ⅴ
  17. 6.MIPS32/64
  18. 7.microMIPS32/64
  19. 1.4 MIPS32指令集架构简介
  20. 1.通用寄存器
  21. 2.特殊寄存器
  22. 1.逻辑操作指令
  23. 2.移位操作指令
  24. 3.移动操作指令
  25. 4.算术操作指令
  26. 5.转移指令
  27. 6.加载存储指令
  28. 7.协处理器访问指令
  29. 8.异常相关指令
  30. 9.其余指令
  31. 1.5 本书的目标与组织方式
  32. 第2章 可编程逻辑器件与Verilog HDL
  33. 2.1 可编程逻辑器件概述
  34. 1.基于乘积项(Product-Term)结构的PLD器件
  35. 2.基于查找表(Look-Up Table,LUT)结构的PLD器件
  36. 2.2 基于PLD的数字系统设计流程
  37. 1.原理图输入
  38. 2.HDL文本输入
  39. 2.3 Verilog HDL简介
  40. 2.4 Verilog HDL中模块的结构
  41. 1.模块声明
  42. 2.端口定义
  43. 3.数据类型说明
  44. 4.逻辑功能描述
  45. 2.5 Verilog HDL基本要素
  46. 1.net型变量
  47. 2.variable型变量
  48. 2.6 Verilog HDL行为语句
  49. 1.always过程语句
  50. 2.initial过程语句
  51. 1.持续赋值语句
  52. 2.过程赋值语句
  53. 1.if-else语句
  54. 2.case语句
  55. 1.for语句
  56. 2.forever语句
  57. 3.repeat语句
  58. 4.while语句
  59. 1.宏替换`define
  60. 2.`include语句
  61. 3.条件编译语句`ifdef、`else、`endif
  62. 2.7 电路设计举例
  63. 1.PC模块的设计与实现
  64. 2.指令存储器ROM的设计与实现
  65. 3.顶层文件
  66. 2.8 仿真
  67. 1.$stop
  68. 2.$readmemh
  69. 1.建立ModelSim工程
  70. 2.开始仿真
  71. 2.9 本章小结
  72. 第二篇 基础篇
  73. 第3章 教学版OpenMIPS处理器蓝图
  74. 3.1 系统设计目标
  75. 3.2 教学版OpenMIPS处理器接口
  76. 3.3 文件说明
  77. 3.4 实现方法
  78. 第4章 第一条指令ori的实现
  79. 4.1 ori指令说明
  80. 4.2 流水线结构的建立
  81. 1.PC模块
  82. 2.IF/ID模块
  83. 1.Regfile模块
  84. 2.ID模块
  85. 3.ID/EX模块
  86. 1.EX模块
  87. 2.EX/MEM模块
  88. 1.MEM模块
  89. 2.MEM/WB模块
  90. 4.3 验证OpenMIPS实现效果
  91. 4.4 MIPS编译环境的建立
  92. 4.5 第一条指令实现小结
  93. 第5章 逻辑、移位操作与空指令的实现
  94. 5.1 流水线数据相关问题
  95. 5.2 OpenMIPS对数据相关问题的解决措施
  96. 5.3 测试数据相关问题的解决效果
  97. 5.4 逻辑、移位操作与空指令说明
  98. 1.and、or、xor、nor
  99. 2.andi、xori指令
  100. 3.lui指令
  101. 4.sll、sllv、sra、srav、srl、srlv指令
  102. 5.nop、ssnop、sync、pref指令
  103. 5.5 修改OpenMIPS以实现逻辑、移位操作与空指令
  104. 1.and指令的译码过程
  105. 2.andi指令的译码过程
  106. 3.sllv指令的译码过程
  107. 4.lui指令的译码过程
  108. 5.sll指令的译码过程
  109. 5.6 测试程序1——测试逻辑操作实现效果
  110. 5.7 测试程序2——测试移位操作与空指令实现效果
  111. 5.8 小结
  112. 第6章 移动操作指令的实现
  113. 6.1 移动操作指令说明
  114. 6.2 移动操作指令实现思路
  115. 1.movn、movz指令实现思路
  116. 2.mthi、mtlo指令实现思路
  117. 3.mfhi、mflo指令实现思路
  118. 6.3 修改OpenMIPS以实现移动操作指令
  119. 1.修改EX模块
  120. 2.修改EX/MEM模块
  121. 1.修改MEM模块
  122. 2.修改MEM/WB模块
  123. 6.4 测试程序
  124. 第7章 算术操作指令的实现
  125. 7.1 简单算术操作指令说明
  126. 1.add、addu、sub、subu、slt、sltu指令
  127. 2.addi、addiu、slti、sltiu指令
  128. 3.clo、clz指令
  129. 4.multu、mult、mul指令
  130. 7.2 简单算术操作指令实现思路
  131. 7.3 修改OpenMIPS以实现简单算术操作指令
  132. 1.add指令的译码过程
  133. 2.addi指令的译码过程
  134. 3.slt指令的译码过程
  135. 4.slti指令的译码过程
  136. 5.mult指令的译码过程
  137. 6.mul指令的译码过程
  138. 7.clo指令的译码过程
  139. 7.4 测试简单算术操作指令实现效果
  140. 7.5 流水线暂停机制的设计与实现
  141. 1.CTRL模块的实现
  142. 2.修改取指阶段
  143. 3.修改译码阶段
  144. 4.修改执行阶段
  145. 5.修改访存阶段
  146. 6.修改顶层模块OpenMIPS
  147. 7.6 乘累加、乘累减指令说明
  148. 7.7 乘累加、乘累减指令实现思路
  149. 7.8 修改OpenMIPS以实现乘累加、乘累减指令
  150. 7.9 测试乘累加、乘累减指令实现效果
  151. 7.10 除法指令说明
  152. 7.11 除法指令实现思路
  153. 7.12 修改OpenMIPS以实现除法指令
  154. 7.13 测试除法指令实现效果
  155. 7.14 数据流图的修改
  156. 第8章 转移指令的实现
  157. 8.1 延迟槽
  158. 8.2 转移指令说明
  159. 1.跳转指令
  160. 2.分支指令
  161. 8.3 转移指令实现思路
  162. 8.4 修改OpenMIPS以实现转移指令
  163. 1.修改ID模块
  164. 2.修改ID/EX模块
  165. 8.5 测试转移指令的实现效果
  166. 第9章 加载存储指令的实现
  167. 9.1 加载存储指令说明
  168. 9.2 加载存储指令实现思路
  169. 1.加载指令实现思路
  170. 2.存储指令实现思路
  171. 9.3 修改OpenMIPS以实现加载存储指令
  172. 1.修改ID模块
  173. 2.修改ID/EX模块
  174. 1.修改EX模块
  175. 2.修改EX/MEM模块
  176. 1.lb指令的访存过程
  177. 2.lwl指令的访存过程
  178. 3.sb指令的访存过程
  179. 4.swl指令的访存过程
  180. 9.4 修改最小SOPC
  181. 9.5 测试程序
  182. 9.6 链接加载指令ll、条件存储指令sc说明
  183. 9.7 ll、sc指令实现思路
  184. 9.8 修改OpenMIPS以实现ll、sc指令
  185. 1.修改MEM模块
  186. 2.修改MEM/WB模块
  187. 9.9 测试ll、sc指令实现效果
  188. 9.10 load相关问题
  189. 9.11 修改OpenMIPS以解决load相关问题
  190. 9.12 测试load相关问题解决效果
  191. 9.13 小结
  192. 第10章 协处理器访问指令的实现
  193. 10.1 协处理器介绍
  194. 10.2 协处理器CP0中的寄存器
  195. 1.Count寄存器(标号为9)
  196. 2.Compare寄存器(标号为11)
  197. 3.Status寄存器(标号为12)
  198. 4.Cause寄存器(标号为13)
  199. 5.EPC寄存器(标号为14)
  200. 6.PRId寄存器(标号为15)
  201. 7.Config寄存器(标号为16)
  202. 10.3 协处理器CP0的实现
  203. 10.4 协处理器访问指令说明
  204. 10.5 协处理器访问指令实现思路
  205. 1.mtc0实现思路
  206. 2.mfc0实现思路
  207. 10.6 修改OpenMIPS以实现协处理器访问指令
  208. 1.修改EX模块
  209. 2.修改EX/MEM模块
  210. 1.修改MEM模块
  211. 2.修改MEM/WB模块
  212. 10.7 测试程序
  213. 第11章 异常相关指令的实现
  214. 11.1 MIPS32架构中定义的异常类型
  215. 11.2 精确异常
  216. 11.3 异常处理过程
  217. 11.4 异常相关指令介绍
  218. 1.不包含立即数的自陷指令
  219. 2.包含立即数的自陷指令
  220. 11.5 异常处理实现思路
  221. 11.6 修改OpenMIPS以实现异常处理
  222. 1.修改PC模块
  223. 2.修改IF/ID模块
  224. 1.修改ID模块
  225. 2.修改ID/EX模块
  226. 1.修改EX模块
  227. 2.修改EX/MEM模块
  228. 1.修改MEM模块
  229. 2.修改MEM/WB模块
  230. 1.中断
  231. 2.系统调用异常
  232. 3.无效指令异常
  233. 4.自陷异常
  234. 5.溢出异常
  235. 6.异常返回指令eret
  236. 11.7 再次修改最小SOPC
  237. 11.8 测试程序
  238. 11.9 教学版OpenMIPS处理器实现小结
  239. 第三篇 进阶篇
  240. 第12章 实践版OpenMIPS处理器设计与实现
  241. 12.1 实践版OpenMIPS处理器的设计目标
  242. 12.2 Wishbone总线介绍
  243. 12.3 实践版OpenMIPS处理器接口
  244. 12.4 实践版OpenMIPS处理器的实现思路
  245. 12.5 从教学版OpenMIPS到实践版OpenMIPS
  246. 12.6 实践版OpenMIPS处理器实现小结
  247. 第13章 基于实践版OpenMIPS的小型SOPC
  248. 13.1 小型SOPC的结构
  249. 1.共享总线
  250. 2.交叉互联
  251. 13.2 Wishbone总线互联矩阵WB_CONMAX
  252. 13.3 GPIO
  253. 13.4 UART控制器
  254. 13.5 Flash控制器
  255. 13.6 SDRAM控制器
  256. 13.6.1.1 SDRAM结构
  257. 13.6.1.2 SDRAM的刷新
  258. 13.6.1.3 SDRAM的命令
  259. 13.6.1.4 SDRAM初始化
  260. 13.6.1.5 模式寄存器
  261. 13.6.1.6 Bank行激活
  262. 13.6.1.7 SDRAM读写
  263. 13.6.1.8 SDRAM的时间参数
  264. 13.7 实现基于实践版OpenMIPS的小型SOPC
  265. 13.8 本章小结
  266. 第14章 验证实践版OpenMIPS处理器
  267. 14.1 DE2平台简介
  268. 14.2 测试需要的硬件连接
  269. 14.3 QuartusII工程建立
  270. 14.4 测试步骤说明
  271. 14.5 测试一——GPIO实验
  272. 14.6 测试二——UART实验
  273. 14.7 测试三——模拟操作系统的加载过程
  274. 14.8 本章小结
  275. 第15章 为OpenMIPS处理器移植μC/OS-II
  276. 15.1 为什么需要操作系统
  277. 1.魔幻家角色
  278. 2.管理者角色
  279. 15.2 嵌入式实时操作系统介绍
  280. 1.嵌入式操作系统
  281. 2.实时操作系统
  282. 15.3 μC/OS-II简介
  283. 15.4 μC/OS-II特点
  284. 1.提供源代码
  285. 2.可移植(Portable)
  286. 3.可固化(ROMable)
  287. 4.可裁剪(Scalable)
  288. 5.可剥夺型(Preemptive)
  289. 6.多任务
  290. 7.可确定性
  291. 8.任务栈
  292. 9.系统服务
  293. 10.中断管理
  294. 11.稳定性与可靠性
  295. 15.5 μC/OS-II的几个概念
  296. 15.6 μC/OS-II的基本功能
  297. 15.7 μC/OS-II的文件体系
  298. 15.8 μC/OS-II的移植条件
  299. 1.处理器的C编译器能产生可重入代码
  300. 2.用C语言可打开和关闭中断
  301. 3.处理器支持中断并且能产生定时中断
  302. 4.处理器支持能够容纳一定量数据的硬件堆栈
  303. 5.处理器有将堆栈指针和CPU其余寄存器读出和存储到堆栈(或内存)的指令
  304. 15.9 C语言中使用汇编代码
  305. 1.汇编语句模板
  306. 2.输出部分
  307. 3.输入部分
  308. 4.破坏描述部分
  309. 15.10 MIPS函数调用规范
  310. 1.使用堆栈传递参数
  311. 2.使用寄存器传递参数
  312. 1.参数传递示例
  313. 2.函数返回值示例
  314. 3.非叶子函数堆栈布局示例
  315. 4.叶子函数堆栈布局示例
  316. 15.11 μC/OS-II在OpenMIPS处理器上的移植
  317. 1.数据类型定义
  318. 2.进、出临界区的宏
  319. 3.定义堆栈生长方向
  320. 4.用于任务切换的宏定义
  321. 5.一些函数声明
  322. 1.异常处理例程
  323. 2.一些常数
  324. 3.函数OS_CPU_SR_Save
  325. 4.函数OS_CPU_SR_Restore
  326. 5.函数InterruptHandler
  327. 6.函数OSIntCtxSw
  328. 7.函数ExceptionHandler
  329. 8.函数OSStartHighRdy
  330. 9.函数TickInterruptClear
  331. 10.函数CoreTmrInit
  332. 11.函数TickISR
  333. 12.函数DisableInterruptSource
  334. 13.函数EnableInterruptSource
  335. 1.函数OSTaskStkInit
  336. 2.函数BSP_Interrupt_Handler
  337. 3.函数BSP_Exception_Handler
  338. 15.12 测试程序
  339. 15.13 编译指示文件的建立
  340. 1.新建链接脚本文件ram.ld
  341. 2.新建config.mk、Makefile文件
  342. 3.在Common目录下添加Makefile文件
  343. 4.在ucos目录下添加Makefile文件
  344. 5.在port目录下添加Makefile文件
  345. 15.14 OpenMIPS处理器运行移植后的μC/OS-II
  346. 15.15 本章小结
  347. 附录A 教学版OpenMIPS各个模块的接口说明
  348. A.1 PC模块接口说明
  349. A.2 IF/ID模块接口说明
  350. A.3 ID模块接口说明
  351. A.4 Regfile模块接口说明
  352. A.5 ID/EX模块接口说明
  353. A.6 EX模块接口说明
  354. A.7 DIV模块接口说明
  355. A.8 EX/MEM模块接口说明
  356. A.9 MEM模块接口说明
  357. A.10 MEM/WB模块接口说明
  358. A.11 CP0模块接口说明
  359. A.12 LLbit模块接口说明
  360. A.13 HILO模块接口说明
  361. A.14 CTRL模块接口说明
  362. 附录B OpenMIPS实现的所有指令及对应的机器码
  363. B.1 逻辑操作指令
  364. B.2 移位操作指令
  365. B.3 移动操作指令
  366. B.4 算术操作指令
  367. B.5 转移指令
  368. B.6 加载存储指令
  369. B.7 协处理器访问指令
  370. B.8 异常相关指令
  371. B.9 空指令及其他指令
  372. 参考文献
载入中

大家都喜欢