基于FPGA与RISC-V的嵌入式系统设计pdf下载pdf下载

基于FPGA与RISC-V的嵌入式系统设计百度网盘pdf下载

作者:
简介:本篇主要提供基于FPGA与RISC-V的嵌入式系统设计pdf下载
出版社:清华大学出版社
出版时间:2020-01
pdf下载价格:0.00¥

免费下载


书籍下载


内容介绍

产品特色

编辑推荐

全球CPU主流架构只有Intel的x86和软银的Arm,两家都需要向设计者收取高昂的授权费。直到加州大学伯克利分校的4位老师开发出免费的开源RISC-V指令集,芯片行业被垄断的局面彻底改变了。

RISC-V架构从未像今天一样被广泛重视,目前基于RISC-V架构下的开发人员相对较少,企业界的RISC-V技术沉淀也不够深厚,当RISC-V指令集开发突然被摆上台面的时候,很多芯片设计厂商发现困难重重,不仅没有合适的开发人员,而且连专业的RISC-V开发资料都很难找到。

本书作者顾长怡先生是FPGA和嵌入式开发的专家,受硬禾理工学院院长苏公雨老师和清华大学出版社编辑的邀请,引发了这位“开源软硬件的狂热支持者”的奋笔疾书,才有了这本图书的问世。老顾不仅文笔流畅,而且图书的内容架构体系非常详尽。

本书为读者们有兴趣了解RISC-V的构建和开发的朋友们提供了一个全景的技术讲解:
FPGA及设计要点
RISC - V指令集
如何设计基于RISC-V指令集的Soft CPU

如何在RISC-V内核上构建外围设备接口
嵌入式软件开发
嵌入式操作系统的移植(以开源的RTOS为例)
如何使用Arduino IDE来开发FPGA上的RISC-V处理器在各种FPGA开发板上如何跑成功RISC-V项目。

这本书围绕RISC-V架构及应用开发,以FPGA为载体,结合主流的Arduino 开发板生态,将RISC-V指令架构、处理核设计、SoC系统搭建、FPGA开发、嵌入式操作系统娓娓道来。让我们一起体会2019 RISC-V官方 CPU设计大赛的一等奖得主的作品。

内容简介

本书详细介绍了RISC-V指令集及其设计思想,并在此基础上引入了一种称为FARM的软硬件开发模式,将FPGA同RISC-V CPU软核相结合,并利用Arduino与Make作为软件快速开发工具,有效地提高了开发效率,使系统设计具有更好的通用性和可移植性。

除了上述有关软硬件的讨论之外,本书的作者还与国内小脚丫FPGA的团队进行了合作,成功地将书中的大部分内容移植到了小脚丫FPGA旗下的STEP CYC10开发板上,并将相关的技术细节在书中做了详细陈述,以方便读者的动手实践。

本书内容既有深度,又有广度,对各类从事软硬件开发的科技人员会有很大的参考价值。对高校相关专业的学生,本书也是一部很好的参考书。

作者简介

顾长怡 于1995年免试直升上海交通大学本硕联读班,1998年获该校计算机科学与工程学士学位,2001年获该校通信与信息系统工程硕士学位。


同年赴美,在美国加州的多家高科技公司从事嵌入式系统和FPGA的开发工作,其间还曾获得美国南加州大学集成电路设计专业硕士学位。

顾长怡先生对软硬件开发和数字信号处理有着丰富的业界经验,他也是美国PulseRain Technology公司的创始人。

在2018年由RISC-V 基金会官方举办的全球首届RISC-V Soft CPU 设计大赛中,由顾长怡先生主持设计的PulseRain Reindeer 处理器内核在激烈的竞争中脱颖而出,荣获季军。在2019年以物联网安全为主题的第二届竞赛中,他主持设计的PulseRain Rattlesnake处理器成功挫败了所有的黑客模拟攻击,并获综合成绩第一而夺冠。

他同时还是英文学术专著 Building Embedded System - Programmable Hardware 的作者(该书已由美国APress出版社于2016年出版),以及开源软硬件的狂热支持者。

精彩书评

1. 北京航空航天大学退休教授 夏宇闻
对于想要进入数字嵌入式应用系统设计行业,并要成为一位能熟练应用RISC-V固核,有能力设计性能卓越的实时数据处理系统的优秀工程师,本书是必选读物之一

2. 北京航空航天大学教授 何立民
该书从FPGA内核设计的视角全面介绍了在RISC-V基础上嵌入式系统的设计方法。有助于使原有从事嵌入式系统的人士迅速入到RISC-V的嵌入式系统开发领域中。

3. 与非网创始人,硬禾理工学院院长 苏公雨
本书一定会给国内同行了解FPGA与RISC-V在嵌入式设计中的应用打开一个新的窗口。

目录

第 1 章 概述

1.1 背景阐述

1.2 FPGA

1.3 RISC-V

1.4 小脚丫 FPGA 开发平台

1.5 C/C++,Make 与工具链

1.6 嵌入式操作系统

1.7 Arduino 集成开发环境

1.8 模块授权方式

1.9 PulseRainRTL库

1.10 资料来源

1.11 代码资源


第 2 章 FPGA

2.1 FPGA 背景概述

2.2 FPGA 与数字芯片的异同

2.2.1 FPGA 与数字芯片在设计流程上的异同

2.2.2 FPGA 与数字芯片在功耗上的区别

2.2.3 FPGA 与数字芯片在性能上的区别

2.2.4 逻辑设计规模的衡量单位

2.2.5 避免使用锁存器

2.3 FPGA 与 CPLD 的区别

2.4 FPGA 开发中硬件设计语言的选择

2.4.1 VHDL 与 System Verilog / Verilog

2.4.2 HLS

2.4.3 System C

2.4.4 Chisel/SpinalHDL

2.5 FPGA 的片上内存

2.6 用 FPGA 实现双向同步 SRAM 接口

2.7 FPGA 的 DSP Block

2.8 时钟与复位

2.9 时钟域跨越

2.9.1 单个电平信号的时钟域跨越

2.9.2 单个脉冲信号的时钟域跨越

2.9.3 多比特总线的时钟域跨越

2.10 有限状态机的 System Verilog 模板

2.11 高速 IO 与源同步总线(Source Synchronous Bus)

2.12 FPGA 在数字信号处理中的应用

2.12.1 数字滤波器

2.12.2 4倍频采样

2.12.3 复数乘法

2.12.4 补码,值饱和,负值,绝对值,四舍五入

2.12.5 除法

2.12.6 正弦函数与余弦函数

2.12.7 CORDIC 算法

2.13 其他技巧

2.13.1 寄存器重定时

2.13.2 异或树与多路复用器

2.13.3 虚拟输入输出

2.13.4 迁移路径

2.14 面积与性能的平衡

2.14.1 流水线与并行

2.14.2 小面积设计

2.14.3 AT定律

2.15 数字逻辑与处理器各自适用的领域


第 3 章 RISC-V 指令集

3.1 RISC-V 的历史

3.2 8051的 CISC 指令集与 RISC-V 的比较

3.2.1 8051 指令集简介

3.2.2 8051 指令集对处理器设计的负面影响

3.2.3 RISC-V 指令集对处理器设计的正面影响

3.3 RISC-V 与其他 RISC 指令集的比较

3.4 RISC-V 基础指令集(RV32I 与 RV32E)

3.4.1 RV32I 与 RV32E 基础指令集简介

3.4.2 RISC-V 地址空间

3.4.3 RV32I 通用寄存器与函数调用约定

3.4.4 RV32I 指令格式

3.4.5 RV32I 算术与逻辑指令

3.4.6 控制转移指令

3.4.7 内存载入与存储指令

3.4.8 RV32I 内存同步指令

3.4.9 控制与状态寄存器指令

3.4.10 环境调用与软件断点

3.4.11 基础指令集的面积优化方案

3.5 RISC-V 扩展指令集

3.5.1 乘除法扩展(M Extension)

3.5.2 压缩指令集扩展

3.6 RISC-V 特权架构

3.6.1 特权层级

3.6.2 控制状态寄存器

3.6.3 定时器

3.6.4 中断与异常

3.6.5 程序的调试


第 4 章 设计基于 RISC-V 指令集的 Soft—CPU

4.1 2018 RISC-V Soft CPU Contest 获奖作品:PulseRain Reindeer

4.2 适合于 FPGA 的设计目标

4.3 PulseRain Reindeer 的设计策略

4.4 PulseRain Reindeer 的 RTL 设计

4.4.1 与 FPGA 平台相关部分

4.4.2 独立于 FPGA 平台部分

4.4.3 通用寄存器的设计

4.4.4 CSR 寄存器的实现

4.4.5 时钟定时器的实现

4.4.6 流水线的设计

4.5 处理器验证的方式

4.5.1 黑盒(Black Box)测试与白盒(White Box)测试

4.5.2 用 Verilator 做处理器内核的黑盒验证

4.5.3 用 Modelsim 做处理器的白盒验证


第 5 章 外围设备接口

5.1 UART

5.2 I 2 C 和 SMBus

5.3 SPI

5.4 PWM

5.5 microSD 存储卡

5.6 PS/2 接口

5.7 旋转编码器

5.8 7段数码管显示器

5.9 USB

5.10 以太网


第 6 章 嵌入式软件开发基础

6.1 目标文件格式

6.2 Link Script(编译用链接脚本)

6.3 工具链

6.3.1 readelf

6.3.2 objdump

6.3.3 objcopy

6.4 嵌入式系统中高级编程语言的选择

6.5 C 语言在嵌入式系统中的应用

6.5.1 C 语言的模块封装

6.5.2 C 语言的内存对齐访问

6.5.3 C 语言的静态编译检查

6.5.4 volatile 与 const

6.6 C++ 语言在嵌入式系统中的应用

6.6.1 C++ 语言的口水仗

6.6.2 C++ 语言对 C 的改进

6.6.3 C++ 语言引入的新概念和新方法

6.7 MAKE

6.7.1 支持增量编译的 Makefile(Makefile for Incremental Build)

6.7.2 支持内核配置语言的 Makefile


第 7 章  嵌入式操作系统的移植

7.1 嵌入式操作系统的分类

7.1.1 裸金属系统

7.1.2 实时操作系统

7.1.3 通用操作系统

7.2 Zephyr 操作系统的 RISC-V 移植

7.2.1 Zephyr 操作系统简介

7.2.2 串行口的支持

7.2.3 定时器的支持

7.2.4 中断的设置

7.2.5 修改编译链接选项

7.2.6 样本应用程序


第 8 章  Arduino开发系统

8.1 Arduino 的历史

8.2 Arduino 的技术贡献

8.3 Arduino 开发板

8.4 Arduino IDE 集成开发环境和 Arduino Language

8.4.1 Arduino IDE 集成开发环境的工作原理

8.4.2 Arduino Language

8.5 Arduino IDE 集成开发环境下第三方开发包的使用和制作

8.5.1 Arduino IDE 第三方开发包的使用

8.5.2 Arduino IDE 第三方开发包的制作

8.6 Arduino IDE 集成开发环境下第三方支持库的使用和制作

8.6.1 Arduino IDE 第三方支持库的使用

8.6.2 Arduino IDE 第三方支持库的制作


第 9 章 综合实验平台:小脚丫 STEP FPGA开发板

9.1 STEP CYC10 开发板简介

9.2 RISC-V for Step FPGA

9.3 动态内存的访问与时序约束

9.3.1 动态内存的仿真

9.3.2 动态内存的时钟设置

9.3.3 动态内存的时序约束

9.3.4 动态内存的读写测试

9.4 处理器仿真

9.4.1 用 Verilator 做仿真

9.4.2 用 Modelsim 做仿真

9.5 外围设备与中断

9.5.1 外围设备(RTL 模块)与物理设备

9.5.2 中断映射

9.5.3 中断处理程序

9.6 外围设备寄存器地址列表

9.7 串行口

9.8 GPIO

9.9 5 向按键

9.10 7 段管显示器

9.11 三轴加速度传感器 (ADXL345)

9.12 开发板示范 Sketch


第 10 章  知识产权保护

10.1 知识产权保护的方式

10.2 计算机指令集的知识产权保护

10.3 逆向工程

10.4 协议授权

10.4.1 GPL

10.4.2 LGPL

10.4.3 Apache

10.4.4 知识共享

10.4.5 双授权协议

精彩书摘

3.1 RISC-V的历史


RISC-V 最早源自 2010 年夏天美国加州大学伯克利分校 Krste Asanović 教授主持的一个关于开源计算机系统的研究项目。该项目得到了美国国防高级研究计划局(Defense Advanced Research Projects Agency,DARPA)的资助,后来成为 RISC-V 的前身[ 这里顺便提一句,国际互联网Internet 的前身ARPANET(Advanced Research Projects Agency Network,高级研究计划局网络)也是由 DARPA 资助的。


RISC-V 中的字母 V 表示第五代的意思,所以发音时应该发作“RISC-Five”,表示它师承于伯克利分校之前开发的一系列 RISC 指令集。根据 RISC-V 的族谱,RISC-V 之前四代指令集都产生于 20 世纪 80 年代。当然,RISC-V 在其形成过程中,也从其他各种流行的指令集(MIPS、SPARC、ARM 等)中吸取了经验教训。


在 RISC-V 问世之际,移动计算主要由 ARM 处理器把持,而 Intel 公司的 x86处理器则占据了大部分的桌面计算市场,RISC-V 的出现给这两大巨头带来了挑战。与这两大巨头的指令集不同的是,RISC-V 是一个自由和开放的指令集,它的标准化工作由 RISC-V 基金会主持,该组织目前有超过 100 个会员,并在不断扩大之中。对任何想要用 RISC-V 设计实现处理器的公司与个人,他们都不会受到来自RISC-V 基金会的限制,也无须向 RISC-V 基金会支付授权费用。基金会各会员公司也承诺不会就 RISC-V 的基本议题向其他成员发起诉讼。


由于 RISC-V 没有上面提到的这些限制,因此很快得到了开源社区的大力拥护。面对 RISC-V 的攻城略地,ARM 也开始予以反击。2018 年夏,ARM 上线了一个名为 riscv-basics.com 的网站,对 RISC-V 发起舆论战。但是这种做法很快受到了来自各方的诟病,甚至连 ARM 自己的员工都对此做法表示不满。迫于各方压力,ARM 很快就关闭了该网站。


另外,为了促进 RISC-V 的产业化,RISC-V 的主要开发成员还于 2015 年成立了一家叫 SiFive 的初创公司,向市场提供各类 RISC-V 的处理器内核,以及相关的软件工具和开发套件。


3.2 8051的CISC指令集与RISC-V的比较


提到 RISC(Reduced Instruction Set Computer,精简指令集计算机),就必然也会提到 CISC(Complex Instruction Set Computer,复杂指令集计算机)。在许多嵌入式系统中得到广泛使用的 8051 单片机,便是 CISC 指令集的典型代表。笔者在开始设计 RISC-V 处理器之前,也曾做过一款 1T(单时钟周期)8051 处理器的设计,所以对这两类不同类型的指令集都有深入了解。这里笔者愿意将这些体会做个总结,并由此来反映 RISC-V 在技术设计上的优势。


可能有许多读者对 8051 单片机早已熟悉,该单片机是由美国 Intel 公司于 20世纪 80 年代推出的一款 8 位单片机。由于该单片机方便易用,许多公司都推出了第三方的兼容设计。直到今天,8051 单片机依然被许多嵌入式系统所选用。


然而在 20 世纪 80 年代该单片机刚刚问世时,半导体的制造工艺还只能达到μm 级,处理器所能达到的时钟频率偏低。而且当时硬件设计语言还处于起步阶段,也缺乏自动设计的工具,软件多以手工汇编编程为主。这就导致流水线设计的优势无法得到发挥,并且每条指令需要多个时钟周期才能完成。由于上述原因,当时的指令集设计往往具有以下特点:


(1)尽量在每条指令中实现更多的功能。例如 8051 的 CJNE 指令,就需要在一条指令中依次实现:

① 与累加器做减法。

② 修改进位标示。

③ 将结果做相等比较。

④ 根据比较结果决定是否跳转。


(2)指令集庞大,以实现更多的复杂功能。例如 8051 虽然是 8 位单片机,其指令集却包含高达 255 种不同的指令和格式。


(3)由于以上两点,导致变长指令的出现,以提高内存利用率。8051 的指令就有单字节、双字节与三字节三种不同的种类,而且除了对指令解码以外,没有其他的手段帮助判定指令长度。


(4)寻址方式众多。例如在8051 指令集中,对数值的操作包括如下方式:

① 立即数寻址。将常数包含在指令中。

② 直接寻址。将内存地址包含在指令中。

③ 间接寻址。将内存地址放入寄存器中,然后将寄存器地址包含在指令中。

④ 寄存器寻址。将操作数放入寄存器中,然后将寄存器地址包含在指令中。


由于众多的寻址方式,同一个功能在指令集中就可能对应多种指令格式。例如在 8051 指令集中,光是一个加法指令就有 12 种不同格式。类似地,跳转指令也存在多种的寻址方式和指令格式。


8051 指令集的特点,很大程度上也代表了当时众多 CISC 指令集的共同特点。这种特点是与当时半导体制造水平和软件发展水平相匹配的。随着半导体加工工艺的不断进步和软件开发水平的提高,流水线和高时钟频率的设计开始在处理器设计中流行,汇编语言也开始C/C++ 这类高级编程语言所替代。尽管 8051 是一个非常长寿的指令集,自问世近 40 年,依然被业界广泛采用,但是今天市面上出现的8051 处理器,却早已和它们的祖先大不一样了。8051 的第一代产品,其时钟频率只有 12 MHz,每个指令需要 12 个时钟周期才能完成。而今天我们所使用的 8051 处理器,都是增强型处理器,除了有更丰富的外围设备外,其增强之处主要表现在:


(1)时钟频率大幅提高。


(2)指令的吞吐率大幅提高,对大部分的指令,都可以做到在单个时钟周期内完成即我们通常说的 1T 8051。


(3)在软件上,支持 C 语言的开发环境。


换句话说,今天的增强型 8051 处理器,虽然其指令集还是 40 年前的那个指令集,但是其内部实现却早已经在原型基础上进行了 RISC 改造(实际上,类似的 RISC 改造也同样发生在 Intel 的 x86 处理器上)。


说明:由于指令集设计的缺陷,这种对 CISC 指令集的 RISC 实现不可避免地要在硬件上付出一定的代价。下面就以笔者主持设计的 PulseRain FP51-1T MCU 为例,对此具体加以说明。


3.2.2 8051指令集对处理器设计的负面影响


PulseRain FP51-1T MCU 是美国 PulseRain Technology 公司推出的一款针对FPGA 的 8 位微控制器,其内部的处理器内核是一个增强型 8051,可以对大部分的 8051 指令实现 1T 吞吐率,并且在 FPGA 上可以实现很高的时钟频率(在 Intel MAX10 C8 级器件上主频可以达到 100 MHz)。


8051 的流水线实现如图 3-1 所示,该处理器的内部有一个 5 级流水线,包含指令读取、指令解码(一)、数据内存读取、指令解码(二)和指令执行。尽管该处理器在 FPGA 上有优秀的性能表现,然而由于 8051 指令集本身的缺陷,使得设计者不得不以额外的逻辑资源为代价来换取更高的性能。最后的结果就是与同样时钟频率的 RISC-V 处理器相比,8 位 8051 内核居然比 32 位 RISC-V 内核消耗更多的逻辑资源,占用更大的芯片面积,而更大的芯片面积意味着更加耗电。对 FPGA器件来说,这些还不是一个太大的问题,但是对专用芯片(ASIC),特别是移动设备的专用芯片来说,更多的耗电往往意味着更短的电池寿命(Battery Life),这可能也是 Intel x86 处理器始终无法在移动设备市场上打开局面的原因之一。


图3-1 8051 的流水线实现


具体来说,8051 指令集的特点会对处理器的 RISC 实现产生如下负面影响:


1)尽量在每条指令中实现更多的功能


为了在实现这些复杂功能的同时保持高吞吐率,流水线的设计者不得不花更多的时间规划流水线的各级。即便如此,有些指令依然无法实现单周期吞吐,例如上文提到的 CJNE 指令,就需要两个时钟周期。


另外,现代的 8051 处理器开发,早已经采用C语言代替了早期的汇编语言。而高级语言的编译器往往很难把这类复杂、多功能机器指令的威力全部发挥出来,有违当初指令集的设计初衷。


当然,指令集复杂这个特点也并非一无是处。由于 CISC 指令集的指令复杂,也使得其代码密度(Code Density)一般要优于同等字宽的 RISC 处理器。


2)庞大的指令集


庞大的指令集必然导致指令的解码阶段变得更为复杂,需要耗费更多的逻辑资源。读者可能已经注意到,在图 3-1 所示的 5 级流水线中,指令集被分为两部分,对它们各自的解码分别占用了流水线的一级。这样设计的原因之一就是为了在庞大指令集下实现高吞吐率、高时钟频率,而不得不做出的妥协。同样时钟频率的RISC-V 处理器,由于指令集比较精简,就无需做这样的妥协,从而大大节省了逻辑资源,简化了流水线设计。


3)由于以上两点,导致变长指令的出现,以提高内存利用率


8051 的指令有单字节、双字节和三字节三种不同的种类,除解码(Decode)外,没有其他的手段帮助判定指令长度。这种变长的指令结构,导致指令之间的边界很难判定,甚至有可能导致内存的非对齐读取(Unaligned Memory Access),从而对流水线的取指器(Instruction Fetch)设计带来挑战。


幸运的是,8051 的内存架构是哈佛架构,其代码与数据在不同的地址空间中分开存放。这就使得代码存储部分可以单独做一些优化设计。在图 3-1 中左边部分的片上代码内存,实际上被分成 4 个 8 位宽的存储体,这样对代码内存的一次读取就可以得到 4 字节,从而保证至少可以有一条完整的指令。然而即便如此,由于8051 指令集没有其他辅助手段来帮助判定指令长度,为了确定指令的边界,8051的取指器不得不为此花费比 RISC-V 更多的逻辑资源。


4)众多的寻址方式


由于 8051 存在众多的寻址方式,使得指令集中的许多指令都可以访问内存。这导致流水线的数据冲突(Data Hazard)很难判断,有时不得不通过硬件自动插入空操作(Null Operation,NOP)来保持数据的正确和完整。这样既消耗了逻辑资源,又降低了流水线的效率,从而对功耗和性能造成双重打击。


说明:虽然 8051 指令集有其历史局限性,但是 8051 处理器却由于其短小精悍、性价比高,一直为笔者所钟爱。其虽历四十载,依然廉颇未老,不乏拥趸。


3.2.3 RISC-V 指令集对处理器设计的正面影响


8051 指令集的缺陷,在 RISC-V 中都得到了避免,具体说明如下。


1. 引入指令长度编码


8051 指令集除了对指令解码以外,没有其他的辅助手段帮助判定指令长度,而 RISC-V 则可以通过指令的低位部分来判断指令的长度,被称为指令长度编码(Instruction Length Encoding)。图 3-2 展示了 16 ~ 64 位指令的编码方式。64 位以上的编码方式,可以在 RISC-V 官方标准中找到。


图3-2 RISC-V指令长度编码


指令长度编码的引入,大大简化了流水线取指器的设计,在取指时,硬件只需要集中优化边界对齐的内存读取就可以了。而对非对齐的访问,则可以通过产生异常,让软件处理器来处理。这样既节省了逻辑资源,又不影响处理器的性能。


2. 指令集规模较小,指令格式规整尽管不是 8 位指令集,RISC-V 的指令集规模却比 8051 这样的 8 位指令集要小许多。RISC-V 的 32 位基础整数指令集只有 47 条指令,即使算上 8 条乘除法扩展指令,其指令总数也不到 8051 指令集规模的 1/4。指令集的小巧使得指令的解码器变得简单,更无须像图 3-1 中那样将指令集分成两部分来分别解码。同时,RISC-V 的指令格式也非常规整,除了指令长度编码总是处在指令低位以外,在不同指令格式之间,操作码、源寄存器和目标寄存器总是位于相同的位置上。例如在 RISC-V 32 位基础整数指令集中(RV32I),操作码总是占用低 7 位,而源寄存器 1 和 2(rs1,rs2)则分别占据 15-19 位与 20-24 位。目标寄存器(rd)则占用 7-11 位(位索引以 0 为参考起点)。这种规整的指令格式进一步简化了指令解码器和指令执行器的设计。


3. 每条指令实现单个功能与 CISC 指令集的设计思想截然相反,RISC-V 指令集中的每条指令只集中于优化实现单个的功能,这种将复杂任务通过多个单功能的指令来实现的做法也一直是 RISC 指令集的指导思想。因为这样可以简化流水线的设计,从而能实现更高的时钟主频,最终可以让 RISC 获得比 CISC 更佳的总体性能。

4. 内存访问只能通过 LOAD/STORE


与 8051 指令集中,具有众多的寻址方式不同,在 RISC-V 指令集中,对内存的读写只能通过 LOAD 指令和 STORE 指令实现。而其他的指令,都只能以寄存器为操作对象。没有了复杂的内存寻址方式,使得流水线对数据冲突(Data Hazard)可以及早做出正确的判断,并通过流水线各级之间的转送加以处理,而不需要插入空操作(NOP),极大提高了代码的执行效率。当然,这一特点也是 RISC 指令集的共有特点之一。


至此我们可以看到,CISC 指令集的那些历史局限性,在 RISC-V 指令集中都得到了突破。下面的章节会将 RISC-V 与其他的主流 RISC 指令集做对比,并展示其设计上的考量与取舍。

前言/序言

序语1


前几天,清华大学出版社的杨迪娜编辑在微信中告诉我,她正在编辑一本有关FPGA和RISC-V 系统设计的书。这本书马上就要付印,希望我能抽空浏览该书的电子版,如果觉得写得不错,请我为该书写一个序言,给作者一点鼓励,给读者们一点指点,顺便推荐一下。我一向鼓励年轻人主动工作的热情,于是欣然答应了她的请求。我用一周的空闲时间浏览了该书电子版的全部章节。因为年老力衰,已没有精力反复研读该书的全部内容,只能抽部分重要章节,细细研读。我与作者顾长怡先生素昧平生,从未有过交集。尽管如此,仅就认真阅读过的大部分内容而言,我能明显地感觉到作者是一个有国际阅历,并在嵌入式数字系统设计领域有过多年工作经验,担任过软硬件综合设计任务的高级设计师。他的写作态度十分认真,许多内容确实是作者本人在多年实际工作中的积累,凝聚了作者的全部心血。我从文字中能明显地体会到作者想与国内读者分享设计经验的赤诚之心。


全书文字简洁流畅,内容涉及面很广,几乎包括了现代数字嵌入式系统设计的全部概念。对电子信息专业基础扎实并有一些实际工作经验的年青工程师而言,本书阐述的概念准确清晰,全书各章节内容通俗易懂。为即将进入数字嵌入式应用设计行业的读者介绍了如何进行FPGA应用设计和验证,以及如何在设计中融入RISC-V固核的实用技术和方法。书中对设计者必须掌握的重要概念,例如RTL设计思路、多时钟域、软/硬件资源分配、模块和系统验证的策略等都有深入细致的分析和阐述。毫无疑问,对于想要进入数字嵌入式应用系统设计行业,并要成为一位能熟练应用RISC-V固核,有能力设计出性价比高、性能卓越的实时数据处理系统的优秀工程师,本书是必选读物之一;对于只是想了解硬件设计的软件工程师和系统设计的高级管理人员而言,本书也是一本很好的参考书,它能帮助你理解嵌入式数字应用系统设计中的难点,从而避免陷入困境。


作为在嵌入式数字系统设计领域服务多年的老工程师、老教授,我必须告诉想进入该行业的年轻朋友们:即使顶级聪明的年轻人,也不会只靠读几本书,就能轻易掌握复杂的嵌入式系统设计的全部诀窍。想要完成复杂的、高性价比的应用系统设计,没有任何捷径可走,只能凭借设计者对专业工作的极大兴趣,强烈的责任感,不屈不挠的顽强意志。只有在长期的日常工作中,保持严谨的科学作风,严格遵循数字系统设计方法学,在实践中坚持学习,积累经验,活到老,学到老,不断攀登,才能登上世界技术高峰。


年轻的朋友们,如果你们能以本书作者顾长怡为自己的学习榜样,全身心投入自己热爱并为之献身的数字应用系统设计的科学实践中,面对看似艰难的课题,相信自己的能力,大胆实践、虚心求教、积极交流,我相信你们每个人必定有辉煌的成就。未来属于不怕困难,坚持学习,永不满足,敢于攀登的勇者。


-----夏宇闻 北京航空航天大学退休教授


序语2


2010 年RISC-V诞生。RISC-V的开源战略,吸引了不少用户参与二次开发,也大力推动了RISC-V的生态建设。RISC-V指令集完全开源,吸引了众多IP供应商,IP供应商将提供不同程度的开源IP产品。2018年10月,中国RISC-V产业联盟成立,就吸引了千余家用户参与AI芯片开发,预计5年之内,RISC-V产业在应用量上会有突破性进展。在这一波嵌入式系统开发热潮中,我们欣喜地看到顾长怡先生编写的《基于FPGA与RISC-V的嵌入式系统设计》一书。该书从FPGA内核设计的视角全面介绍了在RISC-V基础上嵌入式系统的设计方法。该书的内容独特,反映了笔者近年来在RISC-V应用开发方面的实战经验。内容安排十分贴近国内近几十年在嵌入式系统领域走过的历程,这种亲近感有助于使原有从事嵌入式系统的人士迅速进入到RISC-V的嵌入式系统开发领域中。


从全书内容叙述中可以看出,笔者是长期从事嵌入式系统应用开发人士,一路从底层走来,进入到集成电路领域,对嵌入式系统软、硬件结构有深刻的认识与理解。笔者从嵌入式系统常规领域(FPGA、51指令集、操作系统移植等内容)出发,将有志于RISC-V的应用者带入了嵌入式系统应用的AI芯片开源平台的前沿技术领域。书中除了全面介绍基于FPGA的RISC-V指令集外,还对外设接口、嵌入式软件开发、操作系统移植、集成开发环境进行了详细论述,并为开发者提供了一个可立即用于实践的综合实验平台。从理论到实际再到实战,是本书的一大特点。


书中最后一章对知识产权保护的论述,无疑是本书的一大亮点。对当前开源平台嵌入式应用中知识产权保护知识的普及具有十分重要的意义

-----资深嵌入式开发专家


序语3



自1948年第一个三极管在美国贝尔实验室问世至今,电子工程领域发生了翻天覆地的变化。与之相应的是计算机和软件产业的蓬勃兴起,以及嵌入式系统的大规模普及。


传统的嵌入式系统开发多围绕通用处理器展开。但是近年来,FPGA技术的普及和软核处理器的出现改变了这一局面。特别是RISC-V开源指令集的逐渐普及,更进一步模糊了软硬件的边界,并对定制化设计提出了更多、更高的要求。


这种新的技术趋势要求工程师能成为通晓软硬件技术的多面手。但是,目前的工程师教育培训体系依然还停留在过去那种“一个萝卜一个坑”的状态,无论广度还是深度,都无法跟上行业的发展。而讨论最新技术的相关书籍更是屈指可数。


这次我很高兴看到顾长怡先生愿意将他多年在海外学习与工作所获得的知识和经验与国内的同行们分享。顾长怡先生是FPGA和嵌入式系统开发技术的专家,他主持设计的RISC-V处理器,获得了行业设计竞赛的认可。我个人和他也曾有过合作,他在技术方面的渊博知识和勤恳负责的工作态度,给我留下了深刻的印象。有一次在美国和他会面的时候,向他提及了RISC-V技术相关的话题,最终引发了他的“奋笔疾书”和今天本书的面世。相信这本书一定会给国内同行了解FPGA与RISC-V在嵌入式设计中的应用打开一个新的窗口。


-------苏公雨 与非网创始人,硬禾理工学院院长


序语4


RISC-V不仅仅是一场技术的革命,更是一场商业模式的伟大变革。在RISC-V之前,占据世界主流的处理器架构是Intel的x86架构和ARM架构,但是这些架构都是闭源指令架构,无论是企业还是个人都很难获得指令架构授权并进行半导体设计的创新。


RISC-V开创性地引领了指令架构的开放,并正在推动着硬件领域的开源创新。以Linux、GCC、LLVM、Hadoop等为代表的开源软件极大地推动了互联网时代的发展,以RISC-V为基石的开源硬件极有可能创造硬件领域的“Linux”,让企业和开发者可以像开发软件一样方便快捷地开发硬件,成为IoT时代伟大技术公司的技术底座。未来是一个让人充满期待的开源硬件时代!


RISC-V在全球学术界和产业界正刮起一阵热潮,但是目前RISC-V方面的书籍,尤其是中文的书籍还比较少,无论是高校还是应用开发者都需要一本具有实际操作指导的书籍,帮助他们了解RISC-V,并且快速地基于RISC-V指令架构进行应用开发。


顾长怡先生是FPGA和嵌入式系统开发的专家,具有丰富的计算机体系结构、嵌入式系统软硬件和FPGA的开发经验。本书中,顾长怡先生将围绕RISC-V架构及应用开发,以FPGA为载体,结合主流的Arduino 开发板生态,将RISC-V指令架构、处理核设计、SoC系统搭建、FPGA开发、嵌入式操作系统等内容娓娓道来,相信这是一本不可多得的指导高校学生和开发者进行RISC-V嵌入式开发的教材。


-------陈志坚资深技术专家