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. 五个通道的时序关系

五个通道虽然独立,但时序上有依赖关系。我画了一张图,你们看看就明白了。

AXI五个通道时序关系图 主设备 从设备 AR通道:地址 + 控制信号 R通道:数据 + 响应 AW通道:地址 + 控制信号 W通道:数据 + 字节选通 B通道:写响应 时序依赖关系: • 读操作:AR通道握手 → R通道数据返回(RLAST结束) • 写操作:AW通道握手 + W通道数据发送 → B通道响应返回 • 读和写可以完全并行,互不干扰

从图上可以清楚看到:读操作是AR通道先发地址,然后R通道返回数据。写操作是AW通道发地址,W通道发数据,最后B通道返回响应。读和写可以同时进行,这就是AXI高性能的秘密。

7. 握手协议详解

每个通道都使用相同的握手协议:VALID和READY。这个协议其实很简单,但细节很多。

三种握手情况:

  1. VALID先到,READY后到:最常见的情况。主设备先拉高VALID,从设备准备好后拉高READY,握手成功。
  2. READY先到,VALID后到:从设备提前准备好,主设备后发数据。这种情况也允许。
  3. 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的基本功就算打牢了。

好了,这一章的内容就到这里。五个通道的信号和时序,说白了就是地址、数据、响应三个要素,加上握手协议。你想想看,是不是这个理?

可可精品资料库