免费分享三本FPGA设计CPU的书籍-FPGA CPLD资料源码分享论坛-FPGA CPLD-ChipDebug

免费分享三本FPGA设计CPU的书籍

该帖子部分内容已隐藏
付费阅读
3积分
此内容为付费阅读,请付费后查看

一直以来CPU内部是绝大多数IT工程师难以触及的领域。纵使学习过计算机架构相关课程,自己动手实现CPU也始终遥不可及,因为这涉及计算机系统的最底层——芯片设计。

而近年来FPGA芯片产品的发展与普及打破了这一阻碍,利用内部电路可重编程的FPGA,几乎可以实现任何逻辑电路,自然也包括CPU,自然也会有相关的电子书籍。

01
自己动手写CPU

本书使用Verilog HDL 设计实现了一款兼容MIPS32指令集架构的处理器——OpenMIPS。OpenMIPS 处理器具有两个版本,分别是教学版和实践版。教学版的主要设计思想是尽量简单,处理器的运行情况比较理想化。实践版的设计目标是能完成特定功能,发挥实际作用。

本书分为三篇,第一篇是理论篇,介绍了指令集架构、Verilog HDL的相关知识。

第二篇是基础篇,采用增量模型,实现了教学版OpenMIPS处理器。首先实现了仅能执行一条指令的处理器,从这个最简单的情况出发,通过依次添加,实现逻辑操作指令、移位操作指令、空指令、移动操作指令、算术操作指令、转移指令、加载存储指令、协处理器访问指令、异常相关指令,最终实现了教学版OpenMIPS处理器。

第三篇是进阶篇,通过为教学版OpenMIPS添加Wishbone总线接口,从而实现了实践版OpenMIPS处理器,并与SDRAM控制器、GPIO模块、Flash控制器、UART控制器、Wishbone总线互联矩阵等模块组成一个小型SOPC,然后下载到FPGA芯片以验证实现效果,最后为实践版OpenMIPS处理器移植了嵌入式实时操作系统μC/OS-II。

图片[1]-免费分享三本FPGA设计CPU的书籍-FPGA CPLD资料源码分享论坛-FPGA CPLD-ChipDebug

图1 自己动手写CPU

本书目录如下:

第一篇 理论篇

第1章 处理器与MIPS 2

1.1 计算机的简单模型 2

1.1.1 计算机的简单组成模型 2

1.1.2 计算机的简单使用模型 3

1.2 架构与指令集 4

1.2.1 CISC与RISC 4

1.2.2 主要的几种ISA 5

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 协处理器CP0 13

1.4.8 异常 14

1.5 本书的目标与组织方式 14

第2章 可编程逻辑器件与Verilog HDL 16

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 Verilog HDL简介 21

2.4 Verilog HDL中模块的结构 22

2.5 Verilog HDL基本要素 24

2.5.1 常量 24

2.5.2 变量声明与数据类型 24

2.5.3 向量 26

2.5.4 运算符 26

2.6 Verilog HDL行为语句 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 Test Bench 43

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 建立Test Bench文件 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 修改最小SOPC 261

9.4.1 添加数据存储器RAM 262

9.4.2 修改最小SOPC 264

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 系统调用指令syscall 324

11.4.3 异常返回指令eret 325

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 修改协处理器CP0 352

11.6.6 修改控制模块CTRL 355

11.6.7 修改OpenMIPS 357

11.7 再次修改最小SOPC 358

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到实践版OpenMIPS 378

12.5.1 Wishbone总线接口模块的实现 378

12.5.2 修改CTRL模块 384

12.5.3 修改OpenMIPS顶层模块 386

12.6 实践版OpenMIPS处理器实现小结 386

第13章 基于实践版OpenMIPS的小型SOPC 387

13.1 小型SOPC的结构 387

13.2 Wishbone总线互联矩阵WB_CONMAX 388

13.3 GPIO 390

13.4 UART控制器 392

13.4.1 UART简介 392

13.4.2 UART16550 IP核介绍 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 SDRAM CONTROLLER IP核 409

13.7 实现基于实践版OpenMIPS的小型SOPC 412

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到DE2 435

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 测试程序BootLoader 439

14.7.3 测试程序SimpleOS 443

14.7.4 将测试程序写入Flash 446

14.7.5 测试效果 448

14.8 本章小结 449

第15章 为OpenMIPS处理器移植μC/OS-II 450

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-II 515

15.15 本章小结 516

附录A 教学版OpenMIPS各个模块的接口说明 517

自己动手写CPU链接:

02
手把手教你设计CPU:RISC-V处理器篇

本书是一本介绍通用CPU设计的入门书,以通俗的语言系统介绍了CPU和RISC-V架构,力求为读者揭开CPU设计的神秘面纱,打开计算机体系结构的大门。

本书共分为四部分,第一部分是CPU与RISC-V的综述,帮助初学者对CPU和RISC-V快速地建立起认识。第二部分讲解如何使用Verilog设计CPU,使读者掌握处理器核的设计精髓。第三部分主要介绍蜂鸟E203配套的SoC和软件平台,使读者实现蜂鸟E203 RISC-V处理器在FPGA原型平台上的运行。第四部分是附录,介绍了RISC-V指令集架构,辅以作者加入的背景知识解读和注解,以便于读者理解。

图片[2]-免费分享三本FPGA设计CPU的书籍-FPGA CPLD资料源码分享论坛-FPGA CPLD-ChipDebug

图2 手把手教你设计 CPU:RISC-V处理器篇

第1章一文读懂CPU之三生三世2

1.1眼看他起高楼,眼看他宴宾客,眼看他楼塌了——CPU众生相3

1.1.1ISA——CPU的灵魂4

1.1.2CISC与RISC5

1.1.332位与64位架构6

1.1.4ISA众生相6

1.1.5CPU的领域之分10

1.2ISA请扛起这口锅——为什么国产CPU尚未足够成功12

1.2.1MIPS系——龙芯和君正12

1.2.2×86系——北大众志、兆芯和海光13

1.2.3Power系——中晟宏芯13

1.2.4Alpha系——申威14

1.2.5ARM系——飞腾、华为海思、展讯和华芯通14

1.2.6背锅侠ISA15

1.3人生已是如此艰难,你又何必拆穿——CPU从业者的无奈17

1.4无敌是多么寂寞——ARM统治着的世界18

1.4.1独乐乐与众乐乐——ARM公司的盈利模式18

1.4.2小个子有大力量——无处不在的Cortex-M系列21

1.4.3移动王者——Cortex-A系列在手持设备领域的巨大成功23

1.4.4进击的巨人——ARM进军PC与服务器领域的雄心25

1.5东边日出西边雨,道是无晴却有晴——RISC-V登场25

1.6原来你是这样的“薯片”——ARM的免费计划28

1.7旧时王谢堂前燕,飞入寻常百姓家——你也可以设计自己的处理器28

第2章大道至简——RISC-V架构之魂29

2.1简单就是美——RISC-V架构的设计哲学30

2.1.1无病一身轻——架构的篇幅30

2.1.2能屈能伸——模块化的指令集32

2.1.3浓缩的都是精华——指令的数量32

2.2RISC-V指令集架构简介33

2.2.1模块化的指令子集33

2.2.2可配置的通用寄存器组34

2.2.3规整的指令编码34

2.2.4简洁的存储器访问指令34

2.2.5高效的分支跳转指令35

2.2.6简洁的子程序调用36

2.2.7无条件码执行37

2.2.8无分支延迟槽37

2.2.9零开销硬件循环38

2.2.10简洁的运算指令38

2.2.11优雅的压缩指令子集39

2.2.12特权模式40

2.2.13CSR寄存器40

2.2.14中断和异常40

2.2.15矢量指令子集40

2.2.16自定制指令扩展41

2.2.17总结与比较41

2.3RISC-V软件工具链42

2.4RISC-V和其他开放架构有何不同44

2.4.1平民英雄——OpenRISC44

2.4.2豪门显贵——SPARC44

2.4.3名校优生——RISC-V45

第3章乱花渐欲迷人眼——盘点RISC-V商业版本与开源版本46

3.1各商业版本与开源版本综述47

3.1.1RocketCore(开源)47

3.1.2BOOMCore(开源)49

3.1.3FreedomSoC(开源)50

3.1.4LowRISCSoC(开源)50

3.1.5PULPinoCoreandSoC(开源)50

3.1.6PicoRV32Core(开源)51

3.1.7SCR1Core(开源)51

3.1.8ORCACore(开源)51

3.1.9AndesCore(商业IP)52

3.1.10MicrosemiCore(商业IP)52

3.1.11CodasipCore(商业IP)53

3.1.12蜂鸟E200Core与SoC(开源)53

3.2总结53

第4章开源RISC-V——蜂鸟E200系列超低功耗Core与SoC54

4.1与众不同的蜂鸟E200处理器55

4.2蜂鸟E200简介——蜂鸟虽小,五脏俱全56

4.3蜂鸟E200型号系列57

4.4蜂鸟E200性能指标58

4.5蜂鸟E200配套SoC59

4.6蜂鸟E200配置选项60

第二部分手把手教你使用Verilog设计CPU

第5章先见森林,后观树木——蜂鸟E200设计总览和顶层介绍65

5.1处理器硬件设计概述66

5.1.1架构和微架构66

5.1.2CPU、处理器、Core和处理器核66

5.1.3处理器设计和验证的特点66

5.2蜂鸟E200处理器核设计哲学67

5.3蜂鸟E200处理器核RTL代码风格介绍68

5.3.1使用标准DFF模块例化生成寄存器68

5.3.2推荐使用assign语法替代if-else和case语法70

5.3.3其他若干注意事项71

5.3.4小结72

5.4蜂鸟E200模块层次划分72

5.5蜂鸟E200处理器核源代码73

5.6蜂鸟E200处理器核配置选项73

5.7蜂鸟E200处理器核支持的RISC-V指令子集74

5.8蜂鸟E200处理器流水线结构74

5.9蜂鸟E200处理器核顶层接口介绍74

5.10总结77

第6章流水线不是流水账——蜂鸟E200流水线介绍78

6.1处理器流水线概述79

6.1.1从经典的五级流水线说起79

6.1.2可否不要流水线——流水线和状态机的关系81

6.1.3深处种菱浅种稻,不深不浅种荷花——流水线的深度81

6.1.4向上生长——越来越深的流水线82

6.1.5向下生长——越来越浅的流水线83

6.1.6总结83

6.2处理器流水线中的乱序83

6.3处理器流水线中的反压84

6.4处理器流水线中的冲突84

6.4.1流水线中的资源冲突84

6.4.2流水线中的数据冲突85

6.5蜂鸟E200处理器的流水线86

6.5.1流水线总体结构86

6.5.2流水线中的冲突87

6.6总结87

第7章万事开头难——一切从取指令开始88

7.1取指概述89

7.1.1取指特点89

7.1.2如何快速取指90

7.1.3如何处理非对齐指令91

7.1.4如何处理分支指令92

7.2RISC-V架构特点对于取指的简化97

7.2.1规整的指令编码格式97

7.2.2指令长度指示码放于低位97

7.2.3简单的分支跳转指令98

7.2.4没有分支延迟槽指令100

7.2.5提供明确的静态分支预测依据100

7.2.6提供明确的RAS依据101

7.3蜂鸟E200处理器的取指实现101

7.3.1IFU总体设计思路102

7.3.2Mini-Decode103

7.3.3Simple-BPU分支预测105

7.3.4PC生成109

7.3.5访问ITCM和BIU111

7.3.6ITCM115

7.3.7BIU116

7.4总结116

第8章一鼓作气,执行力是关键——执行117

8.1执行概述118

8.1.1指令译码118

8.1.2指令执行118

8.1.3流水线的冲突119

8.1.4指令的交付119

8.1.5指令发射、派遣、执行、写回的顺序119

8.1.6分支解析121

8.1.7小结121

8.2RISC-V架构特点对于执行的简化121

8.2.1规整的指令编码格式122

8.2.2优雅的16位指令122

8.2.3精简的指令个数122

8.2.4整数指令都是两操作数122

8.3蜂鸟E200处理器的执行实现123

8.3.1执行指令列表123

8.3.2EXU总体设计思路123

8.3.3译码124

8.3.4整数通用寄存器组130

8.3.5CSR寄存器133

8.3.6指令发射派遣134

8.3.7流水线冲突、长指令和OITF139

8.3.8ALU145

8.3.9高性能乘除法157

8.3.10浮点单元158

8.3.11交付159

8.3.12写回159

8.3.13协处理器扩展160

8.3.14小结160

第9章善始者实繁,克终者盖寡——交付161

9.1处理器交付、取消、冲刷162

9.1.1处理器交付、取消、冲刷简介162

9.1.2处理器交付常见实现策略163

9.2RISC-V架构特点对于交付的简化164

9.3蜂鸟E200处理器交付硬件实现164

9.3.1分支预测指令的处理165

9.3.2中断和异常的处理168

9.3.3多周期执行指令的交付169

9.3.4小结169

0章让子弹飞一会儿——写回170

10.1处理器的写回171

10.1.1处理器写回功能简介171

10.1.2处理器写回常见策略171

10.2蜂鸟E200处理器的写回硬件实现171

10.2.1终写回仲裁172

10.2.2OITF和长指令写回仲裁174

10.2.3小结177

1章哈弗还是比亚迪——存储器架构178

11.1存储器架构概述179

11.1.1谁说处理器要有缓存179

11.1.2处理器要有存储器180

11.1.3ITCM和DTCM182

11.2RISC-V架构特点对于存储器访问指令的简化183

11.2.1仅支持小端格式183

11.2.2无地址自增自减模式183

11.2.3无“一次读多个数据”和“一次写多个数据”指令183

11.3RISC-V架构的存储器相关指令184

11.3.1Load和Store指令184

11.3.2Fence指令184

11.3.3“A”扩展指令184

11.4蜂鸟E200处理器存储器子系统硬件实现185

11.4.1存储器子系统总体设计思路185

11.4.2AGU186

11.4.3LSU190

11.4.4ITCM和DTCM192

11.4.5“A”扩展指令处理195

11.4.6Fence与Fence.I指令处理200

11.4.7BIU202

11.4.8ECC202

11.4.9小结202

2章黑盒子的窗口——总线接口单元BIU203

12.1片上总线协议概述204

12.1.1AXI204

12.1.2AHB204

12.1.3APB205

12.1.4TileLink205

12.1.5总结比较205

12.2自定义总线协议ICB206

12.2.1ICB总线协议简介206

12.2.2ICB总线协议信号207

12.2.3ICB总线协议时序207

12.3ICB总线的硬件实现210

12.3.1一主多从210

12.3.2多主一从211

12.3.3多主多从212

12.4蜂鸟E200处理器核BIU212

12.4.1BIU简介212

12.4.2BIU微架构213

12.4.3BIU源码分析214

12.5蜂鸟E200处理器SoC总线214

12.5.1SoC总线简介215

12.5.2SoC总线微架构215

12.5.3SoC总线源码分析216

12.6总结216

3章不得不说的故事——中断和异常217

13.1中断和异常概述218

13.1.1中断概述218

13.1.2异常概述219

13.1.3广义上的异常219

13.2RISC-V架构异常处理机制221

13.2.1进入异常221

13.2.2退出异常224

13.2.3异常服务程序225

13.3RISC-V架构中断定义226

13.3.1中断类型226

13.3.2中断屏蔽228

13.3.3中断等待229

13.3.4中断优先级与仲裁230

13.3.5中断嵌套230

13.3.6总结比较231

13.4RISC-V架构异常相关CSR寄存器232

13.5蜂鸟E200异常处理的硬件实现232

13.5.1蜂鸟E200处理器的异常和中断实现要点232

13.5.2蜂鸟E200处理器的异常类型233

13.5.3蜂鸟E200处理器对于mepc的处理234

13.5.4蜂鸟E200处理器的中断接口234

13.5.5蜂鸟E200处理器CLINT微架构及源码分析235

13.5.6蜂鸟E200处理器PLIC微架构及源码分析238

13.5.7蜂鸟E200处理器交付模块对中断和异常的处理242

13.5.8小结245

4章不起眼的,其实是难的——调试机制246

14.1调试机制概述247

14.1.1交互调试概述247

14.1.2跟踪调试概述249

14.2RISC-V架构的调试机制249

14.2.1调试器软件的实现250

14.2.2调试模式250

14.2.3调试指令251

14.2.4调试机制CSR251

14.2.5调试中断251

14.3蜂鸟E200调试机制的硬件实现251

14.3.1蜂鸟E200交互式调试概述251

14.3.2DTM模块253

14.3.3硬件调试模块253

14.3.4调试中断处理257

14.3.5调试机制CSR寄存器的实现258

14.3.6调试机制指令的实现258

14.3.7小结259

5章动如脱兔,静若处子——低功耗的诀窍260

15.1处理器低功耗技术概述261

15.1.1软件层面低功耗261

15.1.2系统层面低功耗261

15.1.3处理器层面低功耗262

15.1.4单元层面低功耗262

15.1.5寄存器层面低功耗263

15.1.6锁存器层面低功耗264

15.1.7SRAM层面低功耗264

15.1.8组合逻辑层面低功耗264

15.1.9工艺层面低功耗265

15.2RISC-V架构的低功耗机制265

15.3蜂鸟E200低功耗机制的硬件实现265

15.3.1蜂鸟E200系统层面低功耗265

15.3.2蜂鸟E200处理器层面低功耗267

15.3.3蜂鸟E200单元层面低功耗269

15.3.4蜂鸟E200寄存器层面低功耗269

15.3.5蜂鸟E200锁存器层面低功耗272

15.3.6蜂鸟E200SRAM层面低功耗273

15.3.7蜂鸟E200组合逻辑层面低功耗274

15.3.8蜂鸟E200工艺层面低功耗275

15.4总结275

6章工欲善其事,必先利其器——RISC-V可扩展协处理器276

16.1专用领域架构DSA277

16.2RISC-V架构的可扩展性278

16.2.1RISC-V的预留指令编码空间278

16.2.2RISC-V的预定义的Custom指令279

16.3蜂鸟E200的协处理器接口EAI279

16.3.1EAI指令的编码279

16.3.2EAI接口信号280

16.3.3EAI流水线接口281

16.3.4EAI存储器接口282

16.3.5EAI接口时序283

16.4蜂鸟E200的协处理器参考示例286

16.4.1示例协处理器需求286

16.4.2示例协处理器指令287

16.4.3示例协处理器实现288

16.4.4示例协处理器性能289

16.4.5示例协处理器代码290

第三部分使用Verilog进行仿真和在FPGASoC原型上运行软件

7章冒个烟先——运行Verilog仿真测试292

17.1E200开源项目的代码层次结构293

17.2E200开源项目的测试用例294

17.2.1riscv-tests自测试用例294

17.2.2编译ISA自测试用例295

17.3E200开源项目的测试平台(TestBench)298

17.4在VerilogTestBench中运行测试用例299

8章套上壳子上路——实现SoC和FPGA原型302

18.1FreedomE310SoC简介303

18.2HBird-E200-SoC简介304

18.2.1HBird-E200-SoC组成结构304

18.2.2HBird-E200-SoC代码结构309

18.3HBird-E200-SoCFPGA原型平台311

18.3.1FPGA开发板311

18.3.2生成mcs文件烧写FPGA314

18.3.3JTAG调试器317

18.3.4FPGA原型平台DIY总结320

18.4蜂鸟E200专用FPGA开发板320

9章画龙点睛——运行和调试软件示例321

19.1Freedom-E-SDK平台简介322

19.2SIRV-E-SDK平台简介323

19.2.1SIRV-E-SDK简介323

19.2.2SIRV-E-SDK代码结构324

19.3使用SIRV-E-SDK运行示例程序325

19.4使用GDB和OpenOCD调试示例程序328

19.5Windows图形化IDE开发工具331

第20章是骡子是马?拉出来遛遛——运行跑分程序332

20.1跑分程序简介333

20.2Dhrystone简介333

20.3运行DhrystoneBenchmark335

20.4CoreMark简介337

20.5运行CoreMarkBenchmark338

20.6总结与比较340

附录部分RISC-V架构详述

手把手教你设计 CPU 链接:

03
Computer Principles and Design in Verilog HDL (Yamin Li)

本书介绍计算机原理、计算机设计以及如何使用 Verilog HDL(硬件描述语言)实现设计。

提供设计处理器/算术/CPU 芯片的技能,包括 Verilog HDL 材料在 CPU(中央处理器)实现中的独特应用。

本书将计算机体系结构和微处理器设计的详细逻辑与Verilog HDL的大量示例相结合。其综合内容包括HDL电路设计,计算机算术算法,设计挑战,内存管理,多核CPU设计,以及高性能计算机和复杂网络。

图片[3]-免费分享三本FPGA设计CPU的书籍-FPGA CPLD资料源码分享论坛-FPGA CPLD-ChipDebug

图3 Computer Principles and Design in Verilog HDL (Yamin Li)

书籍目录如下:

1 Computer Fundamentals and Performance Evaluation 1

1.1 Overview of Computer Systems 1

1.2 Basic Structure of Computers 8

1.3 Improving Computer Performance 13

1.4 Hardware Description Languages 16

Exercises 18

2 A Brief Introduction to Logic Circuits and Verilog HDL 19

2.1 Logic Gates 19

2.2 Logic Circuit Design in Verilog HDL 22

2.3 CMOS Logic Gates 25

2.4 Four Levels/Styles of Verilog HDL 28

2.5 Combinational Circuit Design 34

2.6 Sequential Circuit Design 42

Exercises 59

3 Computer Arithmetic Algorithms and Implementations 63

3.1 Binary Integers 63

3.2 Binary Addition and Subtraction 65

3.3 Binary Multiplication Algorithms 74

3.4 Binary Division Algorithms 84

3.5 Binary Square Root Algorithms 95

Exercises 110

4 Instruction Set Architecture and ALU Design 111

4.1 Instruction Set Architecture 111

4.2 MIPS Instruction Format and Registers 117

4.3 MIPS Instructions and AsmSim Tool 118

4.4 ALU Design 136

Exercises 140

5 Single-Cycle CPU Design in Verilog HDL 143

5.1 The Circuits Required for Executing an Instruction 143

5.2 Register File Design 148

5.3 Single-Cycle CPU Datapath Design 154

5.4 Single-Cycle CPU Control Unit Design 160

5.5 Test Program and Simulation Waveform 164

Exercises 166

6 Exceptions and Interrupts Handling and Design in Verilog HDL 170

6.1 Exceptions and Interrupts 170

6.2 Design of CPU with Exception and Interrupt Mechanism 176

6.3 The CPU Exception and Interrupt Tests 187

Exercises 191

7 Multiple-Cycle CPU Design in Verilog HDL 192

7.1 Dividing Instruction Execution into Several Clock Cycles 192

7.2 Multiple-Cycle CPU Schematic and Verilog HDL Codes 198

7.3 Multiple-Cycle CPU Control Unit Design 201

7.4 Memory and Test Program 208

Exercises 211

8 Design of Pipelined CPU with Precise Interrupt in Verilog HDL 212

8.1 Pipelining 213

8.2 Pipeline Hazards and Solutions 219

8.3 The Circuit of the Pipelined CPU and Verilog HDL Codes 225

8.4 Precise Interrupts/Exceptions in Pipelined CPU 240

8.5 Design of Pipelined CPU with Precise Interrupt/Exception 248

Exercises 265

9 Floating-Point Algorithms and FPU Design in Verilog HDL 266

9.1 IEEE 754 Floating-Point Data Formats 266

9.2 Converting between Floating-Point Number and Integer 268

9.3 Floating-Point Adder (FADD) Design 273

9.4 Floating-Point Multiplier (FMUL) Design 290

9.5 Floating-Point Divider (FDIV) Design 302

9.6 Floating-Point Square Root (FSQRT) Design 312

Exercises 321

10 Design of Pipelined CPU with FPU in Verilog HDL 323

10.1 CPU/FPU Pipeline Model 323

10.2 Design of Register File with Two Write Ports 326

10.3 Data Dependency and Pipeline Stalls 328

10.4 Pipelined CPU/FPU Design in Verilog HDL 335

10.5 Memory Modules and Pipelined CPU/FPU Test 345

Exercises 351

11 Memory Hierarchy and Virtual Memory Management 353

11.1 Memory 353

11.2 Cache Memory 359

11.3 Virtual Memory Management and TLB Design 367

11.4 Mechanism of TLB-Based MIPS Memory Management 377

Exercises 384

12 Design of Pipelined CPU with Caches and TLBs in Verilog HDL 386

12.1 Overall Structure of Caches and TLBs 386

12.2 Design of Circuits Related to Caches 387

12.3 Design of Circuits Related to TLB 392

12.4 Design of CPU with Caches and TLBs 400

12.5 Simulation Waveforms of CPU with Caches and TLBs 416

Exercises 424

13 Multithreading CPU and Multicore CPU Design in Verilog HDL 425

13.1 Overview of Multithreading CPUs 425

13.2 Multithreading CPU Design 428

13.3 Overview of Multicore CPUs 434

13.4 Multicore CPU Design 436

Exercises 442

14 Input/Output Interface Controller Design in Verilog HDL 443

14.1 Overview of Input/Output Interface Controllers 443

14.2 Error Detection and Correction 445

14.3 Universal Asynchronous Receiver Transmitter 452

14.4 PS/2 Keyboard/Mouse Interface Design 461

14.5 Video Graphics Array (VGA) Interface Design 466

14.6 Input/Output Buses 483

Exercises 507

15 High-Performance Computers and Interconnection Networks 509

15.1 Category of High-Performance Computers 509

15.2 Shared-Memory Parallel Multiprocessor Systems 510

15.3 Inside of Interconnection Networks 514

15.4 Topological Properties of Interconnection Networks 516

15.5 Some Popular Topologies of Interconnection Networks 518

15.6 Collective Communications 521

15.7 Low-Node-Degree Short-Diameter Interconnection Networks 524

Exercises 535

Computer Principles and Design in Verilog HDL 链接:

 

请登录后发表评论