AXI协议基础:五大通道与握手信号详解

大家好,我是你们的FPGA讲师。今天我们来聊聊AXI协议最核心的部分——五个独立通道和它们的握手机制。说实话,我刚接触AXI时也被这五个通道搞得有点晕,但一旦理解了设计者的意图,你会发现这套协议其实非常优雅。

一、AXI的五个独立通道

AXI协议把一次总线传输拆成了五个独立的通道。为什么要拆开?说白了就是为了并行处理,提高效率。你想想看,读操作和写操作可以同时进行,地址和数据也能分开传输,这比传统的单总线设计灵活多了。

1. 读地址通道(AR通道)

这个通道负责发送读请求。主设备告诉从设备:「我要读数据,地址是XXX」。我习惯把AR通道想象成「问路」的过程——你先告诉对方你要去哪里。

  • ARADDR:读地址,32位或64位
  • ARLEN:突发长度,表示一次读几个数据
  • ARSIZE:每个数据的字节数
  • ARBURST:突发类型,固定地址还是递增地址

重要提醒:AR通道只负责发地址,不负责传数据。数据走的是独立的R通道。

2. 读数据通道(R通道)

从设备收到读地址后,通过R通道把数据返回给主设备。这个通道还带了一个RRESP信号,用来告诉主设备读取是否成功。

  • RDATA:读回来的数据
  • RRESP:读响应状态(OKAY、EXOKAY、SLVERR、DECERR)
  • RLAST:最后一个数据的标志位

我在项目中遇到过一个问题:从设备返回数据太慢,主设备一直等。后来发现是R通道的READY信号没处理好。嗯,这里要注意,主设备必须准备好接收数据时才能拉高RREADY。

3. 写地址通道(AW通道)

和读地址通道类似,只不过这次是写操作。主设备告诉从设备:「我要往这个地址写数据」。

  • AWADDR:写地址
  • AWLEN:写突发长度
  • AWSIZE:每个写数据的字节数
  • AWBURST:写突发类型

4. 写数据通道(W通道)

这个通道传输实际要写入的数据。注意,写地址和写数据是分开的通道,所以地址和数据可以同时发送,不需要等地址握手完成再发数据。

  • WDATA:要写入的数据
  • WSTRB:写选通信号,控制哪些字节有效
  • WLAST:最后一个数据的标志位

个人经验:WSTRB这个信号很容易被忽略。如果你只写32位数据中的低16位,WSTRB就要设为2'b0011。我曾经因为忘记设置WSTRB,导致整个32位都被写入了,调试了半天才发现问题。

5. 写响应通道(B通道)

从设备写完数据后,通过B通道返回写响应。这个通道只有一个信号——BRESP,告诉主设备写入是否成功。

  • BRESP:写响应状态
  • BVALID:响应有效信号
  • BREADY:主设备准备好接收响应

二、握手信号:VALID和READY

五个通道各自独立工作,但每个通道都依赖一对握手信号——VALID和READY。这是AXI协议的精髓所在。

握手的基本规则

说白了就是一句话:发送方拉高VALID表示数据有效,接收方拉高READY表示可以接收。数据在VALID和READY同时为高的时钟上升沿被传输。

有三种握手场景:

  1. VALID先高,READY后高:发送方先准备好数据,等待接收方
  2. READY先高,VALID后高:接收方先准备好,等待发送方
  3. 同时拉高:一拍完成传输,效率最高

关键点:VALID信号一旦拉高,必须保持到握手完成。不能随意拉低,否则接收方会丢失数据。这是AXI协议的死规定,违反的话仿真可能没问题,但实际芯片会出大问题。

握手时序示例

我们来看一个典型的读地址通道握手时序:

// 伪代码描述
always @(posedge clk) begin
  if (reset) begin
    ARVALID <= 1'b0;
    ARADDR  <= 32'h0;
  end else begin
    if (需要发送读请求) begin
      ARVALID <= 1'b1;
      ARADDR  <= 目标地址;
    end else if (ARVALID && ARREADY) begin
      // 握手成功,拉低VALID
      ARVALID <= 1'b0;
    end
  end
end

三、通道间的依赖关系

五个通道虽然独立,但存在一些依赖关系。我画了一张图来展示它们之间的关系:

主设备 从设备 AR通道(读地址) R通道(读数据) AW通道(写地址) W通道(写数据) B通道(写响应) ■ 读地址 ■ 读数据 ■ 写地址 ■ 写数据 ■ 写响应

从这张图可以看出:

  • 读操作需要AR和R两个通道配合
  • 写操作需要AW、W和B三个通道配合
  • 读和写可以完全并行,互不干扰

四、避坑指南

我曾经踩过的坑:

  • VALID保持问题:有一次我设计的从设备在握手前拉低了VALID,结果主设备只收到了部分数据。记住,VALID一旦拉高,必须等到握手完成才能拉低。
  • READY过早拉高:主设备还没准备好接收数据就拉高了READY,结果数据来了却处理不过来。建议在确认内部缓冲区有空位时再拉高READY。
  • WLAST忘记拉高:写突发传输时,最后一个数据必须伴随WLAST拉高。我见过有人忘记这个,导致从设备一直等数据。

五、总结

AXI的五个通道和握手信号,说白了就是一套高效的数据传输协议。每个通道独立工作,通过VALID/READY握手来协调。理解了这个基础,后面学习AXI的突发传输、乱序传输、原子操作等高级特性就会轻松很多。

我个人建议,刚开始学习时先掌握读操作和写操作的基本流程,把握手时序画清楚。等熟练了再去看那些复杂的特性。毕竟,万丈高楼平地起,基础打牢了才能走得更远。

小技巧:在仿真时,可以打印出每个通道的VALID和READY信号,观察它们的握手时序。如果发现数据没有按预期传输,十有八九是握手信号出了问题。

可可精品资料库