AXI通信协议
AXI总线信号
系统全局信号
- AXI 总线中有两个全局信号:ACLK,全局的时钟信号,所有的传输操作都发生在 ACLK 的上升沿。ARESETn,全局复位信号,低电平有效。
信号 |
源 |
功能 |
ACLK |
时钟源 |
全局时钟信号 |
ARESETn |
复位源 |
全局复位信号,低电平有效 |
读地址通道信号
- 在通道上传输地址和控制信息,地址位宽一般限制为32位。
信号 |
源 |
功能 |
ARID[3:0] |
主机 |
读地址ID,为读地址信号组的ID tag |
ARADDR[31:0] |
主机 |
读地址 |
ARLEN[3:0] |
主机 |
突发式读长度 |
ARSIZE[2:0] |
主机 |
突发式读大小 |
ARVURST[1:0] |
主机 |
突发式读类型 |
ARVALID |
主机 |
高电平为读地址有效,一直保持至ARREADY拉高 |
ARREADY |
从机 |
高电平表明从机已做好接收准备 |
读数据通道
- 读数据通道上包括从机发送给主机的读数据以及读操作完成状态回复,数据的宽度可以是8,16,64,128,256,512 或者是 1024 比特。
信号 |
源 |
功能 |
RID[3:0] |
从机 |
读ID tag,数值需与ARID相匹配 |
RDATA[31:0] |
从机 |
读的数据 |
RRESP[1:0] |
从机 |
读响应,表明读传输的状态 |
RLAST |
从机 |
读事务传输的最后一个数据 |
RVALID |
从机 |
高电平表示读数据有效 |
RREADY |
主机 |
高电平表示读数据就绪 |
写地址通道
- 在通道上传输地址和控制信息,地址位宽一般限制为32位。
信号 |
源 |
功能 |
ARID[3:0] |
主机 |
写地址ID,为写地址信号组的ID tag |
ARADDR[31:0] |
主机 |
写地址 |
ARLEN[3:0] |
主机 |
突发式写长度 |
ARSIZE[2:0] |
主机 |
突发式写大小 |
ARVURST[1:0] |
主机 |
突发式写类型 |
ARVALID |
主机 |
高电平为写地址有效,一直保持至ARREADY拉高 |
ARREADY |
从机 |
高电平表明从机已做好接收准备 |
写数据通道
- 写数据的宽度和读数据通道的数据位宽相同,写通道有一点读通道所不具有的特性是有 WSTRB 信号,用于标识写数据中有效的传输字节,即有些无效的数据,出于减少主机工作量的目的,或者在读写宽度不对称时,被放到写数据通道上和有效数据一起发送。而 WSTRB 的信号的作用就是标识出这些无用的数据,告知从机不需要接收无用数据。(Master:我太懒,以至于把所有信号都送过来了)
信号 |
源 |
功能 |
WID[3:0] |
主机 |
读ID tag,数值需与ARID相匹配 |
WDATA[31:0] |
主机 |
写的数据 |
WSTRB[3:0] |
主机 |
写阈门,表示区间为WSTRB*8bit |
WLAST |
主机 |
写事务传输的最后一个数据 |
WVALID |
主机 |
高电平表示写数据有效 |
WREADY |
从机 |
高电平表示写数据就绪 |
写应答通道
- 用于从机将写完成情况回复给主机。所有的写传输操作都需要在写回复通道上接收此次写传输操作的完成情况。值得注意的是写回复是针对一次突发传输的,而不是针对每一次的写数据操作的。(一次突发传输包括了多次写操作)
信号 |
源 |
功能 |
BID[3:0] |
从机 |
写响应ID,需与AWID相匹配 |
BRESP[1:0] |
从机 |
写响应,表明写传输的状态 |
BVALID |
从机 |
高电平表示写响应有效 |
BREADY |
主机 |
高电平表示主机写响应就绪 |
- 为什么没有读应答通道呢?
这个问题可以从数据流向看出来,主机在读取数据时,数据在读通道上传输,流向为从机到主机。而读回复由从机向主机报告读操作的情况,信号的数据流向也是从机到主机,所以读回复可以合并在读数据通道中。但写回复通道的数据流向就和写数据相反。写数据是从主机到从机,而写回复为从机报告写操作的完成情况,流向为从机到主机,无法合并到写数据通道中,另一方面,写回复又是不可或缺的,所以就有了一条独立的写回复通道。
AXI协议握手机制
握手机制
- AXI4采用的是READY-VALID握手通信机制,即主从模块进行数据通信前, 先根据操作对各所用到的数据、地址通道进行握手。主要操作包括传输发送者A等到传输接受者B的 READY 信号后,A将数据与 VALID信号同时发送给B,开始数据的传输过程。
- 通过该握手机制,发送方可通过VALID信号控制发送速率,接收方也可通过READY信号控制发送速率,从而实现双向的流量控制。
- 协议规定,置起 VALID 信号应该是完全主动的过程,不能将 READY 信号置高作为置高 VALID 的条件,且VALID 信号一旦置起就不能拉低,直到此次传输完成。
- READY 信号与 VALID 不同,接收方可以在置起 READY 之后,根据自身的忙碌情况,选择拉低 READY 信号。当然,需要确保在拉低时,VALID 信号并没有置起。
握手时序图
- VALID before READY 握手
- READY before VALID 握手
- VALID with READY 握手
突发传输机制
- AXI 总线中的突发传输是指,在地址总线上进行一次地址传输后,进行多次数据传输。
突发传输控制信号
- 突发传输的控制信息在地址通道上,随着第一次地址传输时写入,控制信息包括:
信号 |
源 |
功能 |
ARLEN[3:0] |
主机 |
突发式写长度 |
ARSIZE[2:0] |
主机 |
突发式写大小 |
ARVURST[1:0] |
主机 |
突发式写类型 |
突发传输类型
- 突发传输类型(ARVURST[1:0]):共有FIXED,INCR 以及 WRAP三种模式。使用第一次地址传输中的地址作为起始地址,根据突发传输类型的不同,后续数据的存储地址在起始地址的基础上递增(INCR 模式);或者首先递增,到达上限地址后回到起始地址,继续递增(WRAP 模式);又或者后续数据都将不断写入起始地址,刷新起始地址上的数据。(FIXED 模式)。使用2位二进制进行表示。
- FIXED 类型适合对某个固定地址进行数据更新,比如向一个 almost full 的 fifo 更新数据。
- INCR 类型最为常用,后续的数据的存储地址在初始地址的基础上,以突发传输宽度进行递增,适合对于 RAM 等 mapped memory 存储介质进行读写操作。
- WRAP 模式比较特殊,除了初始地址外,还有最高地址的界限。在最大地址以下,WRAP 与 INCR 类型完全相同,地址递增,但达到最高地址后,地址直接回到起始地址,再进行递增,就这样循环往复。数据手册上表示,WRAP 适合对 cache 的访问
AxBURST[1:0] |
Burst type |
0b00 |
FIXED |
0b01 |
INCR |
0b10 |
WRAP |
0b11 |
Reserved |
突发传输长度
- 突发传输长度(ARLEN[3:0] ) :突发传输长度是指在一次突发传输中所进行的传输(transfer)次数,在传输完初始地址后,进行的数据传输次数就是突发传输长度,假设数据位宽是 32 位,即进行 32 * N bit 的数据传输。
- 在 AXI4 中,INCR 类型最大支持长度为 256,其他类型最大长度为 16。突发长度最少为 1,否则就没有传输发生了。协议中的 burst length 从零开始,实际的长度值为长度字段加1。传输长度使用 8 位二进制表示。
突发传输宽度
- 突发传输宽度(ARSIZE[2:0]):突发传输宽度是每指一次传输中的最大数据宽度,突发传输数据宽度不能超过数据线本身的宽度。当数据线本身宽度大于突发传输宽度时,将根据协议的相关规定制定数据在部分数据线上传输。而当传输数据的宽度小于数据总线的宽度时,AXI 总线将不会拼接数据,而是直接使用部分数据线传输数据,多余的数据线将会屏蔽。有效字节的对应关系如下:WSTRB[n] 对应 WDATA[8n+7:8n],也就是:当 WSTRB[n] 为 1 时,WDATA[8n+7:8n]有效。
- 突发传输宽度共 3 个二进制位,表示为:
ARLEN[3:0] |
Bytes in transfer |
0b000 |
1 |
0b001 |
2 |
0b010 |
4 |
0b011 |
8 |
0b100 |
16 |
0b101 |
32 |
0b110 |
64 |
0b111 |
128 |
AXI4的兄弟协议
AXI4-Lite
- 相比完整AXI协议,AXI4-Lite被砍了几刀,具体有以下不同:
- 突发传输长度固定为 1,即不支持突发传输。
- 数据位宽固定为 32 位或者 64 位,即每次传输必须使用 full width,不支持除此之外的位宽,也不支持在宽通道上传输比通道宽度窄的数据。
- 不支持多端传输下的独占操作以及缓存操作属性。
- AXI4-Lite 的使用场景主要用于寄存器的配置,该类传输具有数据量小且固定;一般对某个寄存器进行配置工作,不会有对连续地址上的寄存器配置需求,即没有突发传输的需求;一般不会有多个逻辑对同一个寄存器进行配置,即没有地址保护的需求。
AXI4-Stream
-
AXI-Stream协议其实与AXI4协议有这较大区别,直接砍去了对于地址的概念,故协议变成了一点对一点,或一点对多点的数据流通信协议,可理解为对一个地址不断的进行读写操作。故AXI-Stream协议适用于高速的、大数据量的数据流传输。
-
AXI-Stream 协议的字节分为三种类型:数据,位置字节以及空字节。数据类型自然就纯粹是传输的数据,位置字节不包含有效的数据,只指出当前数据在数据流中的相对位置。空字节不包含任何信息。通过两个信号:tkeep,tstrb 的高低电平表示当前传输的字节类型。当tkeep用于指示当前字节是否为空字节。tstrb用于指示该字节处理的内容是数据字节还是位置字节。
-
AXI-Stream协议定义了4种传输类型,分别为Transfer,Packet,Frame,Data Stream四种。
- transfer 的概念与 AXI4 中的同名概念完全相同,以一次 TREADY,TVALID 握手表示一次传输,每次 transfer 的数据传输量一般为数据总线的宽度。
- packet 是 Stream 中的新概念,类似 burst ,包含一个或多个 transfer。
- frame 是 Stream 中最高层次的传输组织形式,包含整数个 packet。
- 首先slave将TREADY信号拉高,表示自己可以接收信号。
- 当master将TDATA,TKEEP,TUSER准备就绪之后,将TVALID拉高,传输开始。
- 其中TKEEP满足TKEEP[x] is associated with TDATA[(8x+7):8x],当其被拉高时表示这段数据必须传输到目的地。TSTRB表示该段信息是否有效。TUSER可以在传递时捎带用户信息。具体接口参照使用的AXI-stream接口器件,并非所有支持AXI-stream接口的器件都含有以上接口,其中的一些接口是可选的而不是必需的。
- 直到master将TLAST拉高,TVALID拉低,传输结束。
参考:
深入 AXI4 总线(一)握手机制
深入 AXI4 总线(二)架构
深入 AXI4 总线(三)突发传输机制