3. AXI突发传输:突发长度、突发大小、突发类型
AXI总线里最核心的概念,我觉得就是突发传输了。说白了,就是一次握手,连续传一堆数据。为什么要这么设计?你想想看,如果每次传一个数据都要走一遍地址握手,那效率得多低啊。我刚开始接触AXI时,就被这个突发机制搞得有点晕,后来亲手调了几个IP,才算真正搞明白。
3.1 突发长度(Burst Length)
突发长度,就是一次突发里要传多少个数据。用专业的话说,是ARLEN或AWLEN信号决定的。注意啊,这个值是「长度减1」。比如你想传16个数据,那LEN就要设成15。
关键点:突发长度范围是1到256。但有个限制——如果是INCR类型,且数据位宽超过128位,那最大长度只能到16。我当年第一次做DMA控制器时就踩了这个坑,仿真怎么都跑不过,查了半天协议才发现这个限制。
| 传输类型 | 最大突发长度 | 说明 |
|---|---|---|
| INCR | 256 | 数据位宽≤128位时 |
| INCR | 16 | 数据位宽>128位时 |
| FIXED | 16 | 固定地址,长度受限 |
| WRAP | 16 | 回环边界限制 |
3.2 突发大小(Burst Size)
突发大小指的是每次传输的字节数,由ARSIZE或AWSIZE控制。这个值是个3位信号,编码方式如下:
- 3'b000:1字节(8位)
- 3'b001:2字节(16位)
- 3'b010:4字节(32位)
- 3'b011:8字节(64位)
- 3'b100:16字节(128位)
- 3'b101~3'b111:保留,别用
我个人习惯,做图像处理加速时,数据位宽通常是64位或128位。比如处理一个像素是32位的RGB图像,我一般设SIZE为4字节,这样一拍就能传一个像素,逻辑清晰。
小技巧:突发大小不能超过数据总线的位宽。比如你的数据总线是32位,那SIZE最大只能设4字节。这个在RTL设计时很容易忽略,我建议在地址通道加个断言检查。
3.3 突发类型(Burst Type)
AXI定义了三种突发类型,由ARBURST或AWBURST控制。嗯,这里要重点讲,因为很多新人会搞混。
3.3.1 FIXED(固定地址)
每次传输都访问同一个地址。说白了,就是往同一个位置反复写数据。什么时候用?比如配置寄存器,或者FIFO操作。我做过一个视频缩放模块,就用FIXED类型往系数寄存器写滤波参数。
// FIXED突发示例
// 地址0x1000,写4次,每次写同一个地址
AWADDR = 0x1000
AWLEN = 3 // 4次传输
AWSIZE = 2 // 4字节
AWBURST = 2'b00 // FIXED
// 数据:D0→0x1000, D1→0x1000, D2→0x1000, D3→0x1000
3.3.2 INCR(递增地址)
这是最常用的类型。每次传输后,地址自动增加一个SIZE。比如你从内存里读一帧图像,用INCR就对了。地址计算很简单:
// INCR突发地址计算
// 起始地址:0x2000,SIZE=4字节,LEN=7(8次传输)
// 地址序列:
// Beat 0: 0x2000
// Beat 1: 0x2004
// Beat 2: 0x2008
// ...
// Beat 7: 0x201C
我在项目中遇到过一个问题:用INCR读DDR时,如果起始地址没对齐到SIZE的整数倍,性能会暴跌。后来我强制让DMA的起始地址做对齐,带宽直接翻了一倍。
3.3.3 WRAP(回环地址)
这个稍微复杂点。WRAP类型会在一个地址范围内循环,到了边界就跳回起始地址。它主要用于Cache Line的读写,或者一些环形缓冲区的操作。
WRAP的边界计算规则:
- 边界地址 = INT(起始地址 / (SIZE × LEN)) × (SIZE × LEN)
- 地址范围:[边界地址, 边界地址 + SIZE × LEN - 1]
注意:WRAP突发要求起始地址必须对齐到SIZE × LEN的整数倍。我曾经在调试一个图像旋转加速器时,因为地址没对齐,WRAP行为完全乱掉了,数据错位得一塌糊涂。后来加了个地址对齐模块才解决。
3.4 地址对齐规则
地址对齐,说白了就是起始地址必须是SIZE的整数倍。比如SIZE=4字节,那地址最低2位必须是0。这个规则在AXI协议里是强制的,不对齐的传输虽然协议允许,但性能会打折扣。
我总结了一个对齐检查表:
| SIZE(字节) | 地址对齐要求 | 地址最低有效位 |
|---|---|---|
| 1 | 任意地址 | 无要求 |
| 2 | 2字节对齐 | addr[0] = 0 |
| 4 | 4字节对齐 | addr[1:0] = 00 |
| 8 | 8字节对齐 | addr[2:0] = 000 |
| 16 | 16字节对齐 | addr[3:0] = 0000 |
实战经验:做图像处理时,我通常把图像的行宽对齐到64字节。这样不管是INCR还是WRAP,地址计算都简单,而且DDR的带宽利用率最高。你想想看,如果每行末尾有几个字节没对齐,那下一行的起始地址就乱了,整个加速器的流水线都得等。
3.5 突发传输的完整流程
一个完整的AXI突发传输,分三个阶段:地址通道、数据通道、响应通道。我画了个流程图,帮你理清关系:
这个图把突发传输的三个阶段串起来了。你注意看,地址通道先发,然后数据通道开始传数据,最后从设备给响应。实际设计中,数据通道是可以流水线操作的——也就是地址还没传完,数据就可以开始发了。我优化图像加速器时,就是靠这个流水线特性把吞吐量提上去的。
避坑指南:我曾经在写一个AXI Slave时,忘了处理WLAST信号。结果主控发了16个数据,我这边只收了15个就停了,整个总线直接死锁。从那以后,我设计任何AXI接口都会先检查WLAST和RLAST的时序。
好了,关于AXI突发传输的核心内容就这些。突发长度、突发大小、突发类型这三个参数,加上地址对齐规则,是理解AXI总线的基础。你把这些搞清楚了,后面做图像处理加速时,设计DMA和地址生成器就会顺手很多。
一句话总结:突发传输就是一次地址握手,连续传一批数据。长度决定传多少,大小决定每拍传多少,类型决定地址怎么变。对齐规则是性能的关键,千万别忽视。
可可精品资料库