4、AXI传输机制:突发传输(Burst)、地址增量模式(FIXED/INCR/WRAP)、传输大小与对齐

大家好,我是老李。做AXI总线设计这些年,我最大的感触就是:传输机制是AXI协议的魂。你想想看,CPU、DMA、各种外设,它们之间怎么高效地搬数据?靠的就是这套机制。今天咱们就把它彻底聊透。

4.1 突发传输(Burst)—— 为什么要有它?

先说个最基础的问题:为什么要有突发传输?

我刚开始做设计时,也想过这个问题。单次传输不行吗?每次只传一个数据,地址、控制信号都重新发一遍,多简单。

但实际不是这样的。你想想看,如果CPU要从内存里读一段连续的数据,比如一个缓存行(cache line),如果每次只读一个字,那光发地址就要花掉大量时间。总线利用率会低得可怜。

突发传输的核心思想:一次握手,多次传输。

主设备只需要发送一次地址和控制信息,然后从设备就按规则连续返回多个数据。说白了,就是「一次约定,批量执行」。

关键参数:

  • AxLEN:突发长度,表示一次突发中传输的数据个数。注意,实际传输次数 = AxLEN + 1。
  • AxSIZE:传输大小,表示每个数据节拍(beat)的字节数。
  • AxBURST:突发类型,决定地址如何递增。

举个例子:如果 AxLEN = 3,AxSIZE = 2(即4字节),那么一次突发会传输 4 个数据,每个数据 4 字节,总共 16 字节。

4.2 地址增量模式:FIXED / INCR / WRAP

地址怎么变?这就是 AxBURST 信号干的事。它有三种模式,我一个个说。

4.2.1 FIXED(固定地址)

每次传输,地址不变。所有数据都读写同一个地址。

这有什么用?我遇到过一种场景:状态寄存器轮询。比如你要反复读某个外设的状态寄存器,看它是否就绪。用 FIXED 模式,地址不用变,每次读同一个位置。

但要注意:FIXED 模式用得不多,因为大多数场景还是需要地址递增的。

4.2.2 INCR(递增模式)

这是最常用的模式。每次传输后,地址自动增加一个 AxSIZE 的值。

比如:起始地址 0x1000,AxSIZE = 4(4字节),那么地址依次是:0x1000、0x1004、0x1008、0x100C……

我个人的习惯是:只要不是特殊需求,优先用 INCR。因为它最符合「连续内存访问」的直觉。

4.2.3 WRAP(回环模式)

这个稍微复杂一点。WRAP 模式也是递增,但递增到某个边界后会「折回来」。

它主要用于 cache line 填充。比如 CPU 要读一个 64 字节的缓存行,但起始地址不是对齐到 64 字节边界的。这时候用 WRAP 模式,地址会先递增到边界,然后折回起始位置继续。

我的经验:WRAP 模式在 AXI 中很常见,但很多初学者容易搞错边界计算。记住一个公式:边界 = 起始地址对齐到 (突发长度 × AxSIZE) 的地址。

4.3 传输大小与对齐

这部分是坑最多的地方。我踩过不少雷,跟大家分享一下。

4.3.1 AxSIZE 的含义

AxSIZE 用 3 位二进制表示,取值范围 0~7:

AxSIZE 值 传输大小(字节) 典型用途
0 1 字节访问
1 2 半字访问
2 4 字访问
3 8 双字访问
4 16 四字访问
5~7 32/64/128 更大传输

4.3.2 地址对齐问题

这是个大坑。AXI 协议要求:起始地址必须对齐到 AxSIZE。

什么意思?如果你要传 4 字节(AxSIZE=2),起始地址必须是 4 的倍数。比如 0x1000 可以,0x1001 就不行。

我曾经在一个项目中,从设备没检查地址对齐,结果主设备发了个非对齐地址,导致数据错位。查了两天才找到原因。嗯,从那以后我每次设计从设备,第一件事就是加地址对齐检查。

注意:非对齐访问在 AXI 中是不允许的。如果你确实需要访问非对齐地址,有两种办法:

  • 拆分成多个对齐的传输
  • 使用字节选通信号(WSTRB)来屏蔽不需要的字节

4.3.3 突发长度与地址计算

突发传输中,地址的计算规则是:

  • INCR 模式:下一地址 = 当前地址 + (1 << AxSIZE)
  • WRAP 模式:地址在 [起始地址对齐到边界, 边界 + 突发长度 × AxSIZE - 1] 范围内循环
  • FIXED 模式:地址不变

举个例子,假设起始地址 0x1004,AxSIZE=2(4字节),AxLEN=3(4个数据):

  • INCR:地址依次为 0x1004、0x1008、0x100C、0x1010
  • WRAP(边界为 0x1000):地址依次为 0x1004、0x1008、0x100C、0x1000
  • FIXED:地址始终为 0x1004

4.4 知识体系图

下面这张图是我自己画的,把本章的核心逻辑串起来了。你看一眼就能明白各个概念之间的关系。

AXI传输机制知识体系 突发传输 (Burst) 地址增量模式 FIXED INCR WRAP 传输大小 (AxSIZE) 1/2/4B 8/16B 32+B 地址对齐 对齐规则 非对齐 WSTRB 一次突发 = 1个地址 + N个数据 AxLEN决定N,AxSIZE决定每个数据大小,AxBURST决定地址变化

4.5 实战中的避坑指南

最后,我把自己这些年踩过的坑总结一下,希望能帮你少走弯路。

我曾经犯过的错:

  • 突发长度超限:AXI 协议规定,INCR 模式的突发长度不能超过 256(AxLEN ≤ 255)。我一开始没注意,设了个 300,结果从设备直接罢工。
  • WRAP 边界算错:WRAP 模式的边界必须是突发总字节数的整数倍。比如 4 个 4 字节的数据,边界必须是 16 的倍数。我算错过一次,数据全乱了。
  • 非对齐地址:前面说过了,这是最常见的坑。一定要在从设备里加检查逻辑。
  • AxSIZE 与数据总线宽度不匹配:如果数据总线是 64 位,但 AxSIZE 设成 128 位,那就会出问题。确保 AxSIZE ≤ 数据总线宽度。

好了,这一章的内容就到这儿。突发传输、地址增量模式、传输大小与对齐,这三个概念是 AXI 传输机制的基石。你只要把它们搞透了,后面学 AXI4 的 QoS、原子访问什么的,就会轻松很多。

记住我一句话:AXI 的传输机制,本质上就是「一次约定,批量执行」。抓住这个核心,其他都是细节。


可可精品资料库