第2章:AXI通道详解——五个通道的信号定义与时序
各位同学,今天我们来聊聊AXI总线最核心的部分——五个独立通道。
我刚接触AXI时,最头疼的就是这五个通道。读地址、读数据、写地址、写数据、写响应,每个通道都有自己的信号集和握手规则。说实话,一开始真有点懵。但后来我发现,只要理解了设计者的意图,这些通道其实很清晰。
2.1 为什么是五个通道?
AXI协议把读写操作拆成了独立的通道。为什么这么设计?
你想想看,传统的总线读写是串行的——先发地址,再等数据,期间总线被占用。AXI不一样,它允许读操作和写操作同时进行,甚至多个未完成的事务可以并行处理。
我个人习惯把五个通道分成两组:
- 读事务组:读地址通道(AR) + 读数据通道(R)
- 写事务组:写地址通道(AW) + 写数据通道(W) + 写响应通道(B)
读操作只需要两个通道,写操作需要三个。为什么写多一个?因为写操作需要对方给你一个确认信号——数据写进去了没有?这就是写响应通道的作用。
核心要点:五个通道都是独立的,每个通道都有自己的VALID/READY握手信号。这意味着地址、数据、响应可以在不同时间点发送,互不阻塞。
2.2 握手协议:VALID和READY
在讲具体通道之前,必须先搞定握手协议。这是AXI的基础,也是很多新手容易出错的地方。
每个通道都有一对控制信号:
- VALID:发送方表示「我准备好了,数据有效」
- READY:接收方表示「我准备好了,可以接收」
数据只有在VALID和READY同时为高时才会传输。这里有三种情况:
| 场景 | VALID | READY | 是否传输 |
|---|---|---|---|
| 发送方先准备好 | 先拉高 | 后拉高 | READY拉高时传输 |
| 接收方先准备好 | 后拉高 | 先拉高 | VALID拉高时传输 |
| 同时准备好 | 同时拉高 | 同时拉高 | 立即传输 |
我的经验:设计从机时,我习惯让READY在复位后默认拉高。这样主机只要拉高VALID就能立即传输,减少一个周期的等待。但要注意,如果从机无法立即接收,必须能及时拉低READY。
2.3 读地址通道(AR通道)
读地址通道用于主机发送读请求。主要信号有:
- ARID:读事务ID,用于匹配地址和返回的数据
- ARADDR:读起始地址
- ARLEN:突发长度,表示一次读操作包含多少笔数据传输
- ARSIZE:每笔数据的大小(字节数)
- ARBURST:突发类型(FIXED、INCR、WRAP)
- ARVALID + ARREADY:握手信号
时序上很简单:主机把地址和控制信号放到总线上,拉高ARVALID。从机准备好后拉高ARREADY,完成握手。
我曾经遇到一个坑:ARLEN的值是「突发长度减1」。比如你要读4笔数据,ARLEN要设成3。这个细节很容易搞错,导致读回来的数据多一笔或少一笔。
2.4 读数据通道(R通道)
从机收到读地址后,通过读数据通道返回数据。信号包括:
- RID:读事务ID,必须与对应的ARID一致
- RDATA:读回来的数据
- RRESP:读响应状态(OKAY、EXOKAY、SLVERR、DECERR)
- RLAST:最后一笔数据的标志
- RVALID + RREADY:握手信号
这里有个关键点:读数据通道可以乱序返回。什么意思?如果你发了两个读请求,ID分别是A和B,从机可以先返回B的数据再返回A的数据。只要ID能对上就行。
注意:RLAST信号只在突发传输的最后一笔数据时拉高。主机必须检测这个信号,才知道一次读操作何时结束。我见过有人忘了检查RLAST,结果一直等数据,系统卡死。
2.5 写地址通道(AW通道)
写地址通道和读地址通道几乎一样,只是前缀从AR变成了AW:
- AWID、AWADDR、AWLEN、AWSIZE、AWBURST
- AWVALID + AWREADY
写地址和写数据是分开的通道,这意味着地址可以在数据之前发送,也可以在数据之后发送,甚至可以同时发送。AXI协议对这两者的顺序没有强制要求。
但有一点要注意:从机通常需要先收到地址才知道数据要写到哪里。所以实际设计中,地址一般先于或同时于数据到达。
2.6 写数据通道(W通道)
写数据通道传输实际要写入的数据。信号有:
- WID:写数据ID(注意:AXI4已经去掉了这个信号)
- WDATA:要写入的数据
- WSTRB:字节选通信号,指示哪些字节是有效的
- WLAST:最后一笔数据的标志
- WVALID + WREADY:握手信号
WSTRB这个信号很重要。比如你只想写一个32位数据中的低8位,WSTRB就设成4'b0001。从机根据WSTRB决定哪些字节真正写入。
我记得有一次调试DMA控制器,发现写进去的数据总是错的。查了半天,原来是WSTRB没有正确生成,导致高字节覆盖了不该覆盖的内容。嗯,从那以后我每次检查写操作都会先看WSTRB。
2.7 写响应通道(B通道)
写操作完成后,从机通过写响应通道返回状态。信号很简单:
- BID:写事务ID
- BRESP:写响应状态
- BVALID + BREADY:握手信号
写响应通道只有一个事务对应一个响应,不是每笔数据一个响应。也就是说,一次突发写操作完成后,从机只返回一次B通道响应。
重要:主机必须等待B通道的响应,才能确认数据已经成功写入。如果忽略B通道,你永远不知道写操作是否真的完成了。
2.8 五个通道的时序关系
下面我用一张图来展示五个通道在读写操作中的时序关系:
从图中可以看出:
- 读操作:先发AR地址,然后从机返回R数据(最后一笔带RLAST)
- 写操作:先发AW地址,然后发W数据(最后一笔带WLAST),最后从机返回B响应
- 读和写可以完全重叠,互不干扰
2.9 实际设计中的注意事项
最后,分享几个我在项目中总结的经验:
- ID管理要谨慎:每个事务的ID必须唯一,否则无法区分乱序返回的数据。我一般用计数器生成ID,事务完成后回收。
- 不要忘记WLAST:写数据通道的WLAST必须准确拉高,否则从机不知道写操作何时结束。
- B通道不能丢:每个写事务都必须对应一个B响应。如果主机不等B通道就发起下一个写操作,可能会覆盖未完成的数据。
- 握手超时处理:如果VALID拉高后长时间等不到READY,要考虑超时机制。我曾经遇到过从机死锁,主机一直等READY,整个系统卡住。
小技巧:调试AXI接口时,我习惯用逻辑分析仪同时抓五个通道的VALID和READY信号。只要看到某个通道的VALID一直高但READY一直低,基本就能定位到问题。
好了,五个通道的信号和时序就讲到这里。记住一个核心思想:AXI的五个通道是独立的,它们通过握手信号协调工作。理解了这一点,后面的复杂内容就好办了。
可可精品资料库