2、AXI通道与握手:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道,VALID/READY握手机制详解

好,咱们今天来聊聊AXI最核心的东西——通道和握手。

说实话,我刚接触AXI的时候,被这五个通道搞得有点晕。读地址、读数据、写地址、写数据、写响应……怎么这么多?后来做项目多了才明白,这种分离设计恰恰是AXI高性能的秘诀。

2.1 五个独立通道

AXI协议把一次传输拆成了五个独立的通道。你想想看,这就像一条高速公路,把不同方向的车流分开了,互不干扰。

五个通道分别是:

  • 读地址通道(AR通道):主机告诉从机,我要读哪个地址的数据
  • 读数据通道(R通道):从机把读到的数据返回给主机
  • 写地址通道(AW通道):主机告诉从机,我要往哪个地址写数据
  • 写数据通道(W通道):主机把要写的数据发送给从机
  • 写响应通道(B通道):从机告诉主机,写操作完成了,有没有出错

这里有个关键点:读操作只需要两个通道(AR和R),写操作需要三个通道(AW、W、B)。为什么写多一个?因为写操作需要从机确认——你给我的数据我收到了,而且写成功了。读操作不需要确认,数据返回本身就意味着成功。

我在项目中遇到过一位同事,他写了一个AXI从机,结果B通道的响应信号一直没发出去,主机那边等得都快超时了。查了半天,原来是BVALID信号没拉高。嗯,这种坑踩过一次就记住了。

2.2 VALID/READY握手机制

每个通道的传输都靠一对信号来控制:VALID和READY。

  • VALID:发送方说「我准备好了,数据在总线上,你快来拿」
  • READY:接收方说「我准备好了,你可以把数据给我了」

说白了,这就是一个「你情我愿」的握手过程。只有双方都准备好了,数据才能真正传输过去。

三种握手情况

情况 VALID READY 说明
发送方先准备好 先拉高 后拉高 发送方等待接收方
接收方先准备好 后拉高 先拉高 接收方等待发送方
同时准备好 同时拉高 同时拉高 一拍完成传输

你可能会问:「如果双方都准备好了,但数据还没稳定怎么办?」

好问题。AXI协议规定:一旦VALID拉高,数据必须保持稳定,直到握手完成。也就是说,发送方不能随便改变数据,必须等到READY也拉高,传输完成才能换下一笔。

我的小技巧:设计从机时,我习惯让READY信号默认拉高。这样只要主机发数据过来,一拍就能传完,效率最高。除非从机内部忙不过来,才把READY拉低让主机等一等。

2.3 读操作流程

读操作的流程其实很简单:

  1. 主机在AR通道上发出读地址,同时拉高ARVALID
  2. 从机拉高ARREADY,接收地址
  3. 从机根据地址读取数据,在R通道上返回数据,同时拉高RVALID
  4. 主机拉高RREADY,接收数据

这里有个细节:读数据通道还带了一个RLAST信号。如果是突发读(burst),RLAST会在最后一笔数据时拉高,告诉主机「这是最后一份了」。

我曾经调试过一个DMA控制器,读回来的数据总是少一个。后来发现是从机的RLAST信号时序有问题,最后一笔数据还没读完就拉高了。嗯,这种边界问题最容易出bug。

2.4 写操作流程

写操作稍微复杂一点,因为涉及三个通道的配合:

  1. 主机在AW通道上发出写地址,拉高AWVALID
  2. 主机在W通道上发出写数据,拉高WVALID
  3. 从机接收地址和数据后,完成写操作
  4. 从机在B通道上返回写响应,拉高BVALID
  5. 主机拉高BREADY,接收响应

注意:写地址和写数据可以同时发送,也可以先后发送。协议没有规定顺序。但写响应必须在地址和数据都接收完之后才能发出。

避坑指南:我曾经设计过一个从机,写地址和写数据分开处理,结果地址先到了,数据后到,从机以为写完了就发了BVALID。主机收到响应后以为写完了,实际上数据还没写进去。后来我加了一个「地址-数据配对检查」,确保两者都到了才发响应。

2.5 握手时序图

下面我用一张SVG图来展示读操作的握手过程,这样更直观一些。

AXI读操作握手时序图 CLK T1 T2 T3 T4 T5 ARVALID ARREADY 握手 RVALID RREADY 握手 RDATA 有效数据 T1: 主机发地址,ARVALID拉高 T2: 从机接收地址,ARREADY拉高,握手完成 T3-T4: 从机准备数据,RREADY一直拉高 T4: 从机返回数据,RVALID拉高,握手完成

从图上你能看到,ARVALID和ARREADY在T2周期握手成功,地址传过去了。然后从机开始准备数据,RREADY一直拉高表示随时可以接收。到T4周期,RVALID拉高,数据传回来了。

2.6 握手依赖关系

五个通道之间不是完全独立的,它们有依赖关系:

  • 读数据通道依赖读地址通道:没有地址,从机不知道读什么数据
  • 写响应通道依赖写地址和写数据通道:两者都到了才能发响应
  • 写地址和写数据之间没有依赖:可以乱序到达

说白了,地址是「问路」,数据是「货物」,响应是「回执」。你得先问路才能去取货,货到了才能给回执。

我的经验:设计复杂系统时,我习惯把每个通道的握手状态机分开写。这样调试起来方便,哪个通道卡住了,一眼就能看出来。我曾经用这种方法半小时就定位了一个死锁问题——写数据通道的WLAST信号没拉高,从机一直等最后一笔数据,结果死等。

2.7 总结一下

AXI的五个通道和VALID/READY握手,说白了就是一套「分工明确、各司其职」的通信协议。读和写分开,地址和数据分开,再加上一个确认机制,让整个总线系统既能高效传输,又能保证数据正确。

你想想看,如果没有这个握手机制,发送方一股脑把数据丢出去,接收方来不及处理怎么办?数据就丢了。有了VALID/READY,双方可以协商节奏,快慢都能适应。

嗯,这就是AXI的精髓所在。下一节我们会聊聊突发传输和地址计算,到时候你会看到这些通道是怎么配合完成大数据块传输的。

核心要点回顾:

  • 五个通道:AR、R、AW、W、B
  • VALID/READY握手:双方都准备好才能传输
  • 读操作2个通道,写操作3个通道
  • 数据必须在VALID拉高后保持稳定
  • 通道间有依赖关系,设计时要注意

可可精品资料库