AXI通道详解:五大通道的信号定义与时序

各位同学,今天我们来啃一块硬骨头——AXI的五个独立通道。说实话,我刚接触AXI时也被这五个通道搞得头晕。但后来我发现,只要理解了每个通道的「职责」和「握手规则」,这玩意儿其实挺清晰的。

AXI协议把一次传输拆成了五个独立的通道。为什么这么设计?说白了就是为了并行。读操作和写操作可以同时进行,地址传输和数据传输也能重叠。这在高性能系统里特别有用。

一、读地址通道(AR)

读地址通道,简称AR通道。它的任务很简单:告诉从设备,我要读哪个地址的数据。

这个通道的核心信号就几个:

信号 方向 描述
ARADDR 主机→从机 读地址,32位或64位
ARLEN 主机→从机 突发长度,表示一次传输多少个数据
ARSIZE 主机→从机 每个数据的字节数,比如2表示4字节
ARBURST 主机→从机 突发类型:固定、递增、包裹
ARVALID 主机→从机 地址有效信号
ARREADY 从机→主机 从机准备好接收地址

这里有个关键点:ARVALID和ARREADY的握手。我刚开始做设计时,总以为地址发出去就完事了。其实不是,从机可能还没准备好。只有两个信号同时为高,地址才算真正被接收。

握手规则:VALID和READY必须同时为高,传输才完成。谁先拉高都可以,但最终要同时为高。

我个人习惯把AR通道想象成「叫外卖」——你告诉店家地址(ARADDR),说我要几份(ARLEN),每份多大(ARSIZE)。店家说「收到」(ARREADY),这个订单才算生效。

二、读数据通道(R)

读数据通道是R通道。从设备把读到的数据通过这个通道返回给主机。

R通道的信号:

信号 方向 描述
RDATA 从机→主机 读回来的数据
RRESP 从机→主机 读响应状态:OKAY、EXOKAY、SLVERR、DECERR
RLAST 从机→主机 最后一个数据标志
RVALID 从机→主机 数据有效
RREADY 主机→从机 主机准备好接收数据

嗯,这里要注意:R通道的握手方向跟AR通道是反的。AR是主机主动,R是从机主动。从机把数据放到RDATA上,拉高RVALID,等主机拉高RREADY,数据才算被接收。

RLAST这个信号特别重要。一次突发传输可能有多个数据,RLAST告诉主机「这是最后一个了」。我在项目中遇到过一个问题:从机忘了拉RLAST,主机就一直等下一个数据,整个总线就卡死了。这种bug特别难查,因为波形上看数据都对了,就是停不下来。

避坑指南:我曾经调试一个DMA控制器,发现读数据总是少一个。后来发现是RLAST的时序没对齐——RLAST必须和最后一个数据的RVALID同时拉高,不能早也不能晚。

三、写地址通道(AW)

写地址通道AW,跟AR通道几乎一模一样,只是方向变成了写。

核心信号:AWADDR、AWLEN、AWSIZE、AWBURST、AWVALID、AWREADY。

说白了,AW通道就是告诉从机:「我要往这个地址写数据,写这么多笔,每笔这么大。」

你可能会问:为什么写操作要单独一个地址通道?不能跟数据一起发吗?

原因很简单:地址和数据可以流水线操作。主机可以先发地址,然后慢慢准备数据。从机收到地址后也可以提前准备。这样效率就上去了。

四、写数据通道(W)

写数据通道W,负责把要写的数据发给从机。

信号 方向 描述
WDATA 主机→从机 写数据
WSTRB 主机→从机 字节选通,哪些字节有效
WLAST 主机→从机 最后一个数据标志
WVALID 主机→从机 数据有效
WREADY 从机→主机 从机准备好接收数据

WSTRB这个信号很有意思。比如你只想写一个32位数据中的低8位,WSTRB就设为4'b0001。这样从机就知道只更新低8位,其他位保持不变。这在寄存器配置时特别有用。

写数据通道的时序跟读数据通道类似,只是方向反了。主机发数据,从机收数据。WLAST表示这是突发传输的最后一个数据。

注意:写地址通道和写数据通道是独立的。地址可以先发,数据后发,也可以反过来。但通常的做法是地址先发,数据紧跟其后。我见过一个设计,地址和数据完全乱序,结果从机逻辑写得特别复杂。

五、写响应通道(B)

写响应通道B,这是AXI协议里最容易被忽视的通道。很多初学者以为数据发完就完事了,其实不是。

B通道的信号:

信号 方向 描述
BRESP 从机→主机 写响应状态
BVALID 从机→主机 响应有效
BREADY 主机→从机 主机准备好接收响应

B通道的作用是告诉主机:你刚才的写操作成功了没有。如果从机发现地址不对、或者写保护了,就会返回SLVERR或DECERR。

我记得有一次调试一个外设,写寄存器总是写不进去。波形上看WDATA和WVALID都对,但就是没反应。后来发现是B通道的BREADY没拉高,从机一直在等主机确认响应。主机那边以为写完了就不管了,结果两边都卡住了。

关键点:一次完整的写操作,必须等到B通道的响应回来才算结束。不要以为WLAST发完就万事大吉了。

六、五个通道的时序关系

现在我们把五个通道串起来看。一次读操作涉及两个通道:AR和R。一次写操作涉及三个通道:AW、W、B。

读操作的流程:

  1. 主机通过AR通道发送读地址
  2. 从机通过R通道返回数据(可能多个)
  3. R通道的最后一个数据带RLAST标志

写操作的流程:

  1. 主机通过AW通道发送写地址
  2. 主机通过W通道发送写数据(可能多个)
  3. 从机通过B通道返回写响应

这里有个重要的时序约束:B通道的响应必须在WLAST之后才能发出。也就是说,从机必须收到所有数据后,才能给出写响应。这个顺序不能乱。

下面我用一张图来展示五个通道的关系:

AXI五个通道关系图 主机 从机 AR通道:读地址 R通道:读数据 + RLAST AW通道:写地址 W通道:写数据 + WLAST B通道:写响应 图例: 主机→从机 从机→主机 读操作:AR + R | 写操作:AW + W + B

从这张图可以看得很清楚:读操作是两条通道,写操作是三条通道。箭头方向表示数据流向。

七、握手时序示例

最后,我们看一个具体的握手时序。以读地址通道为例:

// 读地址通道握手时序示例
// 时钟周期 0: 主机拉高ARVALID,地址放到ARADDR
// 时钟周期 1: 从机还没准备好,ARREADY为低
// 时钟周期 2: 从机拉高ARREADY,握手完成

always @(posedge clk) begin
    if (ARVALID && ARREADY) begin
        // 地址被成功接收
        addr_received <= 1'b1;
    end
end

这个握手模式在所有通道上都一样。VALID和READY同时为高,传输完成。你可以想象成两个人握手——一个人伸手(VALID),另一个人也伸手(READY),两只手握在一起才算成功。

个人经验:我建议在设计时,把VALID和READY的握手逻辑封装成一个模块。这样五个通道都可以复用,代码也干净。我曾经在一个项目里手写了五遍握手逻辑,后来改协议时改得想哭。

好了,五个通道的信号定义和时序就讲到这里。记住一句话:每个通道独立握手,地址和数据可以流水,写操作必须等B通道响应。把这些搞清楚了,AXI总线的基本框架你就掌握了。

可可精品资料库