3. AXI信号详解:全局信号与五个通道
AXI总线,说白了就是一套握手协议。你想想看,主设备和从设备之间要传数据,总得有个约定吧?这个约定就是靠一堆信号线来实现的。今天我就带你把这堆信号线捋一遍。
我个人习惯把AXI信号分成两大类:全局信号和通道信号。通道信号又分成五个独立的通道。嗯,咱们一个一个来看。
3.1 全局信号:ACLK 和 ARESETn
这两个信号是所有AXI操作的基础。没有它们,其他信号都是摆设。
| 信号名 | 方向 | 说明 |
|---|---|---|
| ACLK | 主→从 | 全局时钟信号。所有信号都在ACLK的上升沿采样。 |
| ARESETn | 主→从 | 全局复位信号,低电平有效。 |
ACLK:所有AXI操作都同步于这个时钟的上升沿。我在项目中遇到过有人把ACLK接成了下降沿触发,结果仿真没问题,上板就乱套。记住,一定是上升沿。
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:保留。
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后,就知道读操作结束了。
3.7 知识体系总览
下面这张图,把AXI信号的全局结构和五个通道的关系画出来了。你一看就明白。
从这张图可以看出来,AXI的五个通道是独立的。写地址、写数据、写响应三个通道组成一次写事务。读地址和读数据两个通道组成一次读事务。每个通道都有自己的握手信号(VALID和READY),互不干扰。
好了,这一章的内容就到这儿。信号虽然多,但记住一个原则:每个通道都是独立的,靠ID来关联。你把这个记住了,后面就好办了。