ZYNQ架构下的AXI_Lite 总线详解(1)

ZYNQ架构的介绍

一颗芯片里面,同时塞进去一套完整 ARM 计算机(PS)+ 一块 FPGA(PL),芯片内部通过硬件线路把两者紧紧连在一起,合二为一,名字叫 All‑Programmable SoC,全可编程片上系统。

PS Processing System 处理系统(ARM 侧,硬核固化)

PS 内部包含 4 大块硬件资源:

  1. APU 处理器单元:例如,双核 Cortex‑A9 ARM CPU,我们写的 C 语言裸机代码、Linux 系统,就在这里执行。
  2. 内存控制器(DDR 控制器):DDR3或者DDR4,程序、数据都放在 DDR。
  3. 一堆硬件外设(硬核):UART 串口、网口、SD 卡、I2C、SPI、CAN、USB、GPIO (MIO)、XADC,全部硬件做好,不需要 FPGA 逻辑。
  4. PS 内部互联总线(AXI):CPU、DDR、各个外设,内部互相通信。

PL(Programmable Logic,可编程逻辑)------FPGA 部分

就像一块空白的电路板,你写 Verilog 代码,编译生成 bit 文件,烧写进去,就能搭出自定义硬件电路。

PL 里面有什么硬件资源:

  1. CLB(LUT、触发器):做普通逻辑电路;
  2. BRAM(Block RAM 块 RAM):片上 RAM 存储器
  3. DSP 切片:做高速乘法、数字运算;
  4. 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 之间约定好的 "标准通信语言":

  1. Xilinx 在 ZYNQ 芯片内部,直接引出 GP/HP/ACP 这几组 AXI 硬件端口,打通 PS 和 PL;
  2. 我们在 PL 里面写的 IP(AXI-GPIO、AXI-DMA、AXI-BRAM、自定义寄存器),都做成 AXI 从接口;
  3. 在 Vivado Block Design 里,把 PL 的 AXI 从 IP,和 PS 的 GP/HP 端口用 AXI Interconnect(AXI 路由器)连起来;
  4. 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 的内部接口信号。

  1. 你在 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,一般少用
  2. 连接方式:直接在 BD 里用连线,把 PS 放出的这个 AXI 接口,连到 AXI Interconnect,再连到你的 PL 从 IP(AXI-GPIO、AXI-BRAM Ctrl、自定义 AXI-Lite 从机)
  3. 重点:
    • 这些是片内互联信号(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)

工作流程:

  1. PL 端源源不断吐出 AXI-Stream 数据流(没有地址)给 DMA
  2. DMA 内部,由软件(Linux / 裸机)提前配置好:DDR 的起始地址、传输长度
  3. DMA 自动把一串 Stream 数据流,打包成 AXI4 Burst 写操作,按照你配置的地址,写入 DDR 指定位置
  4. 反过来,DMA 也可以从 DDR(HP 口读)读出数据,转成 AXI-Stream 流给 PL 逻辑
相关推荐
星夜离尘561 天前
FPGA 32 位字拆成 8 位字节:keep、last 与 ready/valid 背压下的多拍序列化
fpga开发·verilog
花月mmc2 天前
【FPGA】神经网络内容简介预告
嵌入式硬件·深度学习·神经网络·fpga开发
LabVIEW开发4 天前
LabVIEW FPGA 编程:少编译几次的办法(系列 04/05)
fpga开发·labview
cmc10285 天前
318.关于在ip内部封装PLL,MMCM的注意事项
fpga开发
LabVIEW开发5 天前
LabVIEW CompactRIO 编程模式怎么选(系列 02/05)
fpga开发·labview
FPGA小迷弟5 天前
FPGA 与千兆以太网校验和:从原理到 Verilog 实现
嵌入式硬件·fpga开发·无人机·ai编程·fpga
码农小韩6 天前
FPGA学习(二)——LED闪烁
fpga开发·verilog·fpga·led·组合逻辑·分频设计
9527华安7 天前
FPGA纯verilog实现DP视频接口,支持2K60帧分辨率,提供3套工程源码和技术支持
fpga开发·音视频·dp
ChaseVLSI7 天前
FPGA与ASIC的区别详解:内部结构、开发成本与适用场景,项目选型到底该选哪个
嵌入式硬件·fpga开发·硬件架构·硬件工程
9527华安8 天前
FPGA实现ARINC818总线协议,基于GT Transceivers Wizard高速收发器,提供7套工程源码和技术支持
fpga开发·transceivers·arinc818