4、AXI突发传输:FIXED/INCR/WRAP突发类型、地址计算、突发长度与大小
大家好,我是你们的硬件工程讲师。今天我们来聊聊AXI总线里一个非常核心的概念——突发传输。
说实话,我刚接触AXI协议那会儿,最头疼的就是这几种突发模式。FIXED、INCR、WRAP,光看名字就够绕的。但搞懂了它们,你才算真正入了AXI的门。
4.1 什么是突发传输?
突发传输,说白了就是一次握手,传一堆数据。
你想想看,如果每次只传一个数据,就要走一遍地址握手、数据握手,那效率得多低?突发传输就是让你只发一次起始地址,然后连续传多个数据。地址怎么变,由突发类型决定。
AXI协议定义了三种突发类型:
- FIXED:地址固定不变
- INCR:地址递增
- WRAP:地址递增,到边界回绕
这三种模式,覆盖了绝大多数硬件加速场景。
4.2 突发长度与突发大小
在讲具体类型之前,有两个参数必须先搞清楚:突发长度(Burst Length)和突发大小(Burst Size)。
| 参数 | 含义 | 取值范围 |
|---|---|---|
| 突发长度 | 一次突发传输中,传输的数据拍数 | 1~256(INCR),1~16(FIXED/WRAP) |
| 突发大小 | 每拍数据的字节数 | 1、2、4、8、16、32、64、128字节 |
突发大小用3位二进制表示,编码为:b000=1字节,b001=2字节,b010=4字节,以此类推。
关键公式:
一次突发传输的总字节数 = 突发长度 × 突发大小
这个值不能超过4KB地址边界,否则协议会报错。
我在项目中遇到过一个问题:有人把突发长度设为256,突发大小设为16字节,结果总大小是4KB,刚好卡在边界上。嗯,这种设计其实很危险,因为地址对齐稍有偏差就会越界。我建议你留点余量。
4.3 FIXED 突发类型
FIXED模式最简单。地址从头到尾不变。
每次传输都访问同一个地址。这有什么用?你想想看,访问FIFO、状态寄存器、或者一个固定的配置寄存器,是不是就用上了?
地址计算:
Address_N = Start_Address
举个例子:
起始地址:0x1000
突发大小:4字节
突发长度:8
传输序列:
第0拍:0x1000
第1拍:0x1000
第2拍:0x1000
...
第7拍:0x1000
个人经验:FIXED模式在DMA搬运FIFO数据时特别好用。我曾经用FIXED模式实现了一个高速数据采集模块,地址固定指向FIFO读端口,数据一拍拍往外吐,效率很高。
4.4 INCR 突发类型
INCR是最常用的模式。地址每次递增一个突发大小。
说白了,就是连续的内存访问。比如从内存里读一段连续的数组,或者写一段连续的帧缓冲。
地址计算:
Address_N = Start_Address + N × Burst_Size
举个例子:
起始地址:0x1000
突发大小:4字节
突发长度:8
传输序列:
第0拍:0x1000
第1拍:0x1004
第2拍:0x1008
第3拍:0x100C
第4拍:0x1010
第5拍:0x1014
第6拍:0x1018
第7拍:0x101C
这里要注意,地址必须对齐到突发大小。比如突发大小是4字节,起始地址必须是4的倍数。否则协议会报错。
避坑指南:我曾经在调试一个图像处理加速器时,发现数据总是错位。查了半天,原来是起始地址没对齐。0x1001开始,突发大小4字节,结果地址变成了0x1001、0x1005、0x1009... 数据全乱了。记住:地址对齐是基本功。
4.5 WRAP 突发类型
WRAP模式稍微复杂一点。地址递增,但到了边界就回绕。
为什么需要回绕?你想想看,Cache Line的填充、环形缓冲区的访问,是不是就需要这种模式?
WRAP模式的边界计算:
边界 = 突发长度 × 突发大小
回绕地址 = 起始地址 & ~(边界 - 1)
举个例子:
起始地址:0x1004
突发大小:4字节
突发长度:4
边界 = 4 × 4 = 16字节
回绕地址 = 0x1004 & ~(0xF) = 0x1000
传输序列:
第0拍:0x1004
第1拍:0x1008
第2拍:0x100C
第3拍:0x1000 ← 回绕到边界起点
看到了吗?地址从0x1004开始,递增到0x100C后,下一拍回绕到0x1000。这就是WRAP的精髓。
WRAP的约束:
- 突发长度必须是2的幂次:2、4、8、16
- 起始地址必须对齐到突发大小
- 起始地址不能超过边界
4.6 三种类型对比
| 特性 | FIXED | INCR | WRAP |
|---|---|---|---|
| 地址变化 | 不变 | 递增 | 递增+回绕 |
| 典型应用 | FIFO、寄存器 | 连续内存 | Cache Line、环形缓冲 |
| 突发长度限制 | 1~16 | 1~256 | 2、4、8、16 |
| 地址对齐要求 | 对齐到突发大小 | 对齐到突发大小 | 对齐到突发大小 |
4.7 地址计算实战
我们来看一个综合的例子。假设你设计了一个硬件加速器,需要从内存中读取一个8×8的矩阵,每个元素4字节。
你会怎么选?
我个人习惯用INCR模式,把矩阵按行存储。起始地址0x2000,突发大小4字节,突发长度8,连续读8行。
但如果你要访问Cache Line,那就得用WRAP。比如Cache Line大小64字节,突发大小8字节,突发长度8,起始地址0x2008。地址会从0x2008走到0x2038,然后回绕到0x2000。
小技巧:在FPGA里实现地址计算时,我建议用加法器加多路选择器。INCR用加法器累加,WRAP用加法器加比较器判断回绕。FIXED最简单,直接复用起始地址。
4.8 知识体系图
下面这张图帮你理清本章的核心逻辑:
4.9 总结
好了,这一章的内容就这些。FIXED、INCR、WRAP三种模式,说白了就是地址怎么变的问题。
FIXED最简单,地址不动。INCR最常用,地址递增。WRAP最巧妙,地址回绕。
记住三个关键点:
- 突发长度和突发大小决定了总传输量
- 地址对齐是基本功,别在这上面翻车
- WRAP的边界计算要熟练,Cache设计离不开它
我在做FPGA加速器的时候,这三种模式几乎天天用。你只要多写几个RTL模块,自然就熟了。
可可精品资料库