SoC FPGA嵌入式设计和开发教程 作者:梅雪松,宋士权,陈云龙编著 出版时间: 2019年版 内容简介 本书以Intel Cyclone v SoC FPGA系列器件为例,介绍了SoC FPGA 器件的架构特点、常用电路设计以及软硬件开发流程和开发技巧。内容编排按照开发一个基于SoC FPGA 的应用系统所需掌握的基本的知识路线展开,从基本的Linux系统操作到分析一个基础的应用系统框架,然后基于该应用系统框架,详细讲解应用系统的构建、BSP文件的生成、启动引导文件的更新、Ubuntu虚拟机安装配置、Linux内核配置与编译。接着介绍如何在嵌入式Linux系统环境下,使用虚拟地址映射的方式编写相应的应用程序来实现该应用系统中各个功能IP的编程控制和调试。最后以两个实际的例子展示如何通过HPS和FPGA的片上通信桥实现软硬件联合开发的过程,包括FPGA侧逻辑开发, IP总线封装,Linux驱动程序的编写编译,Linux应用程序的编写与运行等。本书既可作为工程类应用、电子信息类专业本科生以及相关专业专科生的嵌入式系统基础类课程的教材,也可作为SoC FPGA自学人员以及从事SoC FPGA开发的工程技术人员的培训教材和参考用书。 目录 第1章 SoC FPGA软硬件系统开发概述 … 1 1.1 Intel SoC FPGA系列 1 1.1.1 Cyclone Ⅴ SoC FPGA … 2 1.1.2 Arria Ⅴ SoC FPGA 2 1.1.3 Arria 10 SoC FPGA 2 1.1.4 Stratix 10 SoC FPGA 3 1.1.5 SoC FPGA应用领域与前景 3 1.2 Intel Cyclone Ⅴ SoC FPGA介绍 … 4 1.2.1 什么是SoC FPGA … 4 1.2.2 SOPC … 4 1.2.3 SoC FPGA与SOPC之间的差异 5 1.2.4 SoC FPGA架构的优势 … 6 1.3 Cyclone Ⅴ SoC FPGA器件硬件设计概述 9 1.3.1 FPGA I/O和时钟 … 10 1.3.2 SoC FPGA JTAG电路设计 … 12 1.4 AC501-SoC开发板介绍 13 1.4.1 布局及组件 … 13 1.4.2 轻触按键 14 1.4.3 用户LED 15 1.4.4 时钟输入 16 1.4.5 GPIO接口 … 17 1.4.6 DDR3SDRAM 18 1.4.7 通用显示扩展接口… 19 1.4.8 USB转 UART 21 1.4.9 以太网收发器 21 1.5 本章小结 23 第2章 SoC FPGA开发板的使用 … 24 2.1 安装SoC FPGA开发工具 24 2.2 SoC FPGA的配置数据烧写与固化 24 2.2.1 SoC FPGA启动配置方式介绍 24 2.2.2 sof文件的烧写方式 26 2.2.3 Jic文件的生成和烧写 … 28 2.3 在SoC FPGA上运行Linux操作系统 … 32 2.3.1 SoC FPGA中的 HPS启动流程介绍 32 2.3.2 HPS启动方式介绍 33 2.3.3 制作启动镜像SD卡 34 2.3.4 准备硬件板卡 35 2.3.5 开机测试 39 2.4 开发板Linux系统常用操作 … 40 2.4.1 查看目录 40 2.4.2 设置和修改用户密码 40 2.4.3 查看和编辑文件 … 41 2.4.4 设置IP地址 … 43 2.4.5 挂载SD卡的FAT32分区 45 2.4.6 挂载 U盘 46 2.4.7 文件操作 47 2.4.8 目录操作 48 2.4.9 停止某个进程 49 2.4.10 重启和关机 … 50 2.5 本章小结 50 第3章 SoC FPGA开发概述 … 51 3.1 SoC FPGA开发流程 … 51 3.1.1 硬件开发 51 3.1.2 软件开发 53 3.2 AC501-SoC FPGA开发板的黄金参考设计说明 53 3.2.1 GHRD … 53 3.2.2 打开和查看GHRD 54 3.2.3 组件参数配置详解… 57 3.3 本章小结 62 第4章 手把手修改GHRD系统 63 4.1 修改GHRD工程 … 63 4.1.1 打开GHRD工程 … 63 4.1.2 添加UART IP 64 4.1.3 关于 HPS与FPGA数据交互… 64 4.1.4 连接UART IP信号端口 65 4.1.5 分配组件基地址 … 67 4.1.6 生成 Qsys系统的 HDL文件 … 68 4.1.7 添加uart_1的端口到 Quartus工程中 69 4.1.8 分配FPGA引脚 … 71 4.1.9 生成配置数据二进制文件 72 4.2 制作Preloader Image … 72 4.2.1 打开SoC EDS工具 73 4.2.2 生成bsp文件 74 4.2.3 编译Preloader和 U-Boot 77 4.2.4 更新Preloader和 U-Boot 79 4.2.5 Win 10下更新失败问题… 80 4.2.6 使用新的 U-Boot启动SoC … 81 4.3 制作设备树 … 82 4.3.1 设备树制作流程 … 82 4.3.2 准备所需文件 82 4.3.3 生成.dts文件 83 4.3.4 生成.dtb文件 84 4.4 运行修改后的工程 85 4.5 本章小结 87 第5章 使用DS-5编写和调试SoC的Linux应用程序 88 5.1 启动DS-5 …88 5.2 创建C工程 … 91 5.3 编译工程 94 5.4 建立SSH远程连接 95 5.4.1 创建远程连接 95 5.4.2 复制文件到目标板 101 5.4.3 运行应用程序 102 5.5 远程调试 … 103 5.5.1 GDB设置 … 103 5.5.2 GDB连接和调试 … 106 5.6 使用 WinSCP实现多系统传输文件 108 5.6.1 为什么要使用 WinSCP 108 5.6.2 安装 WinSCP 109 5.6.3 建立远程主机连接 109 5.6.4 新建远程连接 112 5.6.5 调用PuTTY终端 112 5.7 本章小结 … 113 第6章 基于虚拟地址映射的Linux硬件编程 114 6.1 什么是虚拟地址映射 … 114 6.2 虚拟地址映射的实现 … 115 6.3 基于虚拟地址映射的PIO编程应用 117 6.3.1 PIO外设的虚拟地址映射 117 6.3.2 在DS-5中建立PIO应用工程 118 6.3.3 添加和包含 HPS库文件 119 6.3.4 添加FPGA侧外设硬件信息… 121 6.3.5 PIO IP核介绍 124 6.3.6 PIO核寄存器映射 125 6.3.7 PIO IP核应用实例 128 6.3.8 合理的程序退出机制 … 131 6.3.9 关于按键消抖 133 6.4 基于虚拟地址映射的 UART编程应用… 134 6.4.1 UART核介绍 134 6.4.2 UART寄存器映射 134 6.4.3 UART IP核应用实例 … 136 6.4.4 UART IP核板级调试 … 144 6.4.5 小 结 145 6.5 基于虚拟地址映射的I2C编程应用 145 6.5.1 OpenCores I2C IP简介… 146 6.5.2 OpenCores I2C IP寄存器映射 146 6.5.3 I2C IP核应用实例 149 6.5.4 小 结 161 6.6 本章小结 … 161 第7章 基于Linux应用程序的HPS配置 FPGA … 162 7.1 制作 Quartus工程 163 7.2 生成rbf格式配置数据 163 7.3 编译Linux配置FPGA应用程序… 165 7.4 在系统重配置FPGA实验 … 166 7.5 本章小结 … 168 第8章 编译嵌入式Linux系统内核 169 8.1 安装 VMware … 170 8.2 安装 Ubuntu系统 171 8.2.1 使用现成的 Ubuntu系统镜像 171 8.2.2 安装全新的 Ubuntu系统 175 8.3 下载Linux系统源码 … 182 8.4 设置交叉编译环境 185 8.5 配置和编译内核 … 189 8.5.1 快速配置内核 189 8.5.2 保存内核配置文件 195 8.5.3 编译内核 195 8.5.4 使用内核启动开发板 … 197 8.6 本章小结 … 199 第9章 Linux设备树的原理与应用实例 200 9.1 什么是设备树 200 9.2 设备树基本格式 … 201 9.3 设备树加载设备驱动原理 … 206 9.4 编写I2C控制器设备节点 … 208 9.5 加载 OC_I2C驱动 211 9.6 使用RTC … 212 9.7 使用EEPROM … 216 9.8 编写SPI控制器设备节点 … 217 9.9 本章小结 … 219 第10章 基于Linux标准文件I/O 的设备读/写 … 220 10.1 什么是文件I/O 220 10.2 基于文件I/O操作的一般方法 … 220 10.2.1 文件描述符 220 10.2.2 打开设备(open)… 221 10.2.3 向设备写入数据(write) 221 10.2.4 读取设备数据(read)… 222 10.2.5 杂项操作(ioctl)… 222 10.2.6 关闭设备(close)… 223 10.2.7 其他操作 … 223 10.3 使用文件I/O实现I2C编程 223 10.4 本章小结 … 226 第11章 FPGA与HPS高速数据交互应用 … 227 11.1 FPGA与 HPS通信介绍 … 227 11.1.1 H2F_LW_AXI_Master桥 … 229 11.1.2 H2F_AXI_Master桥 … 229 11.1.3 F2H_AXI_Slave桥 230 11.2 AXI与 Avalon-MM 总线的互联… 230 11.3 Avalon-MM 总线 230 11.4 Avalon-MM Slave接口 232 11.5 基本Avalon-MM Slave IP设计框架 … 234 11.5.1 端口定义 … 234 11.5.2 寄存器和线网定义 235 11.5.3 Avalon总线对寄存器的读/写 235 11.5.4 用户逻辑使用寄存器 … 236 11.6 PWM 控制器设计 237 11.6.1 PWM IP核端口设计 … 238 11.6.2 PWM IP核寄存器定义 239 11.6.3 读/写PWM 寄存器 … 239 11.6.4 Platform Designer中封装PWM IP 241 11.7 Avalon-MM Master接口 … 255 11.7.1 常见的通用Avalon-MM Master主机 … 256 11.7.2 DMA Controller 256 11.7.3 Scatter-Gather DMA Controller … 256 11.7.4 Modular Scatter-Gather DMA 258 11.7.5 Avalon-MM Master模板 … 260 11.8 高速数据采集系统 … 263 11.8.1 安装Avalon-MM Master模板 263 11.8.2 完善 Qsys系统 … 265 11.8.3 修改 Quartus中的 Qsys例化 269 11.8.4 测试逻辑设计 … 271 11.9 本章小结 … 275 第12章 Linux驱动编写与编译 … 276 12.1 基本字符型设备驱动… 276 12.1.1 字符型设备驱动框架 … 277 12.1.2 PWM 控制器驱动的完整源码 286 12.1.3 驱动编译 Makefile 291 12.1.4 Ubuntu下编译设备驱动 292 12.1.5 字符型设备驱动验证 … 293 12.2 基于DMA的字符型设备驱动 … 297 12.2.1 Avalon-MM Master Write驱动 … 298 12.2.2 Avalon-MM Master Write测试 … 304 12.3 本章小结 … 311 附录A 外设地址映射 312 附录B HPS GPIO映射 … 314
|