当前位置:首页>Linux>【FPGA linux系列】:1.2 ZYNQ 异构平台简介:软件定义仪器的硬件基石

【FPGA linux系列】:1.2 ZYNQ 异构平台简介:软件定义仪器的硬件基石

  • 2026-09-09 12:16:41
【FPGA linux系列】:1.2 ZYNQ 异构平台简介:软件定义仪器的硬件基石

源码资源:

1、【LVDS工程源码】

2、【CORDIC工程源码】

3、【源码]FIR + EMA零 DSP,适用于极低资源消耗】

导读:上一节我们探讨了嵌入式 Linux 的基本概念,知道了“系统构建”的必要性。本节将深入我们项目的核心硬件载体——Xilinx Zynq-7000 异构 SoC。理解 ZYNQ 的 PS(处理系统)与 PL(可编程逻辑)协同工作机制,是掌握本项目构建流程和后续软件定制的关键。

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 系统运行的基础。
  • 片上 Flash
    Quad-SPI, NAND, NOR 接口,用于存放引导程序 (Bootloader) 或 FPGA 配置文件。
  • DMA
    8 通道 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/O
    54 个灵活复用的 MIO (Multiplexed I/O) 引脚,部分连接到 PL。
  • 调试接口
    JTAG (ARM CoreSight)。

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 四个主要步骤:

  1. BootROM (Boot Read-Only Memory)

    • 固化在 ZYNQ 芯片内部的引导代码,用户无法修改。
    • 读取启动模式引脚 (Boot Mode Pin) 的状态。
    • 根据引脚状态,决定从哪里加载第一阶段引导程序 (FSBL)。
      (例如:如果是 SD 卡启动,则从 SD 卡的 FAT 分区读取 BOOT.BIN)
  2. FSBL (First Stage Bootloader)

    • 初始化 PS 部分的基本硬件:时钟、MIO 引脚、DDR 内存控制器。
    • 加载 FPGA 配置比特流 (bitstream) 到 PL,使 PL 开始工作。
    • 加载下一个阶段的引导程序 (通常是 U-Boot)。
    • 由 Xilinx Vivado 工具根据硬件设计自动生成的小程序。
    • 最终会跳转到 U-Boot 的入口地址。
  3. U-Boot (Universal Boot Loader)

    • 进一步初始化硬件 (如以太网、串口等)。
    • 从存储介质 (如 SD 卡 FAT 分区) 中读取 Linux 内核镜像 (Image)。
    • 读取设备树 (Device Tree, .dtb) 文件,用于向内核描述硬件。
    • 设置内核启动参数 (cmdline)。
    • 跳转到内核入口地址,启动 Linux。
    • 一个功能强大、通用的引导加载器,可由用户配置和修改。
  1. Linux Kernel (内核)

    • 操作系统的核心。
    • 解压内核镜像,初始化所有硬件驱动 (包括 PL 中的自定义硬件)。
    • 挂载根文件系统 (Root Filesystem)。
    • 启动第一个用户态进程 (init/systemd)。
  2. User Space (用户空间)

    • systemd (或其他 init 程序) 启动各项系统服务。
    • 启动 Red Pitaya 的 Nginx Web 服务器、SCPI 接口等应用。
    • 最终进入用户登录界面或直接运行应用。

启动流程对我们意味着什么?

这个启动流程直接决定了我们镜像文件的结构:

  1. BOOT.BIN 必须放在 FAT 分区
    因为 BootROM 和 FSBL 都从 FAT 格式的存储介质中读取引导文件。我们镜像的第一个分区就是 FAT16,专门用来存放 BOOT.BIN(包含 FSBL 和 U-Boot)。
  2. Linux 内核和设备树也需要 U-Boot 能读取
    U-Boot 同样从 FAT 分区加载内核和设备树,因此 Image 和 zynq-7000-redpitaya.dtb 也必须存放在 FAT 分区中。
  3. 根文件系统使用 ext4
    当内核启动后,它会通过 U-Boot 传递的参数,去挂载第二个分区(ext4 格式)作为根文件系统,也就是我们通过脚本定制化安装的 Ubuntu 系统。

这就是我们的 .img 文件必须包含一个 FAT16 分区和一个 ext4 分区的根本原因。

✨ 如果本文对你有帮助

  • 点赞支持,让更多人看到
  • 收藏起来,随时查阅
  • 留言讨论,分享你的使用经验
  • 关注我们,获取更多嵌入式实战干货
  • 感谢阅读!我们下一篇文章见!

推荐合集阅读

👇


嵌入式-实用的FreeRTOS学习指南

人工智能合集

FPGA技术分享

latex教程

LVDS


下载资料请扫码进小程序,正在内测中.......

最新文章

随机文章