AXI通道详解:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道的信号与时序
各位同学,今天我们来啃一块硬骨头——AXI的五个独立通道。说实话,我刚接触AXI协议时,最头疼的就是这五个通道各自为政,又互相耦合。但搞懂了它们,你基本就掌握了AXI的七成功力。
AXI协议把一次传输拆成了五个独立的通道:读地址、读数据、写地址、写数据、写响应。每个通道都有自己的握手信号,互不干扰。这种设计说白了就是为了并行——读和写可以同时进行,地址和数据也能分开处理。
核心要点:五个通道各自独立握手,但通过ID和事务ID保持关联。每个通道都是单向的,从主设备到从设备,或者反过来。
1. 读地址通道(AR通道)
读地址通道,简称AR通道。主设备通过它告诉从设备:我要读哪个地址,读多少数据。
关键信号就那么几个:
- ARID:读事务ID,用来匹配读地址和读数据
- ARADDR:起始地址,这个不用多说
- ARLEN:突发长度,表示一次突发传输多少个数据节拍
- ARSIZE:每个数据节拍的字节数
- ARBURST:突发类型,固定地址、增量地址还是回绕地址
- ARVALID 和 ARREADY:握手信号
时序上,主设备拉高ARVALID,从设备准备好后拉高ARREADY,两者同时为高时,地址信息被采样。嗯,这里要注意:ARVALID不能依赖ARREADY,主设备必须主动发出地址,不能等从设备准备好了再发。
我的经验:我在调试一个DMA控制器时,发现读地址通道总是卡住。查了半天,原来是主设备在等ARREADY才发地址,违反了协议。AXI要求主设备必须主动,不能等。这个坑我踩过,你们别踩。
2. 读数据通道(R通道)
读数据通道是从设备回复数据的通道。主设备发完地址,从设备准备好数据后,通过R通道把数据送回来。
关键信号:
- RID:读事务ID,必须和ARID匹配
- RDATA:读回来的数据
- RRESP:读响应状态,OKAY、EXOKAY、SLVERR、DECERR
- RLAST:最后一个数据节拍的标志
- RVALID 和 RREADY:握手信号
读数据通道有一个特点:数据必须按顺序返回。你发了一个突发长度为4的读请求,从设备必须按地址顺序返回4个数据,不能乱序。但不同ID的事务可以交织——这就是为什么要有RID。
时序上,从设备拉高RVALID,主设备拉高RREADY,握手成功。RLAST在最后一个数据节拍时拉高。
避坑指南:我曾经遇到一个从设备,RVALID拉高后数据还没稳定。结果主设备采样到了错误数据。记住:RVALID拉高时,RDATA必须已经有效。这是基本要求,但很多新手会忽略。
3. 写地址通道(AW通道)
写地址通道和读地址通道几乎一样,只是方向不同。主设备通过它告诉从设备:我要往哪个地址写数据。
关键信号:
- AWID:写事务ID
- AWADDR:起始地址
- AWLEN:突发长度
- AWSIZE:数据宽度
- AWBURST:突发类型
- AWVALID 和 AWREADY:握手信号
写地址通道和写数据通道是独立的,这意味着地址可以先发,数据后到,或者反过来。但通常的做法是地址先发,数据紧随其后。
4. 写数据通道(W通道)
写数据通道是主设备发送数据的通道。主设备通过它把要写的数据发给从设备。
关键信号:
- WDATA:要写的数据
- WSTRB:字节选通信号,用来控制哪些字节有效
- WLAST:最后一个数据节拍
- WVALID 和 WREADY:握手信号
WSTRB这个信号很多人容易搞混。它是个位宽等于数据总线字节数的向量,每一位对应一个字节。比如32位数据总线,WSTRB就是4位。写数据时,只有WSTRB为1的字节才会被写入。
时序上,主设备拉高WVALID,从设备拉高WREADY,握手成功。WLAST在最后一个数据节拍时拉高。
重要提示:写数据通道没有ID信号!为什么?因为写数据必须按顺序发送,不能乱序。地址通道有AWID,数据通道没有WID,但两者通过顺序关联——第一个地址对应第一批数据,第二个地址对应第二批数据,以此类推。
5. 写响应通道(B通道)
写响应通道是从设备回复写操作状态的通道。一次写传输完成后,从设备通过B通道告诉主设备:写成功了还是出错了。
关键信号:
- BID:写事务ID,必须和AWID匹配
- BRESP:写响应状态
- BVALID 和 BREADY:握手信号
写响应通道只有一个数据节拍,不像读数据通道可能有多个。一次突发写传输完成后,从设备只返回一个响应。
时序上,从设备拉高BVALID,主设备拉高BREADY,握手成功。注意:BVALID必须在WLAST握手之后才能拉高,因为写操作还没完成,从设备无法判断是否成功。
我的习惯:我一般会在写响应通道上做一个超时检测。如果BVALID迟迟不来,可能是从设备卡住了。有一次调试一个挂死在总线的从设备,就是靠这个超时检测定位到的。
6. 五个通道的时序关系
五个通道虽然独立,但时序上有依赖关系。我画了一张图,你们看看就明白了。
从图上可以清楚看到:读操作是AR通道先发地址,然后R通道返回数据。写操作是AW通道发地址,W通道发数据,最后B通道返回响应。读和写可以同时进行,这就是AXI高性能的秘密。
7. 握手协议详解
每个通道都使用相同的握手协议:VALID和READY。这个协议其实很简单,但细节很多。
三种握手情况:
- VALID先到,READY后到:最常见的情况。主设备先拉高VALID,从设备准备好后拉高READY,握手成功。
- READY先到,VALID后到:从设备提前准备好,主设备后发数据。这种情况也允许。
- VALID和READY同时到:一拍完成握手,效率最高。
协议规定:VALID拉高后,不能依赖READY再拉高。也就是说,主设备必须主动发出数据,不能等。但READY可以等VALID,也可以不等。
我曾经踩过的坑:在设计一个AXI从设备时,我把READY设计成了组合逻辑,结果VALID和READY同时变化,产生了毛刺。后来改成寄存器输出,问题解决。记住:READY最好用寄存器输出,避免组合逻辑。
8. 突发传输示例
来看一个实际的写突发传输例子。假设我们要写4个32位数据到地址0x1000:
// 写地址通道
AWADDR = 0x1000
AWLEN = 3 // 突发长度4(0-3)
AWSIZE = 2 // 4字节(2^2 = 4)
AWBURST = 1 // 增量突发
// 写数据通道
WDATA[0] = 0xAABBCCDD // 地址0x1000
WDATA[1] = 0x11223344 // 地址0x1004
WDATA[2] = 0x55667788 // 地址0x1008
WDATA[3] = 0x99AABBCC // 地址0x100C
WLAST = 1 // 最后一个数据
// 写响应通道
BRESP = OKAY // 写成功
时序上,AW通道先握手,然后W通道依次发送4个数据,每个数据握手一次。最后一个数据发送完成后,从设备返回B通道响应。
9. 实际调试中的常见问题
我总结几个调试中经常遇到的问题:
| 问题 | 现象 | 原因 | 解决方法 |
|---|---|---|---|
| 读数据不匹配 | 读回来的数据和预期不符 | ARID和RID不匹配 | 检查ID分配逻辑 |
| 写操作无响应 | B通道一直不返回 | WLAST没有拉高 | 检查WLAST时序 |
| 数据错位 | 写进去的数据位置不对 | WSTRB设置错误 | 检查字节选通信号 |
| 死锁 | 总线卡住不动 | 握手信号互相等待 | 检查VALID/READY依赖 |
死锁这个问题我得多说两句。AXI协议虽然规定了VALID不能依赖READY,但实际设计中很容易出现循环依赖。比如主设备等从设备的READY,从设备又等主设备的VALID,结果两边都卡住了。调试时遇到总线不动,先查握手信号。
总结一下:五个通道各司其职,读地址和读数据是一对,写地址、写数据和写响应是一对。握手协议是VALID/READY,记住主设备主动,从设备响应。搞懂这些,AXI的基本功就算打牢了。
好了,这一章的内容就到这里。五个通道的信号和时序,说白了就是地址、数据、响应三个要素,加上握手协议。你想想看,是不是这个理?