AXI 总线详解
1. AXI的主要特点
- 高性能: 支持多主多从架构,可以实现高带宽和低延迟的数据传输。
- 完全地址分离: 读操作和写操作使用独立的地址通道,支持并发。
- 高灵活性: 支持非固定地址的突发传输(burst)。
- 低功耗: 支持稀疏数据传输和动态电源管理。
- 适配性强: 可用于多种应用场景,包括高性能处理器、高速外设等。
2. AXI的基本结构
AXI 总线的通信通过以下五种通道完成:
- 读地址通道(AR,Address Read)
- 读数据通道(R,Read Data)
- 写地址通道(AW,Address Write)
- 写数据通道(W,Write Data)
- 写响应通道(B,Write Response)
这五个通道互相独立,可以并行操作。
2.1 通道信号
每个通道包括以下关键信号:
- 地址信号(ARADDR / AWADDR): 32位或64位宽,用于传输数据的目标地址。
- 数据信号(RDATA / WDATA): 数据宽度通常为 32/64/128 位,可扩展到更宽。
- 控制信号:
- ARBURST / AWBURST: 表示突发类型(如固定地址、递增地址等)。
- ARLEN / AWLEN: 表示突发的长度(0-15,表示1-16次传输)。
- ARSIZE / AWSIZE: 表示每次传输的字节数。
- 响应信号(BRESP / RRESP): 表示传输的结果状态(如成功、错误)。
3. 通道工作原理
3.1 读操作
- 主设备在 AR 通道 上发送读地址请求(ARADDR)。
- 从设备在接收到请求后,在 R 通道 上发送数据(RDATA)和状态(RRESP)。
- 传输完成后,主设备接收所有数据。
3.2 写操作
- 主设备在 AW 通道 上发送写地址请求(AWADDR)。
- 主设备在 W 通道 上发送写数据(WDATA)。
- 从设备在 B 通道 上返回写响应(BRESP),指示操作是否成功。
3.3 突发传输
AXI 支持以下几种突发传输:
- 固定突发(FIXED): 地址不变,常用于FIFO。
- 递增突发(INCR): 地址按固定步长递增,常用于存储器。
- 环形突发(WRAP): 地址递增到设定的边界后,返回起始地址。
4. AXI协议的版本
AXI有多个版本,常用的包括:
- AXI3: 第一个 AXI 协议版本,支持突发长度为16的传输。
- AXI4: 增加了对大数据块传输的支持,突发长度增加到256。
- AXI4-Lite: 精简版 AXI 协议,仅支持单次传输,常用于控制寄存器访问。
- AXI4-Stream: 专为高速数据流传输设计,主要用于点到点通信。
5. AXI与其他总线协议的对比
特点 | AXI | AHB | APB |
---|---|---|---|
地址通道独立 | 是 | 否 | 否 |
数据宽度支持 | 32/64/128/256+ 位 | 32/64 位 | 8/16/32 位 |
突发传输支持 | 是 | 是 | 否 |
高性能场景适用 | 是 | 一般 | 否 |
6. 应用场景
- AXI4: 高性能内存访问,例如 DDR、GPU。
- AXI4-Lite: 低吞吐量、低复杂度的设备控制。
- AXI4-Stream: 数据流传输,如视频处理、音频流等。
7. 常见问题
- 地址和数据对齐: 地址必须与数据宽度对齐,否则会导致未定义行为。
- 传输状态监控: RRESP 和 BRESP 信号用于判断数据是否传输成功。
- 多主设备仲裁: 主设备之间可能需要仲裁机制来解决访问冲突。
AXI 总线传输示例及多主仲裁示例
1. AXI 传输示例
场景描述
主设备(Master)需要从从设备(Slave)地址 0x1000_0000
开始读取 4 个字的数据(递增突发)。每次传输的数据宽度为 32 位。
信号交互流程
-
读地址传输(AR 通道):
- Master 发送读地址请求。
ARADDR
=0x1000_0000
(起始地址)。ARLEN
=3
(表示 4 次传输,ARLEN+1)。ARSIZE
=2
(每次传输 4 字节,即 32 位)。ARBURST
=INCR
(递增突发)。
- Slave 接收地址请求并准备数据。
- Master 发送读地址请求。
-
数据传输(R 通道):
- Slave 将数据传给 Master,数据宽度为 32 位:
RDATA
=0x12345678
,RRESP
=OKAY
。RDATA
=0x9ABCDEF0
,RRESP
=OKAY
。RDATA
=0x13579BDF
,RRESP
=OKAY
。RDATA
=0x2468ACE0
,RRESP
=OKAY
。
- Slave 在最后一个数据时设置
RLAST = 1
,表示传输结束。
- Slave 将数据传给 Master,数据宽度为 32 位:
信号时序图(简化)
时钟周期 | ARADDR | ARLEN | RDATA | RRESP | RLAST |
---|---|---|---|---|---|
1 | 0x10000000 | 3 | - | - | - |
2 | - | - | 0x12345678 | OKAY | 0 |
3 | - | - | 0x9ABCDEF0 | OKAY | 0 |
4 | - | - | 0x13579BDF | OKAY | 0 |
5 | - | - | 0x2468ACE0 | OKAY | 1 |
2. 多主仲裁示例
场景描述
系统中存在两个主设备(Master 0 和 Master 1),它们同时尝试访问同一个从设备的不同地址:
- Master 0 需要写入地址
0x2000_0000
。 - Master 1 需要读取地址
0x2000_0010
。
仲裁规则
假设仲裁器采用轮询调度(Round-Robin)的方式,优先处理 Master 0,然后处理 Master 1。
信号交互流程
-
仲裁器分配总线给 Master 0:
- 仲裁器检测到 Master 0 和 Master 1 都发出请求,但优先选择 Master 0。
- Master 0 开始发送写请求:
AWADDR
=0x2000_0000
,AWLEN
=0
,AWSIZE
=2
。WDATA
=0xDEADBEEF
。
- Slave 接收写数据后,通过 B 通道返回写响应(BRESP =
OKAY
)。
-
仲裁器分配总线给 Master 1:
- 仲裁器在 Master 0 的操作完成后切换到 Master 1。
- Master 1 开始发送读请求:
ARADDR
=0x2000_0010
,ARLEN
=0
,ARSIZE
=2
。
- Slave 在 R 通道上返回读取的数据(RDATA =
0x12345678
,RRESP =OKAY
)。
信号时序图(简化)
时钟周期 | Master | ARADDR / AWADDR | RDATA / WDATA | RESP | RLAST |
---|---|---|---|---|---|
1 | Master 0 | 0x20000000 (Write) | 0xDEADBEEF | OKAY | - |
2 | Master 1 | 0x20000010 (Read) | 0x12345678 | OKAY | 1 |
总结
- AXI传输: AXI 的分离通道架构允许高效的并行数据传输,支持读写并发。
- 多主仲裁: 仲裁器在多主设备竞争时决定谁优先访问总线。采用合理的仲裁策略(如轮询、优先级调度)可以避免资源争用引发的问题。