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 知识体系图

下面这张图帮你理清本章的核心逻辑:

AXI突发传输知识体系 突发传输 突发长度 × 突发大小 = 总字节数 FIXED:地址不变 INCR:地址递增 WRAP:地址回绕 FIFO / 寄存器 连续内存 / 帧缓冲 Cache Line / 环形缓冲 地址对齐 | 4KB边界 | 突发长度约束

4.9 总结

好了,这一章的内容就这些。FIXED、INCR、WRAP三种模式,说白了就是地址怎么变的问题。

FIXED最简单,地址不动。INCR最常用,地址递增。WRAP最巧妙,地址回绕。

记住三个关键点:

  • 突发长度和突发大小决定了总传输量
  • 地址对齐是基本功,别在这上面翻车
  • WRAP的边界计算要熟练,Cache设计离不开它

我在做FPGA加速器的时候,这三种模式几乎天天用。你只要多写几个RTL模块,自然就熟了。

可可精品资料库