第1章 FPGA高阶设计方法\t001
1.1 可编程逻辑设计原则\t001
1.1.1 面积与速度互换原则\t001
1.1.2 数字电路硬件原则\t005
1.1.3 系统设计原则\t006
1.1.4 同步设计原则\t008
1.2 可编程逻辑常用设计思想和技巧\t009
1.2.1 乒乓操作\t009
1.2.2 串并转换\t009
1.2.3 流水操作\t009
1.2.4 异步时钟域的数据同步\t010
1.2.5 英特尔推荐的Coding Style\t011
1.3 英特尔FPGA器件的高级特性与应用\t015
1.3.1 时钟管理\t015
1.3.2 片内存储器\t021
1.3.3 数字信号处理\t024
1.3.4 片外存储器\t028
1.3.5 高速差分接口\t031
1.3.6 高速串行收发器\t031
1.4 时序约束与时序分析\t032
1.4.1 时序约束和分析基础\t032
1.4.2 高级时序分析\t037
1.5 区域约束\t041
1.5.1 Logic Lock设计方法简介\t041
1.5.2 Logic Lock区域\t042
1.6 命令行与Tcl脚本\t047
1.6.1 命令行\t047
1.6.2 Tcl基础知识\t049
1.6.3 创建和执行Tcl脚本\t052
1.6.4 Tcl脚本实验\t053
1.7 FPGA系统设计技术\t059
1.7.1 信号完整性设计\t059
1.7.2 电源完整性设计\t066
1.7.3 高速I/O设计\t068
1.7.4 高速I/O的PCB设计\t071
第2章 基于FPGA的SOPC设计\t074
2.1 SOPC开发流程\t075
2.1.1 硬件开发流程\t076
2.1.2 软件开发流程\t076
2.2 系统集成工具Qsys\t076
2.2.1 Qsys简介\t076
2.2.2 Qsys系统设计流程\t079
2.2.3 Qsys用户界面\t079
2.2.4 用户自定义元件\t085
2.3 Nios嵌入式处理器\t087
2.3.1 第一代Nios嵌入式处理器\t087
2.3.2 第二代Nios嵌入式处理器\t087
2.3.3 可配置的软核嵌入式处理器的优势\t088
2.3.4 软件设计实例\t091
2.3.5 HAL系统库\t106
2.4 基于FPGA的SOPC设计实验\t112
2.4.1 实验一:流水灯实验\t112
2.4.2 实验二:中断控制实验\t145
2.4.3 实验三:定时器实验\t149
第3章 基于FPGA的SoC设计\t154
3.1 SoC FPGA简介\t154
3.2 英特尔SoC FPGA的特点\t156
3.3 Cyclone Ⅴ SoC FPGA资源组成\t161
3.4 开发SoC FPGA所需的工具\t168
3.4.1 Quartus Prime\t168
3.4.2 SoC EDS\t175
3.5 SoC FPGA中HPS与FPGA的接口\t182
3.5.1 H2F_AXI_Master\t183
3.5.2 F2H_AXI_Slave\t183
3.5.3 H2F_LW_AXI_Master\t183
3.5.4 连接AXI总线与Avalon-MM总线\t183
3.5.5 MPU外设地址映射\t184
3.6 SoC FPGA开发\t185
3.6.1 SoC FPGA开发流程\t185
3.6.2 SoC FPGA启动过程\t186
3.6.3 使用GHRD\t187
3.6.4 生成Preloader Image\t196
3.6.5 编译生成u-boot文件\t202
3.6.6 生成Root Filesystem\t204
3.6.7 配置和编译Linux内核\t215
3.6.8 系统镜像制作及刻录方法\t221
3.6 9 DS-5程序的编写、调试及运行\t230
3.7 Linux相关知识\t237
3.7.1 安装Ubuntu虚拟机\t237
3.7.2 下载Linux系统源码\t242
3.8 常见问题\t245
3.9 基于FPGA的SoC设计实验\t246
3.9.1 实验一:生成Preloader源码\t246
3.9.2 实验二:编译Preloader源码\t249
3.9.3 实验三:编译生成u-boot文件\t252
3.9.4 实验四:配置和编译Linux内核\t255
第4章 基于FPGA的HLS技术与应用\t260
4.1 HLS简介\t260
4.2 优化的依据\t260
4.3 循环优化\t263
4.3.1 并行与管道\t263
4.3.2 性能度量\t265
4.3.3 循环依赖\t268
4.3.4 明确循环的退出条件\t272
4.3.5 线性操作\t272
4.3.6 循环展开\t273
4.3.7 嵌套循环\t276
4.4 代码优化\t277
4.4.1 避免指针别名\t277
4.4.2 最小化内存依赖\t277
4.4.3 将嵌套循环改为单层循环\t278
4.5 指令优化\t278
4.5.1 ivdep指令\t279
4.5.2 loop_coalesce指令\t280
4.5.3 ii和max_concurrency指令\t281
4.6 内存优化\t281
4.6.1 本地内存\t281
4.6.2 内存架构\t282
4.6.3 本地内存的属性\t289
4.6.4 静态变量\t294
4.6.5 寄存器的使用\t295
4.7 接口优化\t295
4.7.1 标准接口\t295
4.7.2 Avalon MM Master接口\t297
4.7.3 Avalon MM Slave接口\t298
4.7.4 流式接口\t300
4.7.5 不使用指针的标准接口\t302
4.8 数据类型优化\t303
4.8.1 任意精度的整数\t304
4.8.2 任意精度的定点数\t304
4.8.3 特殊数据类型与普通数据类型之间的转换\t306
4.9 浮点运算优化\t306
4.10 其他优化建议\t308
4.11 基于FPGA的HLS实验\t308
4.11.1 实验一:简单的乘法器\t309
4.11.2 实验二:接口\t318
4.11.3 实验三:循环优化\t330
第5章 基于FPGA的OpenCL技术与应用\t336
5.1 OpenCL简介\t336
5.2 OpenCL环境搭建\t337
5.3 OpenCL基本架构\t339
5.3.1 平台模型\t340
5.3.2 执行模型\t340
5.3.3 存储模型\t342
5.3.4 执行流程\t342
5.4 OpenCL主机端程序设计\t343
5.4.1 OpenCL平台\t343
5.4.2 OpenCL设备\t344
5.4.3 OpenCL上下文\t347
5.4.4 OpenCL命令队列\t349
5.4.5 OpenCL程序对象\t351
5.4.6 OpenCL内核对象\t355
5.4.7 OpenCL对象回收与错误处理\t359
5.5 OpenCL设备端程序设计\t362
5.5.1 基本语法和关键字\t362
5.5.2 数据类型\t364
5.5.3 维度和工作项\t367
5.5.4 其他注意事项\t369
5.6 OpenCL常用优化方法\t369
5.6.1 单工作项优化\t369
5.6.2 循环优化\t374
5.6.3 任务并行优化\t380
5.6.4 NDRange类型内核的优化\t391
5.6.5 内存访问优化\t398
5.7 OpenCL编程原则\t414
5.7.1 避免“昂贵”的函数和方法\t414
5.7.2 使用“廉价”的数据类型\t415
5.8 基于FPGA的OpenCL实验\t415
5.8.1 准备工作\t415
5.8.2 实验一:hello\t417
5.8.3 实验二:platform\t420
5.8.4 实验三:device\t424
5.8.5 实验四:ctxt_and_queue\t437
5.8.6 实验五:program_and_kernel\t442
5.8.7 实验六:sample\t450
5.8.8 实验七:first\t453
第6章 基于FPGA的OpenVINO人工智能应用\t456
6.1 OpenVINO简介\t456
6.1.1 OpenVINO工具套件堆栈\t457
6.1.2 OpenVINO的优势\t458
6.1.3 应用前景\t458
6.2 OpenVINO的安装与验证\t458
6.2.1 安装步骤\t459
6.2.2 验证安装结果\t461
6.3 OpenVINO中的模型优化器\t463
6.3.1 模型优化器的作用\t464
6.3.2 优化模型\t464
6.3.3 模型优化器高级应用\t473
6.3.4 模型优化器定制层\t486
6.4 OpenVINO深度学习推理引擎\t487
6.4.1 推理引擎简介\t487
6.4.2 推理引擎的组成\t488
6.4.3 推理引擎的使用方法\t489
6.4.4 扩展推理引擎内核\t489
6.4.5 集成推理引擎\t498
6.4.6 神经网络构建器\t502
6.4.7 动态批处理\t505
6.4.8 形状推理\t507
6.4.9 低精度8位整数推理\t509
6.4.10 模型转换验证\t511