1. 课程导论与AXI总线基础
大家好,欢迎来到这门实战课。我是你们的讲师,一个在Zynq上摸爬滚打了七八年的工程师。今天咱们先不急着写代码,把地基打牢。
Zynq这玩意儿,说白了就是一颗芯片里住了两个人:一个叫PS(处理系统),是ARM核,跑Linux或者裸机;另一个叫PL(可编程逻辑),是FPGA,干硬件加速的活儿。这两个人怎么高效沟通?靠的就是AXI总线。
我个人习惯把AXI总线比作一条高速公路。PS是城市中心,PL是工业区。数据就是卡车,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。
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 |
1.3 AXI 握手信号与时序
AXI总线最核心的机制,就是VALID/READY握手。说白了,就是发送方说“我有数据了”(VALID拉高),接收方说“我准备好了”(READY拉高),然后一拍搞定。
这里有三种握手场景,我画了个时序图帮你理解:
为什么会这样设计?因为AXI总线是解耦的。发送方和接收方可以各自忙各自的,不用互相等。这在高速系统中特别重要——你想想看,如果发送方必须等接收方准备好才能发数据,那流水线就断了,性能直接腰斩。
1.4 本章小结
这一章我们聊了Zynq的架构、三种AXI协议的区别、以及握手时序。这些都是后面调试优化的基础。我个人觉得,理解握手时序是最关键的——你调试AXI总线时,90%的问题都出在握手信号上。