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 知识体系图
下面这张图是我自己画的,把本章的核心逻辑串起来了。你看一眼就能明白各个概念之间的关系。
4.5 实战中的避坑指南
最后,我把自己这些年踩过的坑总结一下,希望能帮你少走弯路。
我曾经犯过的错:
- 突发长度超限:AXI 协议规定,INCR 模式的突发长度不能超过 256(AxLEN ≤ 255)。我一开始没注意,设了个 300,结果从设备直接罢工。
- WRAP 边界算错:WRAP 模式的边界必须是突发总字节数的整数倍。比如 4 个 4 字节的数据,边界必须是 16 的倍数。我算错过一次,数据全乱了。
- 非对齐地址:前面说过了,这是最常见的坑。一定要在从设备里加检查逻辑。
- AxSIZE 与数据总线宽度不匹配:如果数据总线是 64 位,但 AxSIZE 设成 128 位,那就会出问题。确保 AxSIZE ≤ 数据总线宽度。
好了,这一章的内容就到这儿。突发传输、地址增量模式、传输大小与对齐,这三个概念是 AXI 传输机制的基石。你只要把它们搞透了,后面学 AXI4 的 QoS、原子访问什么的,就会轻松很多。
记住我一句话:AXI 的传输机制,本质上就是「一次约定,批量执行」。抓住这个核心,其他都是细节。