1. 课程导论与AXI总线基础

大家好,欢迎来到这门实战课。我是你们的讲师,一个在Zynq上摸爬滚打了七八年的工程师。今天咱们先不急着写代码,把地基打牢。

Zynq这玩意儿,说白了就是一颗芯片里住了两个人:一个叫PS(处理系统),是ARM核,跑Linux或者裸机;另一个叫PL(可编程逻辑),是FPGA,干硬件加速的活儿。这两个人怎么高效沟通?靠的就是AXI总线。

我个人习惯把AXI总线比作一条高速公路。PS是城市中心,PL是工业区。数据就是卡车,AXI总线就是连接两地的车道。车道设计得好,物流就快;设计不好,堵车、死锁、数据丢包全来了。

核心观点: Zynq开发的本质,就是让PS和PL通过AXI总线高效协同。不懂AXI,你写再多代码也是瞎忙活。

1.1 Zynq架构速览

先看一眼Zynq的整体结构。PS端包含ARM Cortex-A9双核处理器、DDR控制器、各种外设(UART、I2C、SPI、USB等)。PL端就是FPGA逻辑,你可以在这里实现自定义的加速器、接口逻辑、或者任何你想要的数字电路。

这两端之间,通过一组高性能的AXI接口连接。具体来说,有以下几个关键通道:

  • GP(通用端口): 用于PS访问PL的寄存器,速度一般,适合控制类操作。
  • HP(高性能端口): 用于PL直接访问DDR内存,带宽高,适合大数据量传输。
  • ACP(加速一致性端口): 用于PL访问PS的缓存,保持数据一致性,这个我后面会细讲。

我记得刚接触Zynq时,总搞不清这些端口该用哪个。后来踩了个坑——用GP口传视频数据,结果帧率惨不忍睹。嗯,从那以后我就记住了:控制走GP,数据走HP。

Zynq 架构与 AXI 总线概览 PS (处理系统) ARM Cortex-A9 双核 DDR 控制器 外设 (UART/I2C/SPI/USB) AXI 互联矩阵 PL (可编程逻辑) 自定义加速器 接口逻辑 DMA 引擎 AXI 从机/主机接口 AXI 总线 GP/HP/ACP PS 和 PL 通过 AXI 总线连接,实现数据与控制的高效交互

1.2 AXI4 / AXI4-Lite / AXI4-Stream 协议对比

AXI总线家族有三个兄弟,各有各的脾气。你想想看,如果拿AXI4-Stream去配寄存器,就像用卡车运一张纸条,太浪费了。反过来,用AXI4-Lite传视频流,就像用自行车拉集装箱,根本跑不动。

下面这张表,我建议你收藏起来,选型时直接翻出来看:

特性 AXI4 (Full) AXI4-Lite AXI4-Stream
地址/数据通道 分离的地址、读、写通道 分离的地址、读、写通道 只有数据通道,无地址
突发传输 支持,最大256拍 不支持,单次传输 支持,无限拍
数据宽度 8/16/32/64/128/256/512/1024 bit 固定32 bit 任意宽度
典型用途 DDR读写、大数据块传输 寄存器配置、状态查询 视频流、音频流、高速数据流
握手信号 VALID/READY + 额外控制 VALID/READY VALID/READY + TLAST/TKEEP
我的经验: 在项目中,我通常用 AXI4-Lite 做控制面(配置寄存器、读取状态),用 AXI4 或 AXI4-Stream 做数据面。这样分工明确,调试起来也省心。

1.3 AXI 握手信号与时序

AXI总线最核心的机制,就是VALID/READY握手。说白了,就是发送方说“我有数据了”(VALID拉高),接收方说“我准备好了”(READY拉高),然后一拍搞定。

这里有三种握手场景,我画了个时序图帮你理解:

AXI 握手时序(三种场景) CLK 场景1: VALID先于READY VALID READY DATA 握手成功 场景2: READY先于VALID VALID READY DATA 握手成功 VALID 和 READY 同时为高时,数据在下一个时钟沿被采样

为什么会这样设计?因为AXI总线是解耦的。发送方和接收方可以各自忙各自的,不用互相等。这在高速系统中特别重要——你想想看,如果发送方必须等接收方准备好才能发数据,那流水线就断了,性能直接腰斩。

避坑指南: 我曾经在一个项目中,因为READY信号拉得太晚,导致VALID一直高挂,整个总线被堵死。后来加了个超时机制才解决。记住:不要无限期等待READY,否则死锁等着你。

1.4 本章小结

这一章我们聊了Zynq的架构、三种AXI协议的区别、以及握手时序。这些都是后面调试优化的基础。我个人觉得,理解握手时序是最关键的——你调试AXI总线时,90%的问题都出在握手信号上。