← 返回博客
FPGAZynqXilinx嵌入式系统SoCAXI

Zynq 实战 01|架构导论:把 Zynq-7000 拆开看清楚

Zynq 实战 01|架构导论:把 Zynq-7000 拆开看清楚

这是《Zynq FPGA 嵌入式系统设计实战》系列的第 1 篇。 系列目标:从零搭出一个能跑 Linux、能用 PL 做硬件加速、能联网联设备的真实 Zynq 系统。 板子选型:Pynq-Z2(XC7Z020-1CLG400C),工具链 Vivado / Vitis 2023.2

本文不讲”Zynq 是融合 ARM 和 FPGA 的革命性 SoC”这种话。直接拆。


0. 在拆 Zynq 之前,先达成一个共识

很多入门教程把 Zynq 描述成”ARM + FPGA 二合一”。这个说法技术上不算错,但对动手没有任何帮助——它不告诉你:

  • ARM 那边到底跑多快?能挂多大 DDR?OCM 是什么?
  • PL 那边的”FPGA”具体是什么级别的?相比独立 FPGA 缺了什么?
  • PS 和 PL 之间到底有几条总线?哪条快、哪条慢、什么时候用哪条?
  • 我手上这块 7Z020,能不能跑 1080p60 的视频处理?

这些问题不弄清楚,后面任何一篇博客都是空中楼阁。所以这一篇,我们就把 Zynq-7000 的内部结构拆到**“看到端口名就知道它接到哪、带宽多少、谁能访问它”**的颗粒度。


1. Zynq-7000 = PS + PL,但这是物理隔离的两块芯片区域

Zynq-7000 内部并不是把一颗 Cortex-A9 和一片 FPGA 用胶水粘起来。它是在同一硅片上做了两个独立供电、独立时钟域、可以独立工作的子系统:

Zynq-7000 SoC PS (Processing System) • 双核 ARM Cortex-A9 + NEON • L1 32KB I/D × 2 核 • L2 512KB Unified Cache • 256KB OCM 片上 SRAM • DDR3 控制器(最大 1GB) • 千兆 ETH / USB 2.0 / SD • UART / SPI / I2C / CAN VCCPINT 1.0V · 独立时钟域 PL (Programmable Logic) • 7 系列 FPGA fabric (Artix-7 或 Kintex-7) • CLB(LUT6 + FF) • DSP48E1 乘加器 • Block RAM 36Kb • MMCM / PLL 时钟管理 • SelectIO / GTX(部分型号) VCCINT 1.0V · 独立时钟域 AXI 9 端口 两个独立子系统 · 同一片硅 · 通过 AXI 高速互联
图 1. Zynq-7000 顶层架构

关键事实(从 UG585 Zynq-7000 SoC TRM 1.1 节):

子系统是否能独立工作上电顺序
PS✅ 即使 PL 完全没配置,PS 也能正常启动、跑 Linux、用所有 PS 外设PS 先供电、先启动
PL❌ PL 必须由 PS(通过 PCAP 接口)或外部 JTAG 配置后才能工作PS 启动后再配置 PL

🚧 避坑:如果你以为 Zynq 上电后 PS 和 PL 一起复位、一起跑——不是。PL 在你的 FSBL/U-Boot/Linux 主动调用 PCAP 把 bitstream 加载进去之前,是一片完全黑的逻辑。这点决定了后面 boot 流程怎么设计。


2. 把 PS 这边拆开——它是一颗完整的 SoC

PS 不是”一颗 Cortex-A9”。它是一个功能完整、可以独立卖钱的 ARM SoC,自带一整套外设。下面是你买 7Z020 真正能用到的东西:

2.1 处理器(APU = Application Processor Unit)

7Z0107Z020 (Pynq-Z2)7Z045
核心Cortex-A9 ×2Cortex-A9 ×2Cortex-A9 ×2
工艺28nm28nm28nm
最高主频 (-1 速度等级)667 MHz667 MHz800 MHz
最高主频 (-3 速度等级)866 MHz866 MHz1 GHz
L1 Cache32KB I + 32KB D / 核同左同左
L2 Cache512KB unified同左同左
NEON / VFPv3

Pynq-Z2 用的是 XC7Z020-1CLG400C-1 速度等级。所以你能稳定跑到 667 MHz,不是网上经常说的”1GHz”。1GHz 只在 -3 速度等级 7Z020 上能跑。这点在做性能预估的时候很重要——别照抄 datasheet 上的最高数字

2.2 内存子系统

Cortex-A9 #0 L1: 32KB I + 32KB D Cortex-A9 #1 L1: 32KB I + 32KB D L2 Cache (PL310 控制器) 512 KB · 8-way · 32B line · Unified · Write-back OCM 片上 SRAM 256 KB(4 × 64KB block) 可映射至 0x0000_0000 或 0xFFFC_0000 DDR Controller DDR3 / DDR3L / DDR2 / LPDDR2 最高 1066 Mbps · 16/32-bit 最大 1 GB(32-bit 模式) 外设 / SCU / ACP 端口 ⚡ PL 想访问 DDR / OCM?必须通过 AXI 走 PS 内存控制器 PL 没有独立的 DDR 通道——这是 Zynq 设计中最重要的事实之一
图 2. Zynq PS 内存子系统层级

几个真实工程里会反复用到的事实:

  1. OCM 256KB 是 SoC 内部 SRAM。延迟比 DDR 低很多(个位数 cycle vs 数十 cycle),FSBL 启动时就跑在 OCM 上。后面做实时性敏感的小数据交换,把它当 PS-PL 之间的小邮箱很好用。
  2. DDR 控制器只属于 PS。PL 想访问 DDR,必须通过 AXI 接口走 PS 的内存控制器。这是 Zynq 架构最重要的事实之一——PL 没有自己的 DDR 通道。
  3. L2 Cache 容量 512KB 是固定的,没得改。这意味着如果你跑大型数据集(比如视频帧),cache 命中率会很低,性能瓶颈不在 CPU 而在 DDR 带宽。

2.3 PS 自带的外设(IOP = I/O Peripherals)

下面这些都是 PS 那边 hardwired 好的,不消耗 PL 的逻辑资源

  • 2× UART(最高 1Mbps)
  • 2× CAN 2.0B(最高 1Mbps)
  • 2× I2C
  • 2× SPI
  • 2× SD/SDIO(其中一个可启动)
  • 2× USB 2.0 OTG(480 Mbps,不是 USB 3.0)
  • 2× Gigabit Ethernet MAC(GEM,需配合外部 PHY)
  • 4 组 GPIO bank(共 54+ pin,分 MIO 和 EMIO)

🚧 避坑:PS 外设的引脚是通过 MIO(Multiplexed I/O)和 EMIO 输出的。MIO 直接出芯片管脚,不占 PL 资源;EMIO 走 PL fabric 出去,占 PL 引脚和少量逻辑。Pynq-Z2 上很多外设(如 USB、ETH、SD)都用了 MIO;当你需要更多 UART/SPI 时,可以让它们走 EMIO 接到 PL 引脚——但要注意 EMIO 的时序由 PL 的 IO buffer 决定,不能跑到 MIO 那么快。


3. 把 PL 这边拆开——它是 7 系列 FPGA,不多不少

PL 部分就是 Xilinx 7 系列 FPGA 的 fabric,去掉了独立的配置接口(因为配置交给 PS 了)。所以你在网上找到的所有 Artix-7 / Kintex-7 的资料、IP 核、设计经验,100% 适用于 Zynq 的 PL 部分

型号PL 架构LUTFFBRAM (Kb)DSP48E1GTX
7Z010Artix-717,60035,200240800
7Z020 (Pynq-Z2)Artix-753,200106,4005602200
7Z030Kintex-778,600157,2001,0604004
7Z045Kintex-7218,600437,2002,18090016
7Z100Kintex-7277,400554,8003,0202,02016

数据来源:DS190 Zynq-7000 SoC Data Sheet: Overview Table 2 & Table 3。

7Z020 的 PL 资源到底意味着什么?

光看数字没感觉。换成”能塞下什么”:

  • 53,200 LUT ≈ 能跑一个完整的 RISC-V 软核(VexRiscv 大约用 2000-3000 LUT)+ 几路视频通道处理 + DDR 控制器之类
  • 220 个 DSP48E1 ≈ 220 个 25×18 乘加器并行。在 200MHz 下纯算力 ≈ 220 × 200M = 44 GMACs/s。够做实时 1080p Sobel/Canny、几层卷积神经网络的关键层
  • 560 Kb BRAM ≈ 70KB 片上 RAM。一帧 1080p RGB888(~6MB)塞不进 BRAM——你必须用 DDR 做帧缓冲

🚧 避坑:网上很多 Zynq 视觉项目教程上来就说”我们在 PL 里实现 1920×1080 实时滤波”。问题是 BRAM 只够缓存几行像素,所以 PL 必须通过 AXI HP 端口流式读写 DDR——而这一步才是真正的工程难点(带宽规划、行缓冲设计、AXI burst 优化)。后面有专门一篇讲。

时钟资源

PS 提供 4 个用户可配置的 PL 时钟FCLK_CLK0~3,频率范围 0.1MHz ~ 250MHz,由 PS 的 IOPLL 分频出来。日常用 100MHz / 150MHz / 200MHz 比较稳。

PL 内部还可以用 MMCM/PLL(Mixed-Mode Clock Manager)从 FCLK 进一步生成所需时钟。Pynq-Z2 没有外部独立晶振接到 PL,所以所有 PL 时钟都从 PS 来——这是个常被忽略的事实。


4. 最关键的部分——PS ↔ PL 之间到底有几条路?

这是整个 Zynq 架构最重要的一节。掌握这部分,你就理解了 80% 的 Zynq 系统设计。

下面是 7Z020 上 PS 暴露给 PL 的 AXI 端口完整清单(来自 UG585 第 5 章 Interconnect):

端口名称数量方向数据宽度主要用途
M_AXI_GP0/12PS → PL(PS 是 master)32-bitPS 控制 PL 中的从机 IP,比如读写自定义 IP 的寄存器
S_AXI_GP0/12PL → PS(PL 是 master)32-bitPL 反过来访问 PS 的内存空间,带宽较低
S_AXI_HP0/1/2/34PL → PS(PL 是 master)64-bitPL 高速访问 DDR,绕开 cache,最常用于视频/DMA
S_AXI_ACP1PL → PS(PL 是 master)64-bitPL 访问 DDR 时保持 L2 cache 一致性,适合算法加速器

端口选择决策树

PS ↔ PL 通信 谁是发起方? PS 是 master PL 是 master M_AXI_GP0 / GP1 32-bit · ~600 MB/s 控制 PL 中的从机 IP 读写自定义 IP 的寄存器 数据量?是否需要 cache 一致性? PL 访问 DDR / OCM S_AXI_HP0~3 64-bit · ~1.2 GB/s × 4 大数据搬运 视频 / DMA 绕开 cache S_AXI_ACP 64-bit · 走 SCU CPU 强耦合加速器 小数据 · 频繁交换 保 L2 cache 一致 S_AXI_GP 0 / 1 32-bit 小数据 访问 OCM 速记口诀 • 配置寄存器、轻量控制 → GP(GP 总走慢,但够用、简单) • 高带宽流(视频、网络、DMA)→ HP(4 端口共享 DDR 物理带宽 ~4.2 GB/s 上限) • 算法加速器频繁交换中间结果 → ACP(带宽不一定高,但省去手动 flush cache)
图 3. Zynq PS↔PL AXI 端口选择决策树

AXI HP 的真实带宽——一个值得算的账

很多教程会说”AXI HP 带宽 1.2 GB/s”。这个数字对,但没说前提。让我们自己算:

理论峰值带宽 = 数据宽度 × 时钟频率
            = 64 bit × 150 MHz
            = 9600 Mbit/s
            = 1200 MB/s ≈ 1.2 GB/s  (单个 HP 端口)

所以:

  • 频率取决于你给 S_AXI_HP_aclk 喂多快。150 MHz 是常见稳态值,跑到 200 MHz 需要严格的时序约束
  • 这是单端口、理论峰值。实际工程里,由于 DDR 控制器仲裁、burst 长度限制、事务开销,能拿到 60-75% 已经算优秀
  • 4 个 HP 端口共享同一个 DDR 控制器,所以4 端口同时跑不会真的得到 4×1.2GB/s——DDR3-1066 32bit 的物理带宽极限是 ~4.2 GB/s,是 4 个 HP 端口共同的天花板

🚧 避坑:网上有教程说”S_AXI_ACP 比 S_AXI_HP 快”。完全错。ACP 也是 64-bit,频率限制更严(最高 ~150MHz),而且要走 SCU 仲裁,实际带宽常低于 HP。ACP 的价值不在带宽,而在于它走 L2 cache,能避免软件做手动 cache flush/invalidate——对于强 CPU 耦合的小数据加速器很有用,但视频流之类的就别用它。


5. 为什么我们选 Pynq-Z2

回到工具选型。市面上 Zynq 入门板很多,主流的几款:

板子芯片价格区间社区资源配套
Pynq-Z2XC7Z020~150 USD⭐⭐⭐⭐⭐PYNQ Python 框架、官方教程、丰富
ZedBoardXC7Z020~400 USD⭐⭐⭐⭐⭐Avnet 出品,老牌经典,教程多
Zybo Z7-20XC7Z020~300 USD⭐⭐⭐⭐Digilent 出品,HDMI/音频齐全
黑金 AX7020XC7Z020~1500 RMB⭐⭐⭐⭐中文资料丰富,国内首选
微相 Z7-LiteXC7Z020~600 RMB⭐⭐⭐性价比高,迷你尺寸

本系列所有代码以 Pynq-Z2 为目标,但因为大家用的都是 7Z020,约束文件改一下管脚定义就能在其他板子上跑。约束文件我会在每篇里给出,黑金 AX7020 用户只需要换成厂家给的 .xdc 即可。


6. 本篇你应该带走的几个判断

读完这一篇,下次看到任何 Zynq 项目描述,你应该能在 30 秒内回答:

  • 它用的是 7Z010 / 7Z020 / 7Z045 中的哪一档?资源够不够?
  • PS 和 PL 之间用的是 GP / HP / ACP 哪条总线?为什么?
  • 数据流是 PS→PL 还是 PL→PS?需要多大带宽?
  • Cache 一致性在哪一层处理?是软件 flush 还是 ACP 端口处理?
  • 帧缓冲 / 大数据是放在 BRAM、OCM 还是 DDR?

这五个问题就是 Zynq 系统设计的”五件套”。后面每一篇文章本质上都是在解决其中一个或几个问题。


7. 下一篇预告

下一篇 《Zynq 实战 02|搭好你的开发环境:Vivado / Vitis / PetaLinux 2023.2 一次装好不踩坑》,我们会真正动手:

  • Vivado 2023.2 在 Ubuntu 22.04 / Windows 11 上的避坑安装清单
  • License 怎么免费拿到 WebPack 版本(够用 7Z020)
  • Vitis Unified IDE 和老 Vitis Classic 的取舍
  • PetaLinux 2023.2 的 host 依赖(Ubuntu 22.04 上特别坑的几个包)
  • 板子上电、JTAG 连通性、第一次 xsdb 握手验证

参考资料(值得收藏的官方文档)

文档号名称用途
UG585Zynq-7000 SoC Technical Reference ManualZynq 圣经。1800+ 页,所有寄存器、所有外设的细节都在里面
DS190Zynq-7000 SoC Data Sheet: Overview选型必看,资源数字、速度等级
DS191/187Zynq-7000 SoC DC and AC Switching Characteristics时序参数
UG933Vivado Design Suite User Guide: I/O and Clock PlanningPL 时钟规划
UG761AXI Reference GuideAXI 协议入门必看
PG059AXI Interconnect Product GuideAXI Interconnect IP 用法

所有文档都可以在 AMD/Xilinx 官网 免费下载。


这是《Zynq FPGA 嵌入式系统设计实战》系列第 1 篇。 本系列将持续更新,覆盖从架构、开发环境、AXI 设计、PetaLinux 到完整项目实战的全流程。 如果你也在踩 Zynq 的坑,欢迎留言交流。