3、AXI4协议详解:通道架构、握手协议、突发传输与地址映射

好,咱们今天来啃一块硬骨头——AXI4协议。说实话,很多做PCIe的同学一看到AXI就头大,觉得通道多、握手复杂。但你别怕,我当年刚接触时也懵,后来在项目里被它"教育"了几次,慢慢就摸透了。

AXI4是ARM公司推出的AMBA总线家族里的老大哥。它跟PCIe配合,简直是天作之合。为什么?因为两者都是高性能、高带宽、低延迟的典范。你想想看,PCIe是外部总线,AXI是片内总线,桥接设计说白了就是让这两个"大佬"能顺畅对话。

3.1 通道架构:五个独立通道

AXI4最让我欣赏的设计,就是它的五通道架构。这五个通道各司其职,互不干扰:

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

我在项目中遇到过一个问题:刚开始设计时,我把读和写的地址通道混在一起处理,结果时序乱成一锅粥。后来才明白,独立通道的好处就是可以流水线操作——你可以在等读数据的同时,发下一个写请求。

关键点:五个通道都是独立的,每个通道都有自己的握手信号。这意味着读操作和写操作可以完全并行,互不阻塞。

3.2 握手协议:VALID与READY的舞蹈

AXI的握手协议,说白了就是VALID和READY两根信号在跳舞。发送方拉高VALID表示"我有数据要发",接收方拉高READY表示"我准备好收了"。数据只有在两者都拉高的时钟上升沿才真正传输。

握手有三种情况:

  1. VALID先来,READY后来:最常见的情况,发送方准备好数据,等接收方处理完手头的事
  2. READY先来,VALID后来:接收方提前说"我准备好了",发送方准备好后立即传输
  3. 同时来:一拍搞定,效率最高

嗯,这里要注意:VALID一旦拉高,就不能再变,直到握手成功。这是协议的死规定。我曾经在调试时犯过这个错——VALID拉高后又因为某些原因撤回了,结果从机直接死锁。那次排查花了我整整两天。

实战技巧:设计握手逻辑时,我建议用状态机来控制。发送方先拉VALID,然后等READY;接收方准备好后拉READY,采样数据。这样逻辑清晰,不容易出错。

3.3 突发传输:一次握手,多次传输

AXI4的突发传输,是它性能强悍的关键。你想想看,如果每次传一个数据都要发一次地址,那效率得多低?突发传输就是一次地址握手,后面连续传多个数据

突发传输有三个关键参数:

参数 含义 我踩过的坑
AxLEN 突发长度,传多少个数据 注意是"传的次数-1",比如传4次,AxLEN=3
AxSIZE 每个数据的字节数 不能超过数据总线宽度,否则从机不理你
AxBURST 地址递增方式 FIXED模式容易踩到地址重叠的坑

突发类型有三种:

  • FIXED:每次地址不变,适合写同一个寄存器多次
  • INCR:地址递增,最常用,适合连续内存访问
  • WRAP:地址递增到边界后回绕,适合Cache Line操作

我个人习惯用INCR模式做PCIe的DMA传输。举个例子,你要从DDR里搬1KB数据到PCIe,设置AxLEN=255(传256次),AxSIZE=4(每次4字节),地址自动递增,一拍搞定地址握手,后面256拍全是数据。

警告:突发传输不能跨4KB边界!这是AXI协议的死规定。为什么?因为很多从机(比如DDR控制器)的页大小就是4KB。我曾经在项目中没注意这个,结果地址跨页后数据全写歪了,查了三天才找到原因。

3.4 地址映射:从PCIe地址到AXI地址

地址映射是桥接设计的核心。PCIe有它自己的地址空间(配置空间、内存空间、IO空间),AXI也有自己的地址空间。桥接器要做的,就是把PCIe的访问请求,翻译成AXI能理解的地址

常见的映射方式:

  • 直接映射:PCIe的BAR空间直接对应AXI的某段地址。比如BAR0映射到AXI的0x8000_0000~0x8FFF_FFFF
  • 重映射:通过寄存器配置,把PCIe地址翻译成不同的AXI地址。灵活性高,但延迟大一点
  • 窗口映射:用几个窗口来做地址翻译,每个窗口有自己的基址和偏移

我记得有个项目,客户要求PCIe的读写能访问到片内SRAM和片外DDR。我用了两个窗口:窗口0映射到SRAM(0x0000_0000~0x0000_FFFF),窗口1映射到DDR(0x8000_0000~0x8FFF_FFFF)。配置好BAR后,PCIe主机直接读写对应地址就行,桥接器自动完成翻译。

核心要点:地址映射的关键是对齐。PCIe的地址、AXI的地址、数据宽度、突发长度,这些都要对齐。否则就会出现数据错位、地址越界等问题。

3.5 实战中的常见问题

最后,我分享几个实战中容易踩的坑:

  • 握手超时:如果从机一直不拉READY,主机就会死等。建议加个超时计数器,超时后报错或重试
  • 数据对齐:AXI要求地址必须对齐到数据宽度。比如32位数据,地址必须是4的倍数。不对齐的话,需要做字节选通处理
  • 乱序传输:AXI4支持乱序,但很多从机不支持。设计时最好把ID信号固定,强制顺序传输
  • 响应处理:写响应(B通道)不能丢。我曾经因为B通道处理不及时,导致从机卡死在等待状态

好了,这一章的内容就到这里。AXI4协议看着复杂,但只要你理解了五通道、握手协议、突发传输、地址映射这四个核心,剩下的都是细节。下一章我们讲具体的桥接设计实现,到时候我会拿一个真实的PCIe转AXI的案例来拆解。