ZYNQ架构的介绍
一颗芯片里面,同时塞进去一套完整 ARM 计算机(PS)+ 一块 FPGA(PL),芯片内部通过硬件线路把两者紧紧连在一起,合二为一,名字叫 All‑Programmable SoC,全可编程片上系统。
PS Processing System 处理系统(ARM 侧,硬核固化)
PS 内部包含 4 大块硬件资源:
- APU 处理器单元:例如,双核 Cortex‑A9 ARM CPU,我们写的 C 语言裸机代码、Linux 系统,就在这里执行。
- 内存控制器(DDR 控制器):DDR3或者DDR4,程序、数据都放在 DDR。
- 一堆硬件外设(硬核):UART 串口、网口、SD 卡、I2C、SPI、CAN、USB、GPIO (MIO)、XADC,全部硬件做好,不需要 FPGA 逻辑。
- PS 内部互联总线(AXI):CPU、DDR、各个外设,内部互相通信。
PL(Programmable Logic,可编程逻辑)------FPGA 部分
就像一块空白的电路板,你写 Verilog 代码,编译生成 bit 文件,烧写进去,就能搭出自定义硬件电路。
PL 里面有什么硬件资源:
- CLB(LUT、触发器):做普通逻辑电路;
- BRAM(Block RAM 块 RAM):片上 RAM 存储器
- DSP 切片:做高速乘法、数字运算;
- IO 引脚:芯片外部引脚,可以接 LED、摄像头等外部器件。
Vivado 的 Block Design(BD 框图),添加的 AXI‑GPIO、AXI‑BRAM‑Controller 这些 IP,全部是部署在 PL 里面的硬件电路。
PS与PL之间的通信
AXI 高速总线通道
芯片硬件已经做好,PS 与 PL 之间的高速数据线全部是 AXI 协议,分为三类端口:

关键点:
- PS 访问 PL 的 IP(AXI‑GPIO、AXI‑BRAM‑Controller):走GP 端口;
- PL 要直接读写 DDR 内存(DMA、摄像头 VDMA):走HP 端口。
所有挂在 AXI 总线上的 PL 端 IP(AXI‑BRAM 控制器、AXI‑DMA),本质上是 PL 里的硬件,通过芯片这几根 AXI 物理导线和 PS 对话。 BRAM 本身只是 PL 内部的存储,BRAM 不直接连 PS,必须经过 AXI‑BRAM 控制器再接 AXI 总线。
普通离散信号线(不走 AXI,只是电平 / 脉冲信号)
1、EMIO 扩展 IO PS 内部 GPIO 控制器,可以拉出最多 64 根普通的 0/1 电平信号线,连接到 PL。PS 软件可以读写这些电平;PL 逻辑也可以驱动这些电平。
2、PL→PS 中断信号 PL 内部逻辑产生脉冲信号,直接送给 PS 的 GIC 中断控制器。
PL端的几种与PS端连接的IP说明
AXI Interconnect(AXI 互联 IP,总线交换机)
类比:路由器 / 多路开关矩阵
作用:AXI 总线的路由、仲裁、地址译码
- 一边接 1 个或者多个 AXI Master(主机,比如 PS 的 AXI GP 口)
- 另一边接多个 AXI Slave(从机:AXI-GPIO、AXI-BRAM-CTRL 等)
- 当多个主机同时发总线请求时,它做仲裁,防止总线冲突;同时给每个从设备分配一段独立地址空间。
AXI GPIO
类比:可被 AXI 总线控制的扩展 IO 口
- 接口:AXI4-Lite(寄存器型低速总线)
- 作用:PS 通过读写 AXI 寄存器,控制 PL 上引出的 GPIO 引脚:输出高低电平(点灯)、读取按键输入、支持引脚中断AMD
- 区分:
- PS 端 MIO/EMIO GPIO:是 PS 硬核自带;
- AXI GPIO:PL 里搭出来的软 IP GPIO,引脚数量可以灵活扩展,走 AXI 总线访问。
AXI DMA / AXI VDMA
DMA = Direct Memory Access,直接内存访问
核心思想:搬运数据不用 CPU(A9)反复介入,减轻 ARM 负担,高速搬大块数据
- AXI DMA:通用 DMA 负责 DDR 内存 ↔ AXI4-Stream 数据流之间传输;适合 AD 采样、高速串口、普通数据流,一维连续数据搬运。
- AXI VDMA(Video DMA):视频专用 DMA 是 DMA 的增强版,专门针对图像 / 视频;支持帧缓存、多帧乒乓缓存、行 / 列二维图像地址、帧同步信号,摄像头采集、HDMI 显示必用它AMD
- 共同点:
- 控制寄存器用 AXI-Lite(PS 配置参数、查状态)
- 数据通路是 AXI4-Stream 高速流接口
AXI BRAM Controller(AXI BRAM 控制器)
类比:BRAM 的 "翻译官"
- BRAM 是 FPGA 片内块 RAM(Block Memory Generator IP 生成),BRAM 本身是简单的读写地址 / 数据端口,不认 AXI 协议
- 这个 IP 的功能:把 AXI 总线协议,翻译成 BRAM 原生读写信号
- PS 可以通过 AXI 总线,像访问外设寄存器一样读写 PL 内部 BRAM,用来放查找表、缓存小批量数据。
几个问题
1、ZYNQ架构分为几代产品?

2、ARM核是什么意思?
ARM 是一家英国公司的名字,同时也代表它设计的 CPU 内核架构。ARM 公司自己不生产芯片,只画 CPU 内核图纸,把图纸授权卖给芯片厂商(Xilinx、高通、苹果、STM 意法半导体)。
Xilinx 拿到 ARM 图纸,把 ARM CPU 内核做到 ZYNQ 芯片里面;
ARM 公司:卖 CPU 内核设计图纸的公司。
ARM 内核:CPU 的设计方案,比如 Cortex‑A9、Cortex‑A53、Cortex‑R5,这些全都是 ARM 公司设计出来不同型号的 CPU 内核。
Cortex‑A9 就是 ARM 公司设计的其中一款 CPU 内核型号。
- A 系列:面向高性能应用(跑 Linux、裸机系统,ZYNQ‑7000 用的就是 Cortex‑A9)
- R 系列:实时内核(ZU MPSoC 里面 R5,做高实时控制)
- M 系列:单片机内核(STM32 用 Cortex‑M3/M4,小单片机)
3、什么是Linux系统?
Linux 是一款开源的操作系统,它的核心叫 Linux 内核,由大量 C 语言代码构成,专门用来管理 CPU、内存、外设,给上层程序提供一套统一使用硬件的接口。
Cortex‑A9 这类 ARM CPU 硬件本身只认识 ARM 指令,它天生不自带 Linux,也不强制跑 Linux。你可以选择不装 Linux,直接跑裸机程序;也可以配置、编译一份适配这块板子的 Linux 镜像,让 CPU 运行它。
没有操作系统(裸机):CPU 上只有你写的那一份 C 代码。所有硬件操作,DDR 初始化、串口收发、网口、PL 侧 AXI 寄存器读写,全部要你自己代码实现。硬件资源没有统一管理,一次只能跑一套主程序。 装上 Linux 之后,Linux 内核就变成硬件和应用程序中间的管家:
- 管理 CPU:做多任务调度,同一个 CPU 上可以轮流运行好几个独立应用程序;Zynq 双核 A9,内核也负责两个核的调度管理。
- 管理内存(依赖 A9 的 MMU):引入虚拟内存。应用程序看到的地址是虚拟地址,不再直接和硬件物理地址绑定;程序之间内存隔离,一个程序崩溃不容易把整个系统搞挂。
- 统一管理所有外设,提供驱动框架:串口、网口、SD 卡、Flash、甚至你 PL 侧做的 AXI 外设,都写成驱动。应用程序不用直接啃寄存器,调用系统接口就能使用硬件。
- 自带文件系统:可以在 SD 卡 /eMMC 里组织文件、读写文件,保存日志、配置、数据。
- 提供标准接口:网络协议栈、线程、信号、管道等,写网络程序、多线程程序不用从零实现。
在 ZYNQ 上,一份能跑起来的 Linux,由三大部分组成:
- Linux 内核 (zImage):就是管家本身,负责调度、内存管理、驱动框架。内核是可以裁剪的:没用的外设驱动可以删掉,需要的外设(你的 PL 自定义 AXI 寄存器)可以加驱动。
- 设备树(dtb,设备树二进制文件):告诉内核 "板子上有什么硬件",PS 的配置、PL 上 AXI 外设的基地址、中断号都写在这里。对比裸机:裸机是读 hdf 文件得到硬件地址;Linux 用设备树描述硬件。
- 根文件系统 (rootfs):存放 Linux 的应用程序、命令、库、配置文件。我们自己写的 APP 最后就放在这里面运行。
AXI与ZYNQ架构的关系
ZYNQ 本质是 PS(ARM CPU 系统)+ PL(FPGA 逻辑),两个独立的部分。AXI 就是 PS 和 PL 之间约定好的 "标准通信语言":
- Xilinx 在 ZYNQ 芯片内部,直接引出 GP/HP/ACP 这几组 AXI 硬件端口,打通 PS 和 PL;
- 我们在 PL 里面写的 IP(AXI-GPIO、AXI-DMA、AXI-BRAM、自定义寄存器),都做成 AXI 从接口;
- 在 Vivado Block Design 里,把 PL 的 AXI 从 IP,和 PS 的 GP/HP 端口用 AXI Interconnect(AXI 路由器)连起来;
- PS 端(裸机或者 Linux)通过地址映射,就可以访问 PL 上的资源。
如果没有 AXI 这套统一协议,PS 和 PL 通信就要自己定义一大堆自定义握手信号,每个项目一套规则,IP 无法通用。AXI 就是标准化这个交互。
举例以下三个通路:
PS A9 CPU → PS 内部总线 → GP Master 端口(AXI4-Lite 主机) → AXI Interconnect 路由器 → PL 里的自定义 AXI-Lite 寄存器 IP(从机)
高速采集通路
PL 的 ADC 采集逻辑 → AXI-DMA(AXI4 主机) → HP 端口 → PS 的 DDR 内存控制器 → DDR
流通路(不带寄存器)
PL 的 ADC → AXI-Stream FIFO → AXI-Stream DMA → HP 口写入 DDR(Stream 只负责数据流,DMA 内部再转成带地址的 AXI4 去写内存)。
GP/HP/ACP 是端口(硬件通道) ,它们承载的协议可以是 AXI4 或者 AXI4-Lite;AXI-Stream 是流协议 ,它不能直接接到 GP/HP/ACP,AXI-Stream 要配合 DMA IP,由 DMA 做协议转换:把 Stream 流,转换成 Full AXI4 内存访问,再送到 HP/GP。
AXI4 / AXI4-Lite 怎么连 GP/HP/ACP?PL 里能不能直接看到引脚?
在 Vivado 的 Block Design(BD 块设计)里,不是像普通 IO 那样看到物理引脚,是 PS IP 的内部接口信号。
- 你在 BD 里放一个
ZYNQ7 Processing System这个 PS IP,双击配置,打开 HP、GP、ACP 端口;配置完,这个 PS IP 就会放出 AXI 主机 / 从机接口(信号端口,不是芯片物理引脚)- GP:通用 AXI 端口,PS 作为主机去读 PL 的寄存器(AXI-Lite 最多,用来配寄存器)
- HP:高性能 AXI 端口,PL 作为主机,去读写 PS 侧的 DDR 内存(Full AXI4,高速大数据)
- ACP:一致性端口,PL 访问 PS 的 Cache,一般少用
- 连接方式:直接在 BD 里用连线,把 PS 放出的这个 AXI 接口,连到 AXI Interconnect,再连到你的 PL 从 IP(AXI-GPIO、AXI-BRAM Ctrl、自定义 AXI-Lite 从机)
- 重点:
- 这些是片内互联信号(FPGA fabric 内部的逻辑信号),不是芯片外部引脚,所以你在约束、管脚分配里看不到它们,它们只在 PL 逻辑和 PS 硬核之间。
- 底层是芯片硅片上已经做好的硬核互联通路,Vivado 只是把这个通路的协议接口给你引到 BD 画布上。
为什么 AXI4 / AXI4-Lite 可以直接接,AXI-Stream 不行?
核心根源:协议设计目标完全不一样
- AXI4(Full AXI4)、AXI4-Lite:带地址的内存映射协议 每一次传输,都要先给地址 ,告诉对方:我要读写哪个地址位置。 GP/HP/ACP 这三组硬件通道,本身硬件就是为「带地址的内存访问」设计的,天生就是 AXI 地址总线,协议对上,就可以直接连通。
- AXI4-Lite:轻量,简单读写寄存器,适合控制
- Full AXI4:支持 Burst 突发传输,适合大块搬数据(HP 口最常用)
- AXI-Stream:流协议,没有地址! AXI-Stream 只有:数据、有效、准备(TDATA、TVALID、TREADY),全程没有地址信号。 而 HP/GP/ACP 的硬件通道,从底层电路上就要求每次传输必须附带地址,用来访问 DDR 或者寄存器地址空间。
- 没有地址,PS 这边根本不知道这个数据要放到 DDR 内存的哪个位置,所以 AXI-Stream 不能直接怼到 HP/GP 上。
那 AXI-Stream 怎么和 PS 的 DDR 通信?
AXI DMA 这个 IP,就是协议转换器,它两边接口不一样:
- 一侧:AXI-Stream 接口(接你的 PL 流逻辑,比如 AD 采集、图像滤波、FFT 输出流,是无地址数据流)
- 另一侧:Full AXI4 主机接口(接到 HP 端口,这是带地址的,可以访问 PS 的 DDR)
工作流程:
- PL 端源源不断吐出 AXI-Stream 数据流(没有地址)给 DMA
- DMA 内部,由软件(Linux / 裸机)提前配置好:DDR 的起始地址、传输长度
- DMA 自动把一串 Stream 数据流,打包成 AXI4 Burst 写操作,按照你配置的地址,写入 DDR 指定位置
- 反过来,DMA 也可以从 DDR(HP 口读)读出数据,转成 AXI-Stream 流给 PL 逻辑