3、AXI传输事务:突发传输、地址对齐与非对齐传输、窄传输、未定义长度传输

大家好,我是你们的FPGA讲师。今天我们来啃一块硬骨头——AXI的传输事务。说实话,这部分内容在项目中踩坑率极高。我见过不少工程师,协议背得滚瓜烂熟,一上板子就抓瞎。为什么?因为理论跟实际波形之间,隔着一层窗户纸。今天我们就来捅破它。

3.1 突发传输(Burst)—— 批量搬运的核心

突发传输,说白了就是一次握手,连续搬砖。你想想看,如果每次只传一个数据,都要重新走一遍地址握手,那效率得多低?AXI的突发传输,就是让你只给一次起始地址,然后连续传多个数据。

我个人习惯把突发传输比作「快递车」。地址是目的地,数据是包裹。普通传输是一辆车送一个包裹,送完回来再装下一个。突发传输呢?一车装满,一次出发,沿途按地址递增卸货。效率高下立判。

突发传输有三个关键参数,我建议你刻在脑子里:

  • ARLEN/AWLEN:突发长度。注意,这个值是「长度-1」。比如你要传4个数据,这里写3。我在项目中第一次用的时候就被坑过,写了个4,结果传了5个出去,总线直接挂掉。
  • ARSIZE/AWSIZE:每次传输的字节数。3'b011表示8字节,3'b010表示4字节。这个跟数据总线宽度有关,别乱设。
  • ARBURST/AWBURST:突发类型。2'b00是固定地址(FIXED),2'b01是递增(INCR),2'b10是回绕(WRAP)。

核心公式:突发传输的总字节数 = (ARLEN+1) × (2^ARSIZE)

举个例子:ARLEN=3(传4个),ARSIZE=3'b010(4字节),总字节数 = 4 × 4 = 16字节。

嗯,这里要注意:INCR类型是最常用的,地址依次递增。WRAP类型主要用于Cache Line,地址到了边界会回绕。FIXED类型嘛,所有数据都打在同一个地址上,我只有在配置寄存器时才用。

3.2 地址对齐与非对齐传输

这个问题,我敢说90%的新手都搞不清楚。什么叫对齐?简单说,就是传输的起始地址,能不能被传输宽度整除。

举个例子:数据总线是32位(4字节),ARSIZE=3'b010(4字节)。如果起始地址是0x00,那就是对齐的。如果起始地址是0x01,那就是非对齐的。

我曾经在一个视频处理项目中,DMA从DDR搬数据,地址没对齐,结果性能直接腰斩。为什么?因为非对齐传输,总线控制器要额外做拆分和拼接,多花好几个周期。

AXI协议本身是支持非对齐传输的。但支持归支持,性能损失是实打实的。我建议你:能对齐就对齐,别给自己找麻烦。

起始地址 ARSIZE 是否对齐 实际行为
0x00 4字节 ✅ 对齐 一次传输完成
0x01 4字节 ❌ 非对齐 拆成两次传输
0x02 4字节 ❌ 非对齐 拆成两次传输
0x04 4字节 ✅ 对齐 一次传输完成

你看这个表就明白了。非对齐传输,底层其实是被拆成多个对齐传输来完成的。只不过协议帮你封装好了,你看不到而已。

3.3 窄传输(Narrow Transfer)

窄传输,就是数据宽度小于总线宽度。比如总线是64位,但你只想传8位数据。这时候就要用到WSTRB(写选通信号)了。

WSTRB是一个位掩码,每一位对应一个字节。比如WSTRB=4'b0001,表示只写最低字节。WSTRB=4'b0011,表示写最低两个字节。

我记得有一次调试一个PCIe的AXI桥接,从设备返回的数据总是错位。查了三天,最后发现是WSTRB没处理好。从设备只支持32位传输,但主机发了个16位的窄传输,WSTRB只置了低两位,结果数据被放到了错误的字节通道上。

避坑指南:我曾经在Zynq上做过一个项目,PS端通过AXI_HP口访问PL端的BRAM。PS端发了一个窄传输,WSTRB=4'b0010,结果PL端的BRAM控制器没处理WSTRB,直接把整个32位都写了。数据全乱套了。

所以,如果你在PL端实现Slave,一定要检查WSTRB。别偷懒。

3.4 未定义长度传输

这个特性,说实话,我在实际项目中几乎没用过。但面试的时候经常被问到,所以还是得讲一讲。

未定义长度传输,就是突发长度不确定。主机通过拉低BVALID来告诉从机:「我还没传完,别急。」从机通过拉低RVALID来回应:「好的,我等着。」

为什么会有这个特性?我猜是为了应对一些实时性要求高的场景。比如视频流,数据源源不断,你事先不知道有多少帧。但AXI4已经废弃了这个特性,改为固定长度突发。所以,如果你用的是AXI4,直接忽略未定义长度传输就好。

嗯,这里要补充一句:AXI3是支持未定义长度传输的。如果你还在维护老项目,可能会遇到。但新设计,我建议直接用AXI4,省心。

3.5 知识体系总览

说了这么多,我们来画个图,把今天的内容串起来。这张图是我自己总结的,每次带新人我都会画一遍。

AXI传输事务知识体系 AXI传输事务 突发传输 (Burst) 地址对齐/非对齐 窄传输 (Narrow) 未定义长度传输 ARLEN/AWLEN ARSIZE/AWSIZE ARBURST/AWBURST INCR/WRAP/FIXED 对齐:地址 % 宽度 == 0 非对齐:拆分为多次传输 性能损失:建议对齐使用 数据宽度 < 总线宽度 WSTRB 字节选通 Slave必须处理WSTRB AXI3支持,AXI4废弃 新设计用AXI4固定长度 核心:理解突发参数 → 对齐地址 → 正确处理WSTRB

这张图把今天的内容都串起来了。你看,核心就是三个参数(长度、大小、类型),然后围绕它们展开对齐、窄传输这些概念。未定义长度传输是个历史遗留问题,知道就行。

我的个人建议:刚开始学AXI,别急着背协议。先搭一个简单的Master和Slave,用Vivado的ILA抓波形。亲眼看看突发传输的地址是怎么递增的,WSTRB是怎么变化的。看懂了波形,协议自然就理解了。

我当年就是这么学的。第一次看到INCR突发的地址从0x00跳到0x04再到0x08,那种「原来如此」的感觉,至今难忘。

好了,这一章的内容就到这里。记住:突发传输是AXI的灵魂,地址对齐是性能的关键,WSTRB是窄传输的命门。把这三点吃透了,后面学起来就轻松了。

可可精品资料库