4. AXI总线协议详解

AXI总线,说白了就是Zynq内部沟通的“普通话”。

我刚开始接触Zynq时,最头疼的就是这堆协议。后来发现,搞懂AXI,整个Zynq的架构就通了一半。今天咱们就把AXI4、AXI4-Lite、AXI4-Stream这三个兄弟,连同它们的握手信号,一次性说清楚。

4.1 为什么是AXI?

ARM和Xilinx选AXI作为Zynq内部总线,不是拍脑袋决定的。AXI是AMBA协议家族的一员,专门为高性能、高频率系统设计。

我个人习惯把AXI比作“高速公路系统”:

  • 地址通道:就像导航,告诉数据去哪
  • 数据通道:就像车道,承载实际数据
  • 控制信号:就像红绿灯,协调交通

这种分离设计,让读写操作可以并行进行。嗯,这里要注意,很多新手容易忽略这一点。

4.2 AXI4:全能型选手

AXI4是完整版协议,支持突发传输。什么叫突发?就是一次握手,连续传多笔数据。

AXI4核心特点:

  • 支持1~256笔数据的突发传输
  • 独立的地址/数据通道
  • 支持乱序传输(Out-of-Order)
  • 每笔数据可带字节使能

我在项目中遇到过一个问题:用AXI4从DDR搬数据,突发长度设了256,结果带宽死活上不去。后来发现是地址没对齐,浪费了好多时钟周期。避坑指南:AXI4的地址必须对齐到突发长度的边界。

4.3 AXI4-Lite:轻量级选手

AXI4-Lite,说白了就是AXI4的“瘦身版”。

它不支持突发传输,一次握手只传一笔数据。但好处是逻辑简单,占资源少。我一般用它来配寄存器、读状态。

特性 AXI4 AXI4-Lite
突发传输 支持(1~256) 不支持
数据总线宽度 8~1024位 32位或64位
乱序传输 支持 不支持
典型应用 DDR、高速外设 寄存器、控制接口

你想想看,如果只是配个寄存器,用AXI4就太浪费了。AXI4-Lite刚好够用,还省逻辑资源。

4.4 AXI4-Stream:流式传输

AXI4-Stream是专门为数据流设计的。它没有地址通道,只有数据通道。数据像流水一样,源源不断地流过去。

我的经验:AXI4-Stream最适合视频、音频、DMA这类场景。我曾经用AXI4-Stream做视频缩放,数据从摄像头进来,经过FPGA处理,再送到显示器,全程不需要地址,爽得很。

AXI4-Stream的关键信号:

  • TVALID:发送方说“我有数据”
  • TREADY:接收方说“我准备好了”
  • TDATA:数据总线
  • TLAST:最后一笔数据(包尾标志)
  • TKEEP:字节使能

4.5 握手信号与时序

AXI所有通道都使用相同的握手机制:VALID/READY。

握手的基本规则:

  1. 发送方拉高VALID,表示数据有效
  2. 接收方拉高READY,表示可以接收
  3. 当VALID和READY同时为高时,传输发生

注意:发送方不能等待READY再拉VALID。接收方也不能等待VALID再拉READY。双方必须独立准备。我曾经见过一个设计,发送方等READY才发数据,结果死锁了,整个系统卡死。

握手时序有三种情况:

  • 情况一:VALID先高,READY后高——数据在READY拉高时传输
  • 情况二:READY先高,VALID后高——数据在VALID拉高时传输
  • 情况三:同时拉高——立即传输

下面我用一个简单的Verilog代码片段,展示AXI4-Stream的握手实现:

// AXI4-Stream 发送端示例
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        tvalid <= 1'b0;
        tdata  <= 32'd0;
    end else if (tvalid && tready) begin
        // 传输完成,准备下一笔
        tvalid <= 1'b0;
        tdata  <= next_data;
    end else if (data_available) begin
        // 有数据要发送
        tvalid <= 1'b1;
        tdata  <= current_data;
    end
end

这段代码的核心逻辑:当tvalid和tready同时为高时,数据被接收方取走,发送方可以准备下一笔数据。

4.6 三种协议的选择策略

在实际项目中,怎么选?我一般按这个原则:

  • 需要高速批量传输(如DDR读写)→ 用AXI4
  • 需要配置寄存器(如控制状态)→ 用AXI4-Lite
  • 需要连续数据流(如视频、音频)→ 用AXI4-Stream

我曾经在一个项目中,三种协议全用上了:AXI4搬数据,AXI4-Lite配参数,AXI4-Stream传视频流。各司其职,配合得很好。

4.7 知识体系图

下面这张图,帮你理清AXI协议的核心脉络:

AXI总线协议知识体系 AXI4 AXI4-Lite AXI4-Stream • 突发传输(1~256) • 独立地址/数据通道 • 支持乱序传输 • 字节使能 • 单笔传输 • 32/64位数据总线 • 不支持乱序 • 逻辑简单 • 无地址通道 • 连续数据流 • TLAST包尾标志 • 适合视频/音频 握手信号:VALID + READY 规则:VALID和READY同时为高时,传输发生 发送方不能等READY,接收方不能等VALID

这张图把AXI的三大协议和握手信号串起来了。你想想看,搞懂这些,Zynq内部通信对你来说就不再是黑盒了。

4.8 避坑总结

最后,分享几个我踩过的坑:

  • 地址对齐:AXI4突发传输,地址必须对齐到突发长度×数据宽度
  • 死锁问题:握手信号不能互相依赖,否则系统卡死
  • 带宽计算:AXI4理论带宽很高,但实际受限于仲裁、延迟等因素
  • 资源占用:AXI4-Lite虽然简单,但多个从设备时仲裁逻辑会膨胀

嗯,AXI协议就讲到这里。记住一句话:协议是死的,应用是活的。多动手写代码,多跑仿真,自然就熟了。

可可精品资料库