3. AXI信号详解:全局信号与五个通道

AXI总线,说白了就是一套握手协议。你想想看,主设备和从设备之间要传数据,总得有个约定吧?这个约定就是靠一堆信号线来实现的。今天我就带你把这堆信号线捋一遍。

我个人习惯把AXI信号分成两大类:全局信号和通道信号。通道信号又分成五个独立的通道。嗯,咱们一个一个来看。

3.1 全局信号:ACLK 和 ARESETn

这两个信号是所有AXI操作的基础。没有它们,其他信号都是摆设。

信号名 方向 说明
ACLK 主→从 全局时钟信号。所有信号都在ACLK的上升沿采样。
ARESETn 主→从 全局复位信号,低电平有效。

ACLK:所有AXI操作都同步于这个时钟的上升沿。我在项目中遇到过有人把ACLK接成了下降沿触发,结果仿真没问题,上板就乱套。记住,一定是上升沿。

ARESETn:低电平复位。复位时,所有接口信号必须回到默认状态。我建议复位至少保持三个时钟周期,确保所有寄存器都复位干净。

注意:ARESETn是低电平有效。如果你习惯用高电平复位,记得加个反相器。我曾经因为这个搞错过一次,板子一上电就死机。

3.2 写地址通道信号

写地址通道,负责把写操作的地址和属性从主设备传到从设备。核心信号如下:

信号名 位宽 说明
AWID 可配 写地址ID,用于标识一次写事务。
AWADDR 32/64位 写地址。起始地址。
AWLEN 8位 突发长度。表示一次突发传输中,有多少笔数据。
AWSIZE 3位 突发大小。每笔数据的字节数。
AWBURST 2位 突发类型。固定地址、递增地址、或回绕地址。

AWID:这个ID很重要。如果你同时发起多笔写事务,从设备会通过BID(写响应ID)把对应的ID返回给你。这样你就能知道哪笔写完成了。我习惯把ID和事务编号对应起来,调试时一眼就能看出来。

AWADDR:起始地址。注意,AXI的地址是按字节编址的。比如你写一个32位数据,地址必须是4字节对齐的。否则...嗯,从设备可能会报错。

AWLEN:突发长度。实际传输的数据笔数 = AWLEN + 1。为什么?因为AWLEN=0表示传1笔数据,AWLEN=1表示传2笔。这个坑我踩过,仿真时AWLEN设成0,结果只传了一笔,我还以为代码写错了。

AWSIZE:每笔数据的字节数。3位二进制,对应关系如下:

AWSIZE[2:0] 字节数
000 1字节
001 2字节
010 4字节
011 8字节
100 16字节

AWBURST:突发类型。三种:

  • 00:FIXED(固定地址)。每次写同一个地址。常用于写FIFO。
  • 01:INCR(递增地址)。每次地址递增。最常用。
  • 10:WRAP(回绕地址)。地址递增到边界后回绕。常用于Cache line fill。
  • 11:保留。
小技巧:调试时,我习惯先检查AWLEN和AWSIZE是否匹配。比如你设AWLEN=3(传4笔),AWSIZE=010(4字节),那么总数据量就是16字节。如果从设备只支持8字节,那就会出问题。

3.3 写数据通道信号

写数据通道,负责把数据从主设备传到从设备。核心信号:

信号名 位宽 说明
WDATA 32/64/128位 写数据。
WSTRB WDATA/8 写选通。指示哪些字节是有效的。
WLAST 1位 最后一笔数据指示。
WVALID 1位 主设备指示数据有效。
WREADY 1位 从设备指示可以接收数据。

WDATA:数据总线。位宽可以是32、64、128等。注意,数据位宽和地址对齐有关系。比如64位数据总线,地址必须是8字节对齐。

WSTRB:这个信号很关键。它告诉从设备,WDATA上哪些字节是有效的。比如你只想写一个字节,WSTRB就只置高对应的那一位。我见过有人把WSTRB全置1,结果把不该写的字节也写进去了。

WLAST:当WLAST为高时,表示这是本次突发的最后一笔数据。从设备收到WLAST后,就知道可以准备写响应了。

重点:写数据通道支持乱序传输。什么意思?就是你可以先发地址,然后数据可以晚一点到。甚至数据可以比地址先到?不行,数据必须在地址之后。但数据可以分多次发送,中间可以插入等待周期。

3.4 写响应通道信号

写响应通道,从设备告诉主设备,写操作完成得怎么样。核心信号:

信号名 位宽 说明
BID 可配 写响应ID。与AWID对应。
BRESP 2位 写响应状态。
BVALID 1位 从设备指示响应有效。
BREADY 1位 主设备指示可以接收响应。

BID:必须和对应的AWID一致。这样你才能把响应和请求对应起来。如果你同时发了两笔写,BID就能帮你区分哪笔完成了。

BRESP:响应状态。四种:

  • 00:OKAY。正常完成。
  • 01:EXOKAY。独占访问成功。
  • 10:SLVERR。从设备错误。比如地址不对、不支持的操作。
  • 11:DECERR。解码错误。地址没有映射到任何从设备。

我建议你每次上板调试时,先检查BRESP。如果出现SLVERR或DECERR,多半是地址配错了。

3.5 读地址通道信号

读地址通道,和写地址通道非常像。核心信号:

信号名 位宽 说明
ARID 可配 读地址ID。
ARADDR 32/64位 读地址。
ARLEN 8位 读突发长度。
ARSIZE 3位 读突发大小。
ARBURST 2位 读突发类型。

这些信号的含义和写地址通道完全一样。只是前缀从AW变成了AR。嗯,没什么好重复的。

3.6 读数据通道信号

读数据通道,从设备把数据返回给主设备。核心信号:

信号名 位宽 说明
RID 可配 读数据ID。与ARID对应。
RDATA 32/64/128位 读数据。
RRESP 2位 读响应状态。
RLAST 1位 最后一笔数据指示。
RVALID 1位 从设备指示数据有效。
RREADY 1位 主设备指示可以接收数据。

RID:必须和ARID一致。这样你才能把读回来的数据和读请求对应上。

RRESP:和BRESP一样。OKAY、EXOKAY、SLVERR、DECERR。

RLAST:当RLAST为高时,表示这是本次突发的最后一笔数据。主设备收到RLAST后,就知道读操作结束了。

调试建议:上板调试时,我习惯用逻辑分析仪抓一下RVALID和RREADY的握手。如果RVALID一直为低,说明从设备还没准备好数据。如果RREADY一直为低,说明主设备还没准备好接收。这两个信号卡住,整个总线就停了。

3.7 知识体系总览

下面这张图,把AXI信号的全局结构和五个通道的关系画出来了。你一看就明白。

AXI总线信号结构总览 主设备 Master 从设备 Slave 全局信号 ACLK, ARESETn 写地址通道 AWID, AWADDR, AWLEN... 写数据通道 WDATA, WSTRB, WLAST... 写响应通道 BID, BRESP... 读地址通道 ARID, ARADDR, ARLEN... 读数据通道 RDATA, RRESP, RLAST... 地址+控制 数据 响应 地址+控制 数据+响应 写通道(绿色):主设备→从设备(地址+数据),从设备→主设备(响应) 读通道(橙色):主设备→从设备(地址),从设备→主设备(数据+响应) 全局信号(紫色):ACLK和ARESETn驱动所有通道

从这张图可以看出来,AXI的五个通道是独立的。写地址、写数据、写响应三个通道组成一次写事务。读地址和读数据两个通道组成一次读事务。每个通道都有自己的握手信号(VALID和READY),互不干扰。

好了,这一章的内容就到这儿。信号虽然多,但记住一个原则:每个通道都是独立的,靠ID来关联。你把这个记住了,后面就好办了。

可可精品资料库