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 用胶水粘起来。它是在同一硅片上做了两个独立供电、独立时钟域、可以独立工作的子系统:
关键事实(从 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)
| 项 | 7Z010 | 7Z020 (Pynq-Z2) | 7Z045 |
|---|---|---|---|
| 核心 | Cortex-A9 ×2 | Cortex-A9 ×2 | Cortex-A9 ×2 |
| 工艺 | 28nm | 28nm | 28nm |
| 最高主频 (-1 速度等级) | 667 MHz | 667 MHz | 800 MHz |
| 最高主频 (-3 速度等级) | 866 MHz | 866 MHz | 1 GHz |
| L1 Cache | 32KB I + 32KB D / 核 | 同左 | 同左 |
| L2 Cache | 512KB unified | 同左 | 同左 |
| NEON / VFPv3 | ✅ | ✅ | ✅ |
Pynq-Z2 用的是 XC7Z020-1CLG400C,-1 速度等级。所以你能稳定跑到 667 MHz,不是网上经常说的”1GHz”。1GHz 只在 -3 速度等级 7Z020 上能跑。这点在做性能预估的时候很重要——别照抄 datasheet 上的最高数字。
2.2 内存子系统
几个真实工程里会反复用到的事实:
- OCM 256KB 是 SoC 内部 SRAM。延迟比 DDR 低很多(个位数 cycle vs 数十 cycle),FSBL 启动时就跑在 OCM 上。后面做实时性敏感的小数据交换,把它当 PS-PL 之间的小邮箱很好用。
- DDR 控制器只属于 PS。PL 想访问 DDR,必须通过 AXI 接口走 PS 的内存控制器。这是 Zynq 架构最重要的事实之一——PL 没有自己的 DDR 通道。
- 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 架构 | LUT | FF | BRAM (Kb) | DSP48E1 | GTX |
|---|---|---|---|---|---|---|
| 7Z010 | Artix-7 | 17,600 | 35,200 | 240 | 80 | 0 |
| 7Z020 (Pynq-Z2) | Artix-7 | 53,200 | 106,400 | 560 | 220 | 0 |
| 7Z030 | Kintex-7 | 78,600 | 157,200 | 1,060 | 400 | 4 |
| 7Z045 | Kintex-7 | 218,600 | 437,200 | 2,180 | 900 | 16 |
| 7Z100 | Kintex-7 | 277,400 | 554,800 | 3,020 | 2,020 | 16 |
数据来源: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/1 | 2 | PS → PL(PS 是 master) | 32-bit | PS 控制 PL 中的从机 IP,比如读写自定义 IP 的寄存器 |
| S_AXI_GP0/1 | 2 | PL → PS(PL 是 master) | 32-bit | PL 反过来访问 PS 的内存空间,带宽较低 |
| S_AXI_HP0/1/2/3 | 4 | PL → PS(PL 是 master) | 64-bit | PL 高速访问 DDR,绕开 cache,最常用于视频/DMA |
| S_AXI_ACP | 1 | PL → PS(PL 是 master) | 64-bit | PL 访问 DDR 时保持 L2 cache 一致性,适合算法加速器 |
端口选择决策树
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-Z2 | XC7Z020 | ~150 USD | ⭐⭐⭐⭐⭐ | PYNQ Python 框架、官方教程、丰富 |
| ZedBoard | XC7Z020 | ~400 USD | ⭐⭐⭐⭐⭐ | Avnet 出品,老牌经典,教程多 |
| Zybo Z7-20 | XC7Z020 | ~300 USD | ⭐⭐⭐⭐ | Digilent 出品,HDMI/音频齐全 |
| 黑金 AX7020 | XC7Z020 | ~1500 RMB | ⭐⭐⭐⭐ | 中文资料丰富,国内首选 |
| 微相 Z7-Lite | XC7Z020 | ~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握手验证
参考资料(值得收藏的官方文档)
| 文档号 | 名称 | 用途 |
|---|---|---|
| UG585 | Zynq-7000 SoC Technical Reference Manual | Zynq 圣经。1800+ 页,所有寄存器、所有外设的细节都在里面 |
| DS190 | Zynq-7000 SoC Data Sheet: Overview | 选型必看,资源数字、速度等级 |
| DS191/187 | Zynq-7000 SoC DC and AC Switching Characteristics | 时序参数 |
| UG933 | Vivado Design Suite User Guide: I/O and Clock Planning | PL 时钟规划 |
| UG761 | AXI Reference Guide | AXI 协议入门必看 |
| PG059 | AXI Interconnect Product Guide | AXI Interconnect IP 用法 |
所有文档都可以在 AMD/Xilinx 官网 免费下载。
这是《Zynq FPGA 嵌入式系统设计实战》系列第 1 篇。 本系列将持续更新,覆盖从架构、开发环境、AXI 设计、PetaLinux 到完整项目实战的全流程。 如果你也在踩 Zynq 的坑,欢迎留言交流。