1.2.1 什么是 ZYNQ?
ZYNQ 是 Xilinx(现 AMD)推出的划时代 异构处理平台(Heterogeneous SoC)。它将业界标准的 ARM 处理器系统(PS) 与高性能的 FPGA 可编程逻辑(PL) 无缝集成在一颗芯片内。
当然也有纯ARM加一块纯FPGA的板卡。现在又RK3588+国产FPGA这种架构,因为RK3588资源丰富适合做端侧AI模型。
为什么选择 ZYNQ?
在 ZYNQ 出现之前,嵌入式开发者面临“鱼与熊掌不可兼得”的困境:
- 纯 ARM 处理器(如 Cortex-A 系列)擅长运行 Linux 操作系统、处理网络协议栈和复杂业务逻辑,但在执行并行算法或高速数字信号处理时,算力和灵活性受限。
- 纯 FPGA(如 Spartan-7、Artix-7)擅长执行并发计算和纳秒级实时响应,但通常需要搭配一个外部 MCU 或处理器来进行配置管理和通信,系统复杂度高。
ZYNQ 的横空出世完美解决了这一矛盾,它提供了一个“大脑(ARM)+ 肌肉(FPGA)”的组合:
- ARM 核心负责运行操作系统、用户界面和高层应用,处理复杂的系统管理任务。
- FPGA 逻辑则专注于执行高速、确定性的底层硬件任务,如实时信号采集、协议解析、数据预处理等。
这种架构使得开发者可以在单一芯片上实现软件定义仪器(Software-Defined Instrument ) 的构想——通过软件编程实现示波器、频谱仪、信号发生器等多种硬件仪器的功能。
1.2.2 硬件构成深度解析
ZYNQ的型号有Zynq-7010 或 Zynq-7020 型号的 SoC。其内部结构可以分为两大核心部分:PS(Processing System) 和 PL(Programmable Logic),两者通过高速总线互联。
PS(处理系统)——软件的地盘
PS 部分由经过验证的 ARM 处理子系统构成,是整个 SoC 的控制中心,负责运行嵌入式 Linux 操作系统。
核心配置(Zynq-7010/7020):
- 处理器ARM Cortex-A9 MPCore (双核),最高主频 866MHz,支持 ARMv7-A 架构,集成 NEON 媒体处理引擎和单/双精度浮点单元 (VFPU)。
- 缓存L1 Cache (32KB I + 32KB D,每核);L2 Cache (512KB,共享,支持奇偶校验)。
- 片上存储256KB OCM (On-Chip Memory),用于快速数据缓存或关键代码存放。
- 外部存储DDR3/DDR3L/DDR2 控制器,支持大容量、高带宽的 DDR 内存,是 Linux 系统运行的基础。
- 片上 FlashQuad-SPI, NAND, NOR 接口,用于存放引导程序 (Bootloader) 或 FPGA 配置文件。
- DMA8 通道 DMA 控制器,支持内存到内存、内存到外设的高速数据搬运,减轻 CPU 负担。
丰富的外设接口:
PS 集成了大量标准外设,无需外部芯片即可实现完整的系统功能:
- 通信接口2x 10/100/1000 Tri-Speed Ethernet (带 IEEE 1588v2 PTP 支持),2x USB 2.0 OTG,2x UART,2x CAN 2.0B,2x SPI,2x I2C。
- 存储接口2x SD/SDIO 2.0/MMC 3.31 控制器。
- 通用 I/O54 个灵活复用的 MIO (Multiplexed I/O) 引脚,部分连接到 PL。
- 调试接口
PL(可编程逻辑)——硬件的地盘
PL 部分基于 Xilinx 7-Series FPGA 架构,提供了大规模的可编程逻辑资源,可通过 Verilog/VHDL 编程实现任意数字电路。
核心可配置资源:
- CLB (可配置逻辑块)由 LUT (查表器) + FF (触发器) 组成,用于实现组合逻辑和时序逻辑,构建任意数据通路。
- BRAM (块存储器)36Kb 双端口 RAM,用于高速数据缓存、FIFO、ROM。
- DSP Slices由 18x25 乘法器 + 48位加法器组成,用于高效执行数字信号处理 (DSP) 算法,如滤波、FFT。
- 全局时钟资源时钟管理 (CMT),提供精确、低抖动的时钟分配。
高速外设与接口:
- PCI Express支持 Gen2 x4 或 x8 配置,实现高速主机互联。
- GTX/GTH 收发器高达 12.5 Gb/s 的串行收发器,用于高速数据传输。
- XADC (模数转换器)集成 2 个 12-bit ADC,支持最多 17 路外部差分输入,每秒 1MSPS 采样率,用于模拟信号采集。
- 温度/电压传感器
PS 与 PL 互联的秘密
PS 和 PL 之间通过 AMBA AXI (Advanced eXtensible Interface) 总线架构进行高速通信。这是 ARM 定义的一种高性能、片上总线标准。
- AXI GP (General Purpose)用于 PS CPU 读写 PL 中的寄存器或简单内存。
- AXI HP (High Performance)高速数据通路,支持 DMA,用于大量数据在 PS DDR 和 PL BRAM 之间传输。
- AXI ACP (Accelerator Coherency Port)保持 CPU Cache 与 PL DMA 操作的一致性,实现无缝协同。
为什么要这样设计?
- ARM (PS) 负责“大脑”擅长处理复杂的系统管理、网络协议、用户交互、运行 Linux 操作系统,执行高层业务逻辑。
- FPGA (PL) 负责“肌肉”擅长并行计算、高速数据处理、纳秒级实时响应,执行可被硬件加速的底层、确定性任务。
- 协同工作通过驱动程序和应用程序控制 PL 的行为,而 PL 则通过 AXI 总线将处理后的高速数据实时传递给 PS。两者结合,实现了计算灵活性与执行效率的完美平衡。
1.2.3 ZYNQ 的启动流程
理解 ZYNQ 的启动流程对我们构建系统至关重要,它决定了 SD 卡上文件的存放位置和格式。
ZYNQ 的启动是一个多阶段的过程,通常分为 BootROM、FSBL、U-Boot、Linux Kernel 四个主要步骤:
BootROM (Boot Read-Only Memory)
- 固化在 ZYNQ 芯片内部的引导代码,用户无法修改。
- 读取启动模式引脚 (Boot Mode Pin) 的状态。
- 根据引脚状态,决定从哪里加载第一阶段引导程序 (FSBL)。
(例如:如果是 SD 卡启动,则从 SD 卡的 FAT 分区读取 BOOT.BIN)
FSBL (First Stage Bootloader)
- 初始化 PS 部分的基本硬件:时钟、MIO 引脚、DDR 内存控制器。
- 加载 FPGA 配置比特流 (bitstream) 到 PL,使 PL 开始工作。
- 加载下一个阶段的引导程序 (通常是 U-Boot)。
- 由 Xilinx Vivado 工具根据硬件设计自动生成的小程序。
U-Boot (Universal Boot Loader)
- 从存储介质 (如 SD 卡 FAT 分区) 中读取 Linux 内核镜像 (
Image)。 - 读取设备树 (Device Tree,
.dtb) 文件,用于向内核描述硬件。
- 一个功能强大、通用的引导加载器,可由用户配置和修改。
Linux Kernel (内核)
- 解压内核镜像,初始化所有硬件驱动 (包括 PL 中的自定义硬件)。
- 挂载根文件系统 (Root Filesystem)。
- 启动第一个用户态进程 (init/systemd)。
User Space (用户空间)
systemd (或其他 init 程序) 启动各项系统服务。- 启动 Red Pitaya 的 Nginx Web 服务器、SCPI 接口等应用。
启动流程对我们意味着什么?
这个启动流程直接决定了我们镜像文件的结构:
- BOOT.BIN 必须放在 FAT 分区因为 BootROM 和 FSBL 都从 FAT 格式的存储介质中读取引导文件。我们镜像的第一个分区就是 FAT16,专门用来存放
BOOT.BIN(包含 FSBL 和 U-Boot)。 - Linux 内核和设备树也需要 U-Boot 能读取U-Boot 同样从 FAT 分区加载内核和设备树,因此
Image 和 zynq-7000-redpitaya.dtb 也必须存放在 FAT 分区中。 - 根文件系统使用 ext4当内核启动后,它会通过 U-Boot 传递的参数,去挂载第二个分区(ext4 格式)作为根文件系统,也就是我们通过脚本定制化安装的 Ubuntu 系统。
这就是我们的 .img 文件必须包含一个 FAT16 分区和一个 ext4 分区的根本原因。
推荐合集阅读
👇