写在前面的话:看到朋友圈分享的这本书,一时技痒,给自己定个小目标,从今天开始翻译本书,作为小白学习FPGA之路的记录,仅供个人学习之用,并非用于任何商业目的。仅发布于知乎、个人CSDN博客和/或个人微信公众号。这是我的个人译文,鉴于个人能力有限,难免有疏漏之处。不代表任何官方对于所提及的任何技术的陈述。全书20余万字,2022年-2023年希望能够有始有终完成。
——译者注,2021年12月28日
配套 PYNQ 和机器学习应用一起使用
探索 Zynq® MPSoC
配套 PYNQ 和机器学习应用一起使用
Louise H. Crockett
David Northcote
Craig Ramsay
Fraser D. Robinson
Robert W. Stewart
电子电气工程系
英国苏格兰格拉斯哥斯特拉斯克莱德大学
2019 年 4 月
该版本由 Strathclyde Academic Media 于 2019 年首次发布。
© Strathclyde Academic Media.
封面设计:Scribble Design。摄影:Kenneth Barlee。
本书以可打印电子书(PDF 格式)提供。
本书中的文本和图表全部可复制,并可用于非营利性学术目的,前提是在所有衍生文件中明确引用来源。引用应采用如下格式:
L. H. Crockett、D. Northcote、C. Ramsay、F. D. Robinson 和 R. W. Stewart:探索 Zynq MPSoC:配套 PYNQ 和机器学习应用一起使用,第一版,Strathclyde Academic Media,2019 年。
引用相应章节时,应提供章节作者姓名。例如:
第 23 章:案例研究:在 Zynq 上使用 PYNQ 为空间应用生成 CNN 原型:Phil Karagiannakis、Murray Ireland 和 Steve Greenland来源:探索 Zynq MPSoC:配套 PYNQ 和机器学习应用一起使用,Strathclyde Academic Media,2019 年。
如需将本书内容用于非盈利学术目的,应直接向出版商提交申请。
任何未经授权的第三方都不得以本书原始形式复制和销售本书。
本书作者和出版商已尽最大努力确保在本书中提供最新的准确信息。包括研究其中涵盖的主题并开发各项示例。其中所包含资料均为按“现状”真诚提供,对于本书中包含的文档记录,作者和出版商均不作任何种类的保证,无论是明示还是默示的保证。对于因其中所含任何信息所导致的任何直接或间接的损失或损害,作者和出版商概不负责。
Arm、Cortex、AMBA、CoreSight、Mali、NEON、Thumb 和 TrustZone 均为 Arm Limited(或其附属公司)在欧盟和/或其他国家或地区的注册商标。版权所有。
本出版物为独立出版物,不隶属于 Arm Limited,也不并未获得 Arm Limited 的认可、赞助或授权。
Xilinx、Xilinx 徽标、Spartan、Artix、Kintex、Virtex、LogiCORE、Petalogix、RocketIO、Vivado、Zynq 和 WebPACK 均为 Xilinx, Inc. 的注册商标。版权所有。
MicroBlaze、SelectIO、UltraScale 和 XtremeDSP 均为 Xilinx, Inc. 的商标。
MATLAB 和 Simulink 均为 MathWorks, Inc. 的注册商标。
Linux® 是 Linus Torvalds 在美国和其他国家或地区的注册商标。
Eclipse 是 Eclipse Foundation, Inc. 的注册商标。
本书中使用的所有其他商标均承认属于其各自公司。本书中商标的使用并不意味着商标所有人对本书有任何从属关系或认可。
2011 年,赛灵思公司发起了 Zynq 产品系列。这是将 ARM 处理器与可编程逻辑紧密耦合的首个赛灵思 SoC 系列。当时,我们决定与斯特拉斯克莱德大学的 Bob Stewart 教授和 Louise Crockett 博士协作出版《The Zynq Book》,作为这一创新架构的软硬件的综合性简介和教程。
首次出版取得的巨大成功驱使我们有信心与斯特拉斯克莱德大学继续协作,当 SoC 系列第二版问世时,Zynq MPSoC 也诞生了。
本书“探索 Zynq MPSoC”旨在为读者逐步详解软件栈、多处理系统以及可编程硬件的强大阵列的所有重要方面的信息。MPSoC 处理器系统配备有多达 4 颗 ARM Cortex-A53 处理器核及 2 颗 ARM Cortex-R5 实时处理器核。此外,用户可以利用 FPGA 互连结构,借助强大的 DSP 切片 (slice) 阵列和大规模配置的分布式存储器使现如今的 FPGA 互连结构得以不断扩展。
这种全新架构使处理器系统得以从当今新兴 AI 应用程序所需的复杂算术和数据移动中解放出来,并显著提升了其趣味性。本书着重对软件栈和编程工具进行了详细讲解,我个人对此非常欣赏。其中专为 PYNQ 编程环境准备了一整个特殊章节。PYNQ 是来自赛灵思的开源项目,旨在简化 Zynq 平台上的嵌入式系统的设计。通过使用 Python 语言和库,设计师们可以充分发挥可编程逻辑的优势,构建出更强大且更激动人心的嵌入式系统。本书第五部分主要探讨的是 Zynq MPSoC 平台上诸多应用程序的实现。其中包括详细探讨了旨在有效实现神经网络的 FINN-R 开源框架。
本书适合广大嵌入式系统设计人员阅读,无论是需要简单的软件界面和框架来快速实现机器学习算法的软件程序员,还是希望利用 Zynq MPSoC 的可编程硬件功能的系统设计师,想必都能从中有所收获。
斯特拉斯克莱德大学的团队编写了一本卓越的教学书籍,向读者展示了 Zynq MPSoC 平台所伴随的无限可能。不论是首次使用的用户还是想要充分挖掘硬件潜能的专家,都能从中获益匪浅。
我要感谢并祝贺为本书做出贡献的所有作者。
Ivo Bolsens:
赛灵思高级副总裁兼首席技术官
本书得以付梓,与多方协同助力密不可分,我们不敢妄自居功。特此向各方表示诚挚谢意。
首先要鸣谢赛灵思准予《探索 Zynq MPSoC》成书并提供项目支持。我们要感谢赛灵思高级总监 Patrick Lysaght 对本书作出的诸多贡献。Patrick 自迸发本书灵感起就主导该项目,并制定了了与内容和整体组织相关的诸多战略决策。我们还要特别感谢赛灵思欧洲、中东和非洲地区大学项目经理 Cathal McCabe,他一直担任我们的“图书经理”,并在整个过程中提供了巨大的帮助——耐心解答问题、提供建议和反馈,并帮助我们奋战在第一线。我们非常感谢他的所有意见建议和支持。此外,我们还要感谢 Patrick 和 Cathal 协作撰写第 22 章 PYNQ。
还有一路走来给予我们建议和支持或者审阅章节和提供反馈意见的诸多赛灵思员工。你们的专业知识技能普惠大众,令我们肃然起敬。感谢 Hugo Andrade、Ivo Bolsens、Sean Fox、Peter Ogden、Parimal Patel、Naveen Purush- otham、Yun (Rock) Qu 和 Graham Schelle。特别感谢 Giulio Gambardella、Thomas Preusser、Yaman Umuroglu 和 Michaela Blott 给第 21 章 低精度神经网络做出的贡献。
感谢来自 Craft Prospect Ltd., 团队的 Phil Karagiannakis、Murray Ireland 和 Steve Greenland 给第 23 章 PYNQ 和机器学习在空间应用领域的案例调研做出的贡献。
斯特拉斯克莱德大学的师生们也给予了巨大帮助,感谢他们对项目给予的支持和贡献。尤其要感谢 Sarunas (Shawn) Kalade 和 Josh Goldsmith 分别对深度学习章节以及
部分软件栈章节的内容做出的贡献。我们的斯特拉斯克莱德大学的同事们也付出了他们宝贵的时间和专业知识,对内容进行审核、帮助开展研究或者对内容慷慨贡献,他们是:Douglas Allan、Dale Atkinson、Kenny Barlee、Lewis McLaughlin、Andrew MacLellan、Damien Muir、Alan Petrie、Kenneth Stuart 和 Rhys Williams。这是真正意义上的团队协作!我们还要感谢我们研究团队的无数成员,感谢他们一直慷慨提供支持和鼓励。
最后,同样重要的是,我们要感谢我们的家人和朋友,是他们在本书编撰过程中以爱、鼓励和耐心给予支持。
Louise、David、Craig、Fraser 和 Bob,2019 年 3 月。
前言 xvii
鸣谢 xix
1) 简介 1
1.1) 为什么你会爱上这本书 2
1.2) 赛灵思 SoC 革新——简述 3
1.3) 设计方法 4
1.4) 如何使用本书 6
1.4.1) 本书的组织方式 6
1.4.2) 更多信息来源 7
1.4.3) 新手建议 7
1.5) 下一步 8
1.6) 参考资料 8
第一部分:Zynq MPSoC 入门 9
2) FPGA、Zynq 和 Zynq MPSoC 11
2.1) 技术时间线 12
2.2) Zynq-7000 SoC 12
2.2.1) Zynq 架构和功能特性 12
2.2.2) Zynq 器件 14
2.2.3) Zynq 使用模型 14
2.3) 赛灵思 Zynq MPSoC 15
2.3.1) Zynq MPSoC 的诞生 15
2.3.2) Zynq MPSoC 架构和功能特性 16
2.4) FPGA 18
2.4.1) 关于 FPGA 18
2.4.2) FPGA 的发展历程 18
2.4.3) 现代化 FPGA 架构:UltraScale+ 21
2.5) 比较与探讨:FPGA、Zynq 和 Zynq MPSoC 之对比 24
2.5.1) 架构 24
2.5.2) 功耗和性能 25
2.5.3) 嵌入式系统实现 27
2.5.4) 应用 28
2.6) 章节汇总 29
2.7) 参考资料 29
3) Zynq MPSoC 架构概述 31
3.1) Zynq MPSoC 器件系列 31
3.1.1) Arm 对比赛灵思文档 33
3.2) 处理器系统 33
3.2.1) 应用处理单元 35
3.2.2) 实时处理单元 37
3.2.3) 图形处理单元 38
3.2.4) 连接 39
3.3) 平台管理 42
3.3.1) 功耗模式 42
3.3.2) 功耗域 43
3.3.3) 平台管理单元 44
3.4) 可编程逻辑 45
3.4.1) 逻辑互连结构 46
3.4.2) 存储和信号处理资源 47
3.4.3) PL 外设 48
3.4.4) 视频编解码单元 48
3.4.5) 通用输入/输出 48
3.4.6) 高速连接 49
3.4.7) JTAG 接口 49
3.5) 处理系统和可编程逻辑接口 49
3.5.1) Arm AMBA 开放式标准 50
3.5.2) PS 到 PL 互连与接口 52
3.5.3) EMIO 接口 54
3.5.4) 其它 PS 到 PL 接口 55
3.6) 安全与配置 55
3.6.1) 配置安全性単元 56
3.7) 章节回顾 58
3.8) 参考资料 58
4) Zynq MPSoC 设计工具和设计方法 63
4.1) Zynq MPSoC 设计剖析 63
4.1.1) Zynq MPSoC 开发板 64
4.1.2) 硬件系统 65
4.1.3) 软件栈 68
4.2) 设计进程 69
4.2.1) 要求与规范 69
4.2.2) 工程决策与规划 70
4.2.3) 设计流程 71
4.2.4) 测试 72
4.3) 准备:设计工具和开发系统设置 72
4.3.1) 主机系统 72
4.3.2) 赛灵思软件组件 73
4.3.3) 硬件要求 80
4.4) 开发板和支持资源 81
4.5) 资源和支持 82
4.5.1) 有关 Zynq MPSoC 器件的信息 82
4.5.2) 软件工具支持 83
4.5.3) 系统设计支持 84
4.6) 更广泛的生态系统 84
4.6.1) 硬件系统设计工具和组件 85
4.6.2) 软件系统设计工具和组件 87
4.6.3) 算法开发和交接 89
4.6.4) 硬件与外设 89
4.7) 章节汇总 91
4.8) 参考资料 91
5) Zynq MPSoC 的候选应用领域 97
5.1) 怎样的系统才能称为“Zynq MPSoC 系统”? 97
5.2) Zynq MPSoC 和 RFSoC 的应用领域 99
5.3) 无人机 100
5.3.1) 飞行 100
5.3.2) 视频处理 102
5.3.3) 传感 102
5.3.4) 通信与导航 103
5.3.5) 高级无人机 104
5.4) 智能汽车和自动驾驶汽车 105
5.4.1) “ADAS”覆盖哪些内容? 106
5.4.2) 传感要求与实现 106
5.4.3) 自动驾驶汽车 108
5.4.4) 连接与安全 108
5.5) 与 RF 模拟世界的交互——Zynq RFSoC 革新 109
5.5.1) Zynq RFSoC 器件系列与 MPSoC 之比较 110
5.5.2) RF 采样:RF-ADC 和 RF-DAC 以及i单芯片 SDR 113
5.5.3) 对 Zynq RFSoC 数据转换器进行直接采样 子系统 114
5.5.4) 4GLTE 多载波解决方案 116
5.5.5) 5G 移动和无线实现 117
5.5.6) 使用 IF 架构实现 5G 毫米波 117
5.6) 章节汇总 119
5.7) 参考资料 119
第二部分:Zynq MPSoC 架构详解 123
6) 应用处理单元 125
6.1) Cortex-A53 MPCore 处理器 125
6.2) Armv8-A 基础 126
6.2.1) 64 位/32 位执行状态 127
6.2.2) 指令集和编程语言 128
6.2.3) 异常级别 129
6.2.4) 处理器模式 131
6.2.5) Armv8 安全模型 133
6.3) 信号和接口 137
6.3.1) 主存储器接口 138
6.3.2) ACP 从接口 139
6.3.3) 交叉触发接口 (CTI) 141
6.3.4) 高级外设总线 (APB) 调试 142
6.3.5) GIC 接口 142
6.3.6) 走线接口 142
6.3.7) 其它信号 143
6.4) 存储器管理单元 144
6.5) 存储器系统 144
6.5.1) 1 级存储器系统 145
6.5.2) 2 级存储器系统 146
6.6) 处理器扩展 146
6.6.1) 加密 146
6.6.2) NEON 媒体处理引擎 146
6.6.3) 矢量浮点单元 148
6.7) 中断 148
6.7.1) GICv2 中断类型 149
6.7.2) GICv2 中断优先级和状态 150
6.7.3) GIC-400 概述 150
6.8) 功耗管理 153
6.8.1) 功耗域 153
6.8.2) 功耗模式 154
6.9) 系统虚拟化 155
6.9.1) 虚拟环境中的地址转换 157
6.9.2) 中断虚拟化 157
6.10) 章节回顾 159
6.11) 参考资料 159
7) 实时处理单元 161
7.1) 简介 161
7.1.1) 何谓实时处理? 161
7.1.2) 为何要为实时处理采用不同的架构? 163
7.2) 概述 163
7.3) 确定性和响应性 165
7.3.1) 紧密耦合存储器 165
7.3.2) 中断系统 166
7.4) RPU 中的安全性 170
7.4.1) 存储器保护 171
7.4.2) 拆分/锁定模式 174
7.5) 章节回顾 176
7.6) 参考资料 176
8) Zynq MPSoC 中的安全性 179
8.1) 配置安全信息保障 180
8.1.1) 配置安全单元简介 181
8.1.2) 加密块 183
8.1.3) 密钥管理 190
8.2) 防篡改 200
8.2.1) 监控 201
8.2.2) 响应 202
8.2.3) 预防措施 204
8.3) 通过隔离保障安全 205
8.3.1) 利用虚拟化和 Armv8 隔离软件 206
8.3.2) 将隔离扩展至整个系统 209
8.3.3) 隔离汇总 213
8.4) 章节汇总 213
8.5) 参考资料 214
9) 安全功能特性和技巧 217
9.1) 安全简介 217
9.1.1) 安全性和可靠性 218
9.1.2) 安全应用示例 219
9.2) 功能安全 219
9.2.1) 何谓功能安全? 219
9.2.2) 错误、故障和失败 220
9.2.3) 错误、故障和失败的处理 221
9.2.4) 功能安全标准 225
9.3) 设计原则和架构支持 227
9.3.1) 冗余性 227
9.3.2) 多样性 230
9.3.3) 隔离设计流程 232
9.3.4) 实时处理器:双锁步模式 233
9.3.5) CCF 和系统监控 234
9.3.6) 纠错码 (ECC) 存储器 235
9.3.7) 故障注入和测试 236
9.4) 章节汇总 237
9.5) 参考资料 237
10) 平台管理功能特性 239
10.1) 功耗模式 240
10.1.1) 电池供电模式 240
10.1.2) 低功耗模式 241
10.1.3) 全功耗模式 241
10.1.4) 深度休眠模式 241
10.2) 功耗域 242
10.2.1) 电池功耗域 243
10.2.2) 低功耗域 244
10.2.3) 全功耗域 245
10.2.4) PL 功耗域 246
10.2.5) 其它功耗域 247
10.3) 平台管理单元 247
10.3.1) PMU 处理器 249
10.3.2) 接口与 AXI Interconnect 250
10.3.3) 局部寄存器与全局寄存器 251
10.3.4) 可编程时间间隔定时器 251
10.3.5) 中断 251
10.4) 错误管理 253
10.4.1) 错误状态和使能寄存器 253
10.4.2) 中断错误寄存器 254
10.4.3) 错误处理 254
10.5) PMU 固件 255
10.5.1) PMU 固件的组成 255
10.5.2) 默认模块 256
10.5.3) PMU 固件的执行 257
10.5.4) 定制模式 258
10.6) 章节回顾 258
10.7) 参考资料 259
第三部分:Zynq MPSoC 系统开发 261
11) 硬件系统开发 263
11.1) 利用 Zynq MPSoC 执行异构计算 264
11.2) 硬件系统概述 266
11.2.1) 接口与信号 266
11.2.2) 互连 269
11.2.3) 存储器 272
11.3) PL 交接 273
11.3.1) 嗅探 274
11.3.2) AXI 一致性扩展 (ACE) 接口 274
11.3.3) AXI FIFO 接口 276
11.3.4) PL-FPD AXI 主接口 277
11.3.5) PL-LPD AXI 主接口 277
11.3.6) PL-PS AXI 从接口 278
11.3.7) 选择 PL 接口 278
11.4) 中断系统 280
11.4.1) 中断系统概述 280
11.4.2) 中断类型 281
11.4.3) 中断优先级、状态与处理方式 283
11.4.4) 处理器间中断 284
11.5) 存储器 285
11.5.1) 全局地址空间 285
11.5.2) 片上存储器 286
11.5.3) DDR 存储器接口 287
11.6) 数据移动基础 289
11.6.1) 直接存储器访问 289
11.6.2) AXI Interconnect 291
11.6.3) PS 中的 DMA 控制器 291
11.6.4) 简单的 AXI 通信 293
11.6.5) AXI DMA 294
11.6.6) AXI Video DMA 296
11.7) 章节回顾 298
11.8) 参考资料 298
12) 软件栈 301
12.1) 裸机软件栈 301
12.1.1) 裸机软件栈的作用 302
12.1.2) C 语言标准库 303
12.1.3) 独立库 304
12.1.4) 独立驱动程序 305
12.1.5) 使用方法 305
12.2) FreeRTOS 软件堆栈 307
12.2.1) FreeRTOS 的作用 307
12.2.2) 任务 308
12.2.3) 任务间同步 309
12.2.4) 其它实用工具 311
12.2.5) 使用方法 312
12.3) Linux 软件栈 313
12.3.1) Linux 的作用 314
12.3.2) 内核空间与用户空间的拆分 315
12.3.3) 存储器管理 317
12.3.4) 器件驱动程序 319
12.3.5) 进程管理 322
12.3.6) 进程间通信 324
12.3.7) 使用方法 325
12.3.8) 多媒体软件栈 325
12.4) 章节回顾 326
12.5) 参考资料 327
13) 多处理器开发 331
13.1) 异构处理简介 332
13.1.1) Zynq MPSoC 上的处理器集 332
13.1.2) 拆分软件任务 332
13.1.3) 异构计算概念 334
13.2) 利用 Linux 进行对称多处理 336
13.3) 非对称多处理 339
13.3.1) 利用 OpenAMP 执行无监督 AMP 339
13.3.2) 利用 Xen 虚拟机管理器执行受监督 AMP 344
13.4) 软件定义的无线电应用混合示例 348
13.5) 章节汇总 350
13.6) 参考资料 351
14) 系统启动 353
14.1) 系统启动简介 353
14.2) 非安全启动进程 356
14.2.1) 启动进程概述 356
14.2.2) 启动介质选项 360
14.2.3) 启动镜像搜索 361
14.2.4) 启动镜像格式 361
14.2.5) 利用 Linux/OpenAMP 用例回顾所学 363
14.3) 安全启动流程 364
14.3.1) 安全启动基础 364
14.3.2) 安全启动加密 365
14.3.3) 安全启动镜像格式 369
14.4) 实用非安全器件配置 370
14.4.1) 生成启动镜像 370
14.4.2) 启动镜像编程 371
14.5) 实用安全器件配置 371
14.5.1) 生成启动镜像 372
14.5.2) 器件安全启动配置 374
14.5.3) 维护超出 FSBL 范围的信任链 374
14.6) 章节汇总 375
14.7) 参考资料 375
第四部分:利用赛灵思 SDx 开发环境开展系统设计 377
15) 利用 SDx 开展系统设计的简介 379
15.1) 使用 SDx 的动机 379
15.2) 关于 SDx 381
15.2.1) 开发环境 381
15.2.2) 全系统最优化编译器简介 383
15.2.3) 数据移动网络 383
15.2.4) SDx 工具链定向 386
15.2.5) SDx API 389
15.2.6) SDx 工具链设置 390
15.3) 设计流程 392
15.3.1) SDx 平台 394
15.3.2) 硬件的初始候选功能选择 395
15.3.3) 系统性能估算 396
15.3.4) 系统性能最优化 396
15.3.5) 系统性能分析 397
15.4) SDx 工程层级 398
15.5) 章节回顾 402
15.6) 参考资料 403
16) 利用 SDx 进行系统剖析与加速 405
16.1) 系统剖析 405
16.1.1) 仅限软件的系统剖析 405
16.1.2) 相关性能估算 411
16.1.3) 系统性能测量 412
16.2) 使用可编程逻辑的软件加速 414
16.2.1) IP 核最优化 414
16.2.2) IP 核集成最优化 416
16.3) 章节回顾 421
16.4) 参考资料 422
17) 在 SDx 中复用现有 IP 423
17.1) 创建 C 语言可调用库 423
17.1.1) IP 核要求 424
17.1.2) IP 配置参数 425
17.1.3) 功能定义 425
17.1.4) 功能实参映射 426
17.1.5) sdslib 实用工具 427
17.1.6) 库头文件 428
17.2) 使用 C 语言可调用库 429
17.3) 章节回顾 430
17.4) 参考资料 430
18) 利用 SDx 进行调试和性能监控 431
18.1) 系统仿真 432
18.2) 软件调试 434
18.3) 硬件调试 436
18.4) 性能监控 439
18.4.1) 事件追踪 439
18.4.2) AXI Performance Monitor 441
18.4.3) 处理系统性能监控 444
18.5) 章节回顾 445
18.6) 参考资料 446
19) 定制 SDx 平台 447
19.1) 为何要开发定制 SDx 平台? 447
19.2) SDx 平台结构和组件 448
19.2.1) 元数据文件 450
19.2.2) 样本应用 450
19.3) SDx 平台硬件组件 451
19.3.1) 开发平台硬件设计 451
19.3.2) 平台硬件元数据文件 453
19.4) SDx 平台软件组件 457
19.4.1) 启动文件 457
19.4.2) PetaLinux 工具 465
19.4.3) 启动镜像格式文件 465
19.4.4) 库 466
19.5) SDx 平台样本 应用 467
19.6) sdspfm 实用工具 469
19.7) 预构建硬件 471
19.8) 测试和使用定制 SDx 平台 473
19.9) 章节回顾 474
19.10) 参考资料 474
第五部分:PYNQ 和机器学习应用 479
20) 深度学习 481
20.1) 机器学习已无处不在(或终将如此) 481
20.1.1) 机器学习对比深度学习 481
20.1.2) 机器学习概述 483
20.1.3) 已确立的应用 485
20.1.4) 新兴应用 486
20.1.5) 机器学习平台 489
20.2) 通用神经网络架构 489
20.2.1) 神经元 489
20.2.2) 多层感知机 491
20.2.3) 卷积神经网络 (CNN) 493
20.2.4) 递归神经网络 (RNN) 495
20.3) 训练神经网络 497
20.3.1) 损失函数 498
20.3.2) 反向传输 499
20.3.3) 随机梯度下降法 (SGD) 501
20.3.4) 正则化 502
20.4) 深度学习工具和框架 503
20.5) 加速需求 504
20.5.1) 云应用和边缘应用 504
20.5.2) 压缩技巧 505
20.6) 章节汇总 505
20.7) 参考资料 506
21) 低精度神经网络 509
21.1) 低精度神经网络 509
21.1.1) 何谓“低精度”? 510
21.1.2) 动机 511
21.1.3) 对缩放的影响 511
21.1.4) 神经网络实现选项 513
21.2) FINN-R 简介 514
21.2.1) FINN-R 起源 514
21.2.2) 低精度最优化 514
21.2.3) 架构最优化 514
21.2.4) FINN-R 设计流程 515
21.2.5) 处理 FINN-R 516
21.3) 可编程逻辑上的神经网络 516
21.3.1) 可编程逻辑中的神经元 517
21.3.2) 创建层次 518
21.3.3) 设计方法和工具 520
21.4) FINN-R 案例分析:适用于 Zynq MPSoC 的推断加速器 521
21.5) 章节汇总 522
21.6) 参考资料 523
22) PYNQ 525
22.1) PYNQ 简介 525
22.1.1) PYNQ 作为框架 525
22.1.2) 何谓 PYNQ? 526
22.1.3) 为何使用 Python? 529
22.1.4) PYNQ 的局限 530
22.2) 示例 PYNQ 应用 531
22.2.1) Python 笔记本(仅软件) 534
22.2.2) PYNQ 笔记本(硬件加速) 534
22.2.3) 系统架构(硬件加速版本) 534
22.2.4) 关键观测结果 537
22.3) PYNQ 系统的组件 537
22.3.1) PYNQ 镜像 537
22.3.2) 文件处理 538
22.3.3) 覆盖层 539
22.3.4) Jupyter Notebook 542
22.3.5) 文件和安装 544
22.3.6) 高级用户自定义 545
22.4) PYNQ 工程 546
22.4.1) PYNQ 目标 546
22.4.2) PYNQ 影响 547
22.5) 资源 549
22.5.1) 如何获得 PYNQ? 549
22.5.2) 文档 549
22.5.3) 文件和源代码 550
22.5.4) 硬件 550
22.5.5) 社区资源 550
22.6) 章节汇总 551
22.7) 参考资料 552
23) 案例分析:在 Zynq上使用 PYNQ 为空间应用开发 CNN 原型 . .555
23.1) 设计概念 556
23.2) 利用神经网络进行云检测 556
23.2.1) 算法选择 556
23.2.2) 算法开发 558
23.3) 硬件选择 558
23.3.1) FPGA 选择 558
23.3.2) 发现 PYNQ 560
23.4) 利用 PYNQ 进行云检测 560
23.4.1) 利用 PYNQ 开发原型 560
23.4.2) 结果 561
23.5) 反思与反省 562
23.6) 参考资料 562
第六部分:结论 565
24) 学术案例分析 567
24.1) 嵌入式计算机展望 567
24.1.1) 高级驾驶辅助系统 571
24.2) 航天飞行系统 573
24.3) 机器学习 574
24.4) 章节汇总 578
24.5) 参考资料 578
后记 581
附录:BSD 3 条款许可 583
首字母缩略词列表 585
索引 605
正文待续...
探索 Zynq® MPSoC...