自己动手写CPU.pdf

自己动手写CPU.pdf
 

书籍描述

内容简介
《自己动手写CPU》内容简介:使用Verilog HDL 设计实现了一款兼容MIPS32指令集架构的处理器——OpenMIPS。OpenMIPS处理器具有两个版本,分别是教学版和实践版。教学版的主要设计思想是尽量简单,处理器的运行情况比较理想化,与教科书相似,便于使用其进行教学、学术研究和讨论,也有助于学生理解课堂上讲授的知识。实践版的设计目标是能完成特定功能,发挥实际作用。分为三篇。第一篇是理论篇,介绍了指令集架构、Verilog HDL的相关知识。第二篇是基础篇,采用增量模型,实现了教学版OpenMIPS处理器。首先实现了仅能执行一条指令的处理器,从这个最简单的情况出发,通过依次添加,实现逻辑操作指令、移位操作指令、空指令、移动操作指令、算术操作指令、转移指令、加载存储指令、协处理器访问指令、异常相关指令,最终实现了教学版OpenMIPS处理器。第三篇是进阶篇,通过为教学版OpenMIPS添加Wishbone总线接口,从而实现了实践版OpenMIPS处理器,并与SDRAM控制器、GPIO模块、Flash控制器、UART控制器、Wishbone总线互联矩阵等模块组成一个小型SOPC,然后下载到FPGA芯片以验证实现效果,最后为实践版OpenMIPS处理器移植了嵌入式实时操作系统μC/OS-II。
《自己动手写CPU》适合计算机专业的学生、FPGA开发人员、处理器设计者、嵌入式系统应用开发工程师、MIPS平台开发人员以及对处理器内部的实现感兴趣的读者阅读,也可以作为高等院校计算机原理、计算机体系结构等课程的实践参考书。

编辑推荐
《自己动手写CPU》编辑推荐:撕掉处理器“高大上”的标签,有助于深入理解计算机组成原理、计算机体系结构。从无到有、从小到大,介绍一款处理器的成长过程,同作者作品推荐:步步惊“芯”——软核处理器内部设计分析。

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

目录
第一篇 理论篇
第1章 处理器与MIPS2
1.1 计算机的简单模型2
1.1.1 计算机的简单组成模型2
1.1.2 计算机的简单使用模型3
1.2 架构与指令集4
1.2.1 CISC与RISC4
1.2.2 主要的几种ISA5
1.3 MIPS指令集架构的演变6
1.4 MIPS32指令集架构简介9
1.4.1 数据类型9
1.4.2 寄存器9
1.4.3 字节次序10
1.4.4 指令格式11
1.4.5 指令集11
1.4.6 寻址方式13
1.4.7 协处理器CP013
1.4.8 异常14
1.5 本书的目标与组织方式14
第2章 可编程逻辑器件与VerilogHDL16
2.1 可编程逻辑器件概述16
2.2 基于PLD的数字系统设计流程18
2.2.1 设计输入19
2.2.2 综合20
2.2.3 布局布线20
2.2.4 下载20
2.2.5 仿真20
2.2.6 工具介绍21
2.3 VerilogHDL简介21
2.4 VerilogHDL中模块的结构22
2.5 VerilogHDL基本要素24
2.5.1 常量24
2.5.2 变量声明与数据类型24
2.5.3 向量26
2.5.4 运算符26
2.6 VerilogHDL行为语句29
2.6.1 过程语句29
2.6.2 赋值语句31
2.6.3 条件语句32
2.6.4 循环语句34
2.6.5 编译指示语句35
2.6.6 行为语句的可综合性37
2.7 电路设计举例38
2.8 仿真41
2.8.1 系统函数42
2.8.2 TestBench43
2.8.3 ModelSim仿真45
2.9 本章小结48

第二篇 基础篇
第3章 教学版OpenMIPS处理器蓝图50
3.1 系统设计目标50
3.1.1 设计目标50
3.1.2 五级流水线50
3.1.3 指令执行周期52
3.2 教学版OpenMIPS处理器接口53
3.3 文件说明54
3.4 实现方法55
第4章 第一条指令ori的实现58
4.1 ori指令说明58
4.2 流水线结构的建立59
4.2.1 流水线的简单模型59
4.2.2 原始的OpenMIPS五级流水线结构60
4.2.3 一些宏定义62
4.2.4 取指阶段的实现63
4.2.5 译码阶段的实现65
4.2.6 执行阶段的实现74
4.2.7 访存阶段的实现78
4.2.8 回写阶段的实现81
4.2.9 顶层模块OpenMIPS的实现81
4.3 验证OpenMIPS实现效果85
4.3.1 指令存储器ROM的实现85
4.3.2 最小SOPC的实现87
4.3.3 编写测试程序88
4.3.4 建立TestBench文件89
4.3.5 使用ModelSim检验OpenMIPS实现效果90
4.4 MIPS编译环境的建立92
4.4.1 VisualBox的安装与设置93
4.4.2 GNU工具链的安装96
4.4.3 使用GNU工具进行编译97
4.4.4 使用GNU工具进行链接99
4.4.5 得到ROM初始化文件102
4.4.6 编写Makefile文件103
4.5 第一条指令实现小结105
第5章 逻辑、移位操作与空指令的实现107
5.1 流水线数据相关问题107
5.2 OpenMIPS对数据相关问题的解决措施111
5.3 测试数据相关问题的解决效果115
5.4 逻辑、移位操作与空指令说明115
5.5 修改OpenMIPS以实现逻辑、移位操作与空指令119
5.5.1 修改译码阶段的ID模块120
5.5.2 修改执行阶段的EX模块127
5.6 测试程序1——测试逻辑操作实现效果129
5.7 测试程序2——测试移位操作与空指令实现效果130
5.8 小结131
第6章 移动操作指令的实现132
6.1 移动操作指令说明132
6.2 移动操作指令实现思路133
6.2.1 新的数据相关情况的解决135
6.2.2 系统结构的修改136
6.3 修改OpenMIPS以实现移动操作指令137
6.3.1 HI、LO寄存器的实现137
6.3.2 修改译码阶段的ID模块138
6.3.3 修改执行阶段141
6.3.4 修改访存阶段146
6.3.5 修改回写阶段149
6.3.6 修改OpenMIPS顶层模块149
6.4 测试程序150
第7章 算术操作指令的实现152
7.1 简单算术操作指令说明153
7.2 简单算术操作指令实现思路156
7.3 修改OpenMIPS以实现简单算术操作指令157
7.3.1 修改译码阶段的ID模块157
7.3.2 修改执行阶段的EX模块164
7.4 测试简单算术操作指令实现效果171
7.5 流水线暂停机制的设计与实现174
7.5.1 流水线暂停机制的设计174
7.5.2 流水线暂停机制的实现175
7.6 乘累加、乘累减指令说明180
7.7 乘累加、乘累减指令实现思路181
7.8 修改OpenMIPS以实现乘累加、乘累减指令182
7.8.1 修改译码阶段的ID模块182
7.8.2 修改执行阶段的EX模块184
7.8.3 修改EX/MEM模块189
7.8.4 修改OpenMIPS模块190
7.9 测试乘累加、乘累减指令实现效果190
7.10 除法指令说明191
7.11 除法指令实现思路192
7.11.1 试商法192
7.11.2 实现思路193
7.11.3 系统结构的修改193
7.12 修改OpenMIPS以实现除法指令194
7.12.1 增加DIV模块194
7.12.2 修改译码阶段的ID模块199
7.12.3 修改执行阶段的EX模块200
7.12.4 修改OpenMIPS模块204
7.13 测试除法指令实现效果204
7.14 数据流图的修改205
第8章 转移指令的实现206
8.1 延迟槽206
8.2 转移指令说明207
8.3 转移指令实现思路210
8.3.1 实现思路210
8.3.2 数据流图的修改210
8.3.3 系统结构的修改211
8.4 修改OpenMIPS以实现转移指令212
8.4.1 修改取指阶段的PC模块212
8.4.2 修改译码阶段213
8.4.3 修改执行阶段的EX模块223
8.4.4 修改OpenMIPS模块225
8.5 测试转移指令的实现效果225
8.5.1 测试跳转指令225
8.5.2 测试分支指令227
第9章 加载存储指令的实现230
9.1 加载存储指令说明230
9.1.1 加载指令lb、lbu、lh、lhu、lw说明230
9.1.2 存储指令sb、sh、sw说明231
9.1.3 加载存储指令用法示例232
9.1.4 加载指令lwl、lwr说明233
9.1.5 存储指令swl、swr说明235
9.2 加载存储指令实现思路238
9.2.1 数据流图的修改239
9.2.2 系统结构的修改240
9.3 修改OpenMIPS以实现加载存储指令240
9.3.1 修改译码阶段240
9.3.2 修改执行阶段247
9.3.3 修改访存阶段249
9.3.4 修改OpenMIPS顶层模块260
9.4 修改最小SOPC261
9.4.1 添加数据存储器RAM262
9.4.2 修改最小SOPC264
9.5 测试程序265
9.6 链接加载指令ll、条件存储指令sc说明267
9.7 ll、sc指令实现思路269
9.7.1 ll、sc指令实现思路269
9.7.2 数据流图的修改270
9.7.3 系统结构的修改271
9.8 修改OpenMIPS以实现ll、sc指令271
9.8.1 LLbit寄存器的实现271
9.8.2 修改译码阶段的ID模块273
9.8.3 修改访存阶段275
9.8.4 修改OpenMIPS模块279
9.9 测试ll、sc指令实现效果279
9.10 load相关问题281
9.10.1 load相关问题介绍281
9.10.2 解决方法281
9.11 修改OpenMIPS以解决load相关问题283
9.11.1 修改译码阶段的ID模块283
9.11.2 修改OpenMIPS模块284
9.12 测试load相关问题解决效果285
9.13 小结286
第10章 协处理器访问指令的实现287
10.1 协处理器介绍287
10.2 协处理器CP0中的寄存器288
10.3 协处理器CP0的实现295
10.4 协处理器访问指令说明300
10.5 协处理器访问指令实现思路300
10.5.1 实现思路300
10.5.2 数据流图的修改301
10.5.3 系统结构的修改301
10.6 修改OpenMIPS以实现协处理器访问指令303
10.6.1 修改译码阶段303
10.6.2 修改执行阶段305
10.6.3 修改访存阶段311
10.6.4 修改OpenMIPS模块314
10.7 测试程序314
第11章 异常相关指令的实现316
11.1 MIPS32架构中定义的异常类型316
11.2 精确异常318
11.3 异常处理过程319
11.4 异常相关指令介绍321
11.4.1 自陷指令321
11.4.2 系统调用指令syscall324
11.4.3 异常返回指令eret325
11.5 异常处理实现思路325
11.5.1 实现思路325
11.5.2 修改数据流图326
11.5.3 修改系统结构326
11.6 修改OpenMIPS以实现异常处理328
11.6.1 修改取指阶段328
11.6.2 修改译码阶段330
11.6.3 修改执行阶段339
11.6.4 修改访存阶段346
11.6.5 修改协处理器CP0352
11.6.6 修改控制模块CTRL355
11.6.7 修改OpenMIPS357
11.7 再次修改最小SOPC358
11.8 测试程序359
11.8.1 测试程序1——测试系统调用异常359
11.8.2 测试程序2——测试自陷异常361
11.8.3 测试程序3——测试时钟中断364
11.9 教学版OpenMIPS处理器实现小结366

第三篇 进阶篇
第12章 实践版OpenMIPS处理器设计与实现368
12.1 实践版OpenMIPS处理器的设计目标368
12.2 Wishbone总线介绍370
12.2.1 Wishbone总线接口说明370
12.2.2 Wishbone总线单次读操作的过程372
12.2.3 Wishbone总线单次写操作的过程373
12.2.4 SEL_O/SEL_I信号说明374
12.3 实践版OpenMIPS处理器接口375
12.4 实践版OpenMIPS处理器的实现思路376
12.5 从教学版OpenMIPS到实践版OpenMIPS378
12.5.1 Wishbone总线接口模块的实现378
12.5.2 修改CTRL模块384
12.5.3 修改OpenMIPS顶层模块386
12.6 实践版OpenMIPS处理器实现小结386
第13章 基于实践版OpenMIPS的小型SOPC387
13.1 小型SOPC的结构387
13.2 Wishbone总线互联矩阵WB_CONMAX388
13.3 GPIO390
13.4 UART控制器392
13.4.1 UART简介392
13.4.2 UART16550IP核介绍394
13.5 Flash控制器398
13.5.1 Flash简介398
13.5.2 Flash控制器的设计399
13.5.3 Flash控制器的实现400
13.6 SDRAM控制器403
13.6.1 SDRAM简介403
13.6.2 SDRAMCONTROLLERIP核409
13.7 实现基于实践版OpenMIPS的小型SOPC412
13.8 本章小结423
第14章 验证实践版OpenMIPS处理器424
14.1 DE2平台简介424
14.2 测试需要的硬件连接425
14.3 QuartusII工程建立426
14.4 测试步骤说明430
14.5 测试一——GPIO实验431
14.5.1 测试内容431
14.5.2 测试程序431
14.5.3 编译测试程序432
14.5.4 将测试程序写入Flash芯片433
14.5.5 下载小型SOPC到DE2435
14.5.6 测试效果435
14.6 测试二——UART实验435
14.6.1 测试内容435
14.6.2 测试程序436
14.6.3 测试效果438
14.7 测试三——模拟操作系统的加载过程439
14.7.1 测试内容439
14.7.2 测试程序BootLoader439
14.7.3 测试程序SimpleOS443
14.7.4 将测试程序写入Flash446
14.7.5 测试效果448
14.8 本章小结449
第15章 为OpenMIPS处理器移植μC/OS-II450
15.1 为什么需要操作系统450
15.2 嵌入式实时操作系统介绍451
15.3 μC/OS-II简介452
15.4 μC/OS-II特点452
15.5 μC/OS-II的几个概念454
15.5.1 任务454
15.5.2 任务调度456
15.5.3 任务切换456
15.5.4 μC/OS-II的中断处理457
15.5.5 时钟节拍457
15.5.6 μC/OS-II的初始化458
15.5.7 μC/OS-II的启动458
15.6 μC/OS-II的基本功能458
15.6.1 任务间的通信与同步459
15.6.2 任务管理459
15.6.3 时间管理459
15.6.4 内存管理460
15.7 μC/OS-II的文件体系460
15.8 μC/OS-II的移植条件461
15.9 C语言中使用汇编代码463
15.10 MIPS函数调用规范465
15.10.1 寄存器使用规范465
15.10.2 参数传递466
15.10.3 函数返回值466
15.10.4 堆栈布局467
15.10.5 示例468
15.11 μC/OS-II在OpenMIPS处理器上的移植470
15.11.1 文件目录的建立470
15.11.2 修改os_cpu.h文件473
15.11.3 修改os_cpu_a.S文件474
15.11.4 修改os_cpu_c.c文件496
15.12 测试程序500
15.12.1 创建openmips.h文件500
15.12.2 创建openmips.c文件502
15.13 编译指示文件的建立508
15.14 OpenMIPS处理器运行移植后的μC/OS-II515
15.15 本章小结516
附录A 教学版OpenMIPS各个模块的接口说明517
A.1 PC模块接口说明517
A.2 IF/ID模块接口说明518
A.3 ID模块接口说明518
A.4 Regfile模块接口说明520
A.5 ID/EX模块接口说明520
A.6 EX模块接口说明521
A.7 DIV模块接口说明524
A.8 EX/MEM模块接口说明525
A.9 MEM模块接口说明527
A.10 MEM/WB模块接口说明529
A.11 CP0模块接口说明530
A.12 LLbit模块接口说明532
A.13 HILO模块接口说明532
A.14 CTRL模块接口说明533
附录B OpenMIPS实现的所有指令及对应的机器码534
B.1 逻辑操作指令534
B.2 移位操作指令534
B.3 移动操作指令535
B.4 算术操作指令535
B.5 转移指令536
B.6 加载存储指令536
B.7 协处理器访问指令537
B.8 异常相关指令537
B.9 空指令及其他指令537
参考文献538

序言
自己动手写处理器?
自己动手写处理器!
没错,您手上拿着的就是介绍如何实现处理器的书,通过阅读本书,您可以实现世界上独一无二、独属于您的处理器。
吹牛?
噢,No,理工科学生不打诳语。
不信?
…… 那就请您阅读本书。
写作背景
自1971年世界上第一款单芯片微处理器4004诞生已逾40多年,使用“日新月异”来形容这40多年处理器的发展变化亦不为过,无论是速度、集成度,还是架构等许多方面都有了前人难以想象的变化。不过可惜的是,处理器设计制造一直都是高科技行业,轻易无法涉足。大多数人对处理器的直观印象就是一个银白色的小芯片,有许多管脚,至于里面是如何工作的,则不甚了解,更遑论自己制作处理器了。
幸运的是,在处理器发展的同时,可编程逻辑器件也在持续发展。可编程逻辑器件不仅是技术的革新,也带来观念的革新、设计流程的革新。如今可以通过编写代码在可编程逻辑器件上实现十分复杂的电路设计,比如处理器。于是,普罗大众也能有机会了解处理器内部实现原理,甚至参与处理器的设计、研发。
实际上,目前已经有很多可以下载到可编程逻辑器件上运行的处理器,这些处理器称为软核处理器,比如:NiosII、OR1200、LEON3、OpenSparc等,这些软核处理器有的是开源的、有的不是开源的。笔者在前期深入阅读了几款开源软核处理器的代码,包括:OC8051、OR1200、LEON3。其中,OC8051是OpenCores提供的一款8位、两级流水线处理器,与Intel 8051兼容,是CISC(Complex Instruction Set Computer)类型,采用Verilog HDL编写代码。OR1200是OpenCores提供的一款32位、五级流水线处理器,是RISC(Reduced Instruction Set Computer)类型,也采用Verilog HDL编写代码。LEON3是由Gaisler Research公司设计发布的一款32位、七级流水线处理器,也是RISC类型,但是采用的是VHDL编写代码。
通过阅读上述开源软核处理器的代码,一方面消除了笔者对处理器的神秘印象,另一方面也激发笔者强烈的创作冲动,陆游曾言:纸上得来终觉浅,绝知此事要躬行,是啊,为何不自己也写一个处理器,于是世间又多了一款开源处理器OpenMIPS。OpenMIPS是具有哈佛结构的32位、五级流水线标量处理器,兼容MIPS32体系结构,这样可以使用现有的MIPS编译开发环境。分为教学版、实践版两个版本,每个版本都使用VHDL、Verilog HDL两种语言编写。
本书以Verilog HDL编写的版本为例,详细介绍了OpenMIPS从无到有、从小到大、一步一步成长完善的过程。
写作目的
l 撕掉处理器贴着的“高大上”标签
处理器一贯被人们贴上“高大上”、“高科技”诸如此类的标签,贴标签的原因就在于人们对此不了解,越不了解越觉得神秘,越觉得神秘越不想了解,如此,“高大上”的标签算是贴牢了。本书的目的之一就是帮助读者改变这种固有的偏见,从本质上认识处理器,撕掉标签。简单来说,处理器的作用就是识别0、1编码,也就是识别指令,据此进行各种运算和数据处理。处理器只能计算小学数学课堂上讲授的四则运算,再加上一些并不复杂的与、或、非等逻辑运算,其余诸如平方、开方、微分、积分等等都是做不了的。是不是很简单?
l 对现有处理器相关书籍的补充
翻看现有的处理器相关书籍,会有两个体会,一个体会是大多数书籍讲授的理论部分太多、实践部分太少。过多的理论、过少的实践,会使得读者知其然,不知其所以然。第二个体会是有少部分书籍讲授处理器实现,但是介绍的方式不太易懂,读者需要对处理器有一定了解之后才能阅读此类书籍。因此,笔者想结合OpenMIPS介绍处理器实现,本书完全按照OpenMIPS的实现过程讲解,从零起步,遇到什么问题就解决什么问题,笔者认为这样易于理解。
l 抛砖引玉
高手在民间,此言不虚,笔者写作此书的第三个目的就是抛砖引玉,希望有更多人士能够参与维护和改进OpenMIPS,为其添加更多的功能,或者改善性能。当然,也希望出现更多类似的软核处理器,这样,大家可以相互学习、相互探讨、取长补短、共同进步。
适合谁读
适合对处理器内部实现有着强烈好奇心的朋友阅读,通过本书介绍的OpenMIPS处理器的实现过程,您将全方位了解32位RISC处理器内部设计。
适合不满足于教科书的同学阅读,本书可以作为您的实践参考书,帮助您理解书本上抽象的概念,同时培养动手能力。
适合正在从事软核处理器开发、设计的朋友阅读,本书将给您一些经验、一些好的方法,帮助您事半功倍。
适合正在从事嵌入式开发的朋友阅读,本书对处理器的一些介绍,将有助于嵌入式开发。
内容安排
全书共15章,分为三部分,第一部分是理论篇,包含第1-2章,介绍了指令集架构、Verilog HDL的相关知识。第二部分是基础篇,包含第3-11章,采用增量模型,实现了教学版OpenMIPS处理器。第三部分是进阶篇,包含第12-15章,实现了实践版OpenMIPS处理器,并为其移植了嵌入式实时操作系统μC/OS-II。每章的主要内容如下。
l 第一部分 理论篇
第1章给出了计算机的简单组成模型、简单使用模型,对比了RISC与CISC,说明了指令集架构的作用,并列举了目前几种主要的指令集架构,由于OpenMIPS采用的是MIPS32指令集架构,所以本章后半部分重点介绍了MIPS32指令集架构。
第2章介绍了FPGA、Verilog HDL的基础知识,FPGA是可编程逻辑器件的一种,本书的实践版OpenMIPS处理器就将在FPGA上运行。
l 第二部分 基础篇
第3章介绍了教学版OpenMIPS处理器的设计蓝图,包括设计目标、处理器接口,以及最终完成时,组成OpenMIPS的各个模块的作用,力图使读者有一个整体认识。并在本章详述了OpenMIPS处理器的实现方法。
第4章实现了OpenMIPS处理器的第一条指令ori,之所以选择这条指令作为我们实现的第一条指令,就因为它足够简单,指令ori用来实现逻辑“或”运算,通过这条简单指令的实现,初步建立了OpenMIPS的五级流水线结构,后续章节实现其余指令的时候,都是在这个初步建立的流水线结构基础上进行扩充。本章还建立了用于测试的小型SOPC,并通过ModelSim仿真验证ori指令、五级流水线实现的正确与否。
第5章讨论并解决了流水线数据相关问题,然后修改前一章的OpenMIPS,添加实现了MIPS32指令集架构中定义的逻辑、移位操作与空指令。
第6章添加实现了MIPS32指令集架构中定义的移动操作指令。
第7章添加实现了MIPS32指令集架构中定义的算术操作指令。
第8章添加实现了MIPS32指令集架构中定义的转移指令,OpenMIPS支持延迟转移。
第9章添加实现了MIPS32指令集架构中定义的加载存储指令。
第10章添加实现了MIPS32指令集架构中定义的协处理器CP0,以及协处理器访问指令。
第11章添加实现了MIPS32指令集架构中定义的异常相关指令,并实现了异常处理。
在每一类指令的实现过程中,都是先介绍该类指令的格式、作用、用法,然后介绍实现思路,接着通过修改代码实现该类指令,最后,编写测试程序,使用仿真的方式验证实现的正确性。
l 第三部分 进阶篇
第12章在教学版OpenMIPS处理器的基础上,通过添加Wishbone总线接口模块,实现了实践版OpenMIPS处理器。
第13章设计实现了基于实践版OpenMIPS处理器的小型可编程片上系统SOPC。该SOPC包括GPIO、UART控制器、Flash控制器、SDRAM控制器等模块,这些模块都具有Wishbone总线接口,与OpenMIPS处理器一起挂接在Wishbone总线互联矩阵上。
第14章将上一章实现的小型SOPC下载到实际的硬件平台上,编写测试程序,验证实践版OpenMIPS处理器实现的正确性。
第15章介绍了嵌入式实时操作系统μC/OS-II,并将其移植到本书设计的OpenMIPS处理器上,进一步验证了实践版OpenMIPS处理器实现的正确性,也为OpenMIPS处理器发挥实际作用奠定了基础。
本书特色
l 从无到有、从小到大,介绍一款处理器的成长过程
在本书之前已有介绍软核处理器实现的书籍,这些书在介绍实现方法时有一个共同点:一次考虑所有的指令、所有的情况,然后给出代码。笔者认为这不是一种读者易于接受的方法,而且这也可能不是作者实现处理器时采用的方法。在本书中,笔者借鉴了软件开发中的“增量模型”,使用了一种完全不同的实现方法:先考虑最简单的情况,给出代码,然后考虑稍微多一点的情况,修改、补充代码,随着考虑情况的增多,不停地修改、补充代码,最终,实现需求。
l 教学、实践兼顾
OpenMIPS处理器分为教学版、实践版。
教学版的主要设想是尽量简单,比如:在一个时钟周期内可以取到指令,完成存储、加载数据,这样处理器的运行情况(比如:流水线的运行)就比较理想化,与教科书相似,代码也很清晰简单,便于使用其进行教学、学术研究和讨论,也有助于读者理解计算机组成原理、计算机体系结构等课程的教科书上讲授的知识。
实践版的主要设想是使OpenMIPS成为一个实际可用的处理器,能够下载到可编程逻辑器件上,运行实际有用的程序,为此,添加了Wishbone总线接口,这样就能方便的利用各种已有的SDRAM、Flash、GPIO、UART、LCD等模块控制器,组成一个SOPC,完成特定功能,进一步还可为其移植操作系统。
光盘内容
本书附带光盘提供了OpenMIPS的所有源代码,以及一些开发工具,详情如下。
l Code文件夹
提供了本书每一章涉及的OpenMIPS源代码、测试程序。
l tools文件夹
提供了GNU工具链的安装文件,以及一个小工具Bin2Mem.exe,该工具用来将二进制文件转化为可以用于ModelSim仿真的格式。
l Doc文件夹
提供了本书使用到的一些IP核的说明手册,包括UART控制器、SDRAM控制器、GPIO模块等。还提供了FPGA开发平台DE2的说明手册。
l DE2文件夹
提供了用来将程序写入DE2上Flash芯片的工具,在第14-15章会使用到。
致谢
感谢OC8051、OR1200、LEON3的开发者,正是你们的辛苦工作、无私奉献,使得我们有机会领略、学习这些优秀的作品,向你们致敬!
笔者是第二次与博文视点合作,一如既往的敏捷、迅速、干练,在此特别感谢孙学瑛老师,孙老师以专业的眼光审阅了全书,提出许多宝贵意见,为本书的顺利出版耗费了不少心力。
感谢我的好友张世伟老师,为我提供了DE2开发平台。
最后,感谢我的爸爸、妈妈、姐姐、姐夫,以及可爱的外甥女,任何成绩的取得都离不开家人的身影,谢谢你们!
笔者学识有限,尽管已通读数次,但仍不能保证书中无一纰漏,欢迎各位读者朋友对本书提出批评、建议,可以通过邮箱leishangwen@163.com与笔者交流。
写作体会
在实现OpenMIPS处理器的过程中,笔者深刻体会到了“罗马不是一天建成的”这句话,外表看起来巨大、庞杂的罗马,也是通过人们一步一步、一天一天、一点一点建成的,处理器也是如此,读者首先不要被处理器的神秘吓到,从最简单的地方入手,逐步增加功能、完善设计,一行代码一行代码的书写,不仅要有实现处理器的远大目标,还要确立切实可操作的短期目标,比如本周实现除法指令、下周实现转移指令,诸如此类,等有一天你突然回头,会发现,原来已经走了那么远,实现了那么多功能。李白有诗云:两岸猿声啼不住,轻舟已过万重山。当是此意。
处理器实现了,但要把它的实现过程明白的表达出来,让读者理解,则又是一件难事。笔者从开始写作到最终完稿的这一过程中,一直承受着巨大的煎熬,几度欲放弃写作,所幸的是最终坚持了下来。
最后,我想对各位读者说。
一个人的旅行是孤单的
一个人的冬季是寒冷的
但是
一个人的处理器是骄傲的
让我们骄傲一次

购买书籍

当当网购书 京东购书 卓越购书

PDF电子书下载地址

相关书籍

搜索更多