什么是AXI
AXI是芯片内部的同步串行总线
分为AXI4(高性能内存映射:内存映射接口对一个地址可以进行256突发传输),AXI4-Lite(简单低吞吐量内存映射),AXI-Stream(高速流数据:允许无限大小的数据突发传输,没有地址,不是内存映射)
The limit in AXI4 is a burst transaction of up to 256 data transfers. AXI4-Lite allows only 1 data transfer per transaction. (手册原话)。
不同于UART这类通信协议,AXI遵循主从机制,信号一方为发起方一方为响应方——只有主机可以发起请求,从机是不可以发起读写请求的。
AXI工作
- 包含以下五通道(AXI4和AXI4-Lite)Read Address Channel Write Address Channel Read Data Channel Write Data Channel Write Respons Channel
- 在手册中HOW AXI works这一章中还介绍了Memory Mapped Protocols,AXI4-Stream Protocol,Infrastructure IP。更为白话的理解在文档批注中。
Xilinx AXI Infrastructure IP
- 在主从设备传输中,AXI4的数据位宽可以是32,64,128,256,512,1024bits;而AXI-Lite是32bits。地址位宽时32bits。
- 主设备和从设备之间的位宽不一定要相同,在上述数据宽度范围之内就可以。
- 关于AXI Interconnect Core Use Models——
N-1多个主设备对一个从设备(一般是内存控制器,ddr3?):一般的配置需要arbitrate(仲裁器)。地址解码是不需要的。但是仍然需要数据位宽和时钟速率的转换。
1-N一个主设备对多个从设备则不需要仲裁器
关于N-M手册中根据内部接口分为三种情况(p26)
AXI Feature Adoption in Xilinx FPGAs ……
以下内容参考手册AMBA® AXI and ACE Protocol Specification上面参考AXI Reference Guide还是第一个更适合初学。
AXI握手机制 Handshake process
使用VALID/READY的握手机制传输数据。VALID 表示源端的控制信号和数据是有效的;REDAY则表示接收端可以接收信息。
五个通道的信息传递都需要建立握手机制。
一般握手情况分为三种,valid先到达;ready先到达;同时到达。不管是谁先到达,只有当两个信号都拉高时才算握手成功,才能进行之后的数据传输。
一个细节(参照文章深入 AXI4 总线(一)握手机制):在默认状态中READY置位高电平,这样当valid拉高后一个周期就可以完成握手,否则对传输效率有较大的影响。
Transaction structure
address structure
- 地址structure的细节:为什么地址不能跨越4KB即上面提到德有4kb的边界保护,是为了避免会一次同时突发访问两个从设备,因为胡slave的地址空间是4k;关于这一点的详细介绍可以看这篇关于axi协议里面burst的4k问题
- 突发传输——
突发长度burst length,即给定地址后将会自动传输burst length个数据,可以有1-256,即ARLEN[7:0]AWLEN[7:0],定义的burst_length=AxLEN[7:0]+1;注意协议中的通信双方在所有transfer完成之前都不可以提前结束。
突发大小burst size 即每次传输中的每个数据的字节数,ARSIZE[2:0]AWSIZE[2:0]
突发类型 burst type:FIXED类型每次突发传输的起始地址都是相同的——适用于fifo读写;INCR类型是递增式,每一次突发传输对应的起始地址是上一次的增加,而增加量取决于一次传输的大小。WRAP类型类似递增式,但是当递增至上限则绕回最开始的地址在进行递增,这样一直循环。
关于给定首地址后内部是如何计算的公式手册中有具体介绍——不同突发传输模式下的地址计算公式与伪代码。对于一次burst传输,只给出首地址即可,内部地址会按照2^size增加。每给定首地址burst传输会按照(axlenth+1)*2^axsize递增,假设lenth是3,size是4,那一次要突发传输四个数据,每个数据4个字节(底层一个地址对应的数据是一个字节哦),如果第一次master给定的首地址是0,那么第一次会传输的四个数对应的地址是地址就是16,20,24,28。还有就是slave解析出的地址不是连续的是按照size的大小递增的,若想要连续地址的话就要按照协议解析一下(好像是除以size)。
Data read and write structure
Narrow Transfer窄传输,当传输的数据位宽小于总线位宽时存在这个概念。DDR的DQM信号用mask屏蔽低32bit数据,存储介质的写入地址为 0x0,但实际只从地址 0x4 开始写入了 32bit 数据。在后续的 transfer 继续按以上模式工作。关于这里手册A3-54有两个图解。窄传输会对每次传输进行填充至和数据通道大小相同,通过WSTRB来表示哪个数据有效。下面展示了对应关系。
Byte invariance字节不变性,可以理解为大小端存储,这里放一张手册截图来解释。这一性质保证了不管是大端存储还是小端存储在单个内存空间中数据不会丢失。手册还举了一个栗子就是混合大小端存储。
Unaligned transfers不对齐传输,AXI支持不对齐传输。手册原话是: For any burst that is made up of data transfers wider than 1 byte, the first bytes accessed might be unaligned with the natural address boundary. For example, a 32-bit data packet that starts at a byte address of 0x1002 is not aligned to the natural 32-bit address boundary.手册A-56和A-57有图示。就A-57第二幅图个人理解是总线是64bits,若首地址是0x07,那么0x00——0x06就这8*7bits是无法传输的,总线上只有56:63可以传输,这不足一次要求的传输的32bits但是也能传——方法是首次传输会填充使其对其,可以通过WSTRB来表示数据是否有效,第二次传输就正常了。还有就是这是个窄传输。每次也需要补全传输的长度使其和总线一致。