目录
一、简介
AXI全称ARM AMBA,是ARM-AMBA的一部分,当前使用的是后面更新的AXI4接口。
AMBA:高级微控制器总线架构,具有以下特点:
开放的片内互联的总线标准
能够在多主机设计中实现多个控制器和外围设备之间的连接和管理
1.1 AXI的三种形式
AXI4 协议支持以下三种类型的协议:
1、 AXI4: 高性能存储映射协议。
2、 AXI4-Lite:简化版的 AXI4 协议, 用于较少数据量的存储映射通信。
3、 AXI4-Stream(ST): 用于高速数据流传输,非存储映射接口。
1.2 存储映射
在这里首先我们首先解释一下存储映射(Meamory Map)这一概念。如果一个协议是存储映射的,那么主机所发出的会话(无论读或写) 就会标明一个地址。 这个地址对应于系统存储空间中的一个地址, 表明是针对该存储空间的读写操作。
1.3 AXI小结
AXI4(Full):允许高吞吐率的突发,运行256个数据的突发传输,同时只需要指定一个单一的地址。
AXI4-Lite:轻量级,单次的传输一个数据,不支持突发传输,需要指定地址。
AXI4-Stream:不需要地址传递数据,非存储器映射
二、AXI的突发传输
AXI 总线的突发传输机制(burst),在 AXI 总线中的突发传输是指,在地址总线上进行一次地址传输后,进行多次数据传输。
第一次地址传输中的地址作为起始地址,根据突发传输类型的不同,后续数据的存储地址在起始地址的基础上递增(INCR 模式);或者首先递增,到达上限地址后回到起始地址,继续递增(WRAP 模式);又或者后续数据都将不断写入起始地址,刷新起始地址上的数据(FIXED 模式)。
2.1 存储模式
FIXED 类型适合对某个固定地址进行数据更新,比如向一个 almost full 的 fifo 更新数据。
INCR 类型最为常用,后续的数据的存储地址在初始地址的基础上,以突发传输宽度进行递增,适合对于 RAM 等 mapped memory 存储介质进行读写操作。
WRAP 模式比较特殊,除了初始地址外,还有最高地址的界限。在最大地址以下,WRAP 与 INCR 类型完全相同,地址递增,但达到最高地址后,地址直接回到起始地址,再进行递增,就这样循环往复。数据手册上表示,WRAP 适合对 cache 的访问,我这方面经验还不多,不是很能理解这种模式的精妙之处。
2.2 突发长度
突发传输长度 (burst length),突发传输长度是指在一次突发传输中所进行的传输(transfer)次数,在传输完初始地址后,进行的数据传输次数就是突发传输长度,假设数据位宽是 32 位,即进行 32 * N bit 的数据传输。
在 AXI4 中,INCR 类型最大支持长度为 256,其他类型最大长度为 16。当然你的突发长度最少为 1,不然也就没有传输发生了。协议中的 burst length 从零开始,实际的长度值为长度字段加1。传输长度使用 8 位二进制表示。
突发传输长度有一些限制,包括:
-
对于 WRAP 模式,突发传输长度仅能为2,4,8,16
-
在一次突发传输中,地址不能跨越一个 4KB 分区
-
一次突发传输不能在未达到传输长度的情况下提前结束。
2.3 突发传输宽度
突发传输宽度(burst size),突发传输宽度是每指一次传输(transfer)中的最大数据宽度,突发传输数据宽度不能超过数据线本身的宽度。当数据线本身宽度大于突发传输宽度时,将根据协议的相关规定制定数据在部分数据线上传输。突发传输宽度共 3 个二进制位。
总的来说,突发长度就是发送多少个数据。突发宽度发送数据的大小。
三、AXI的工作方式
3.1 AXI的通道
AXI4和AXI4-LIte包含五个独立的通道:
• Read Address Channel
• Write Address Channel
• Read Data Channel
• Write Data Channel
• Write Response Channel
Note:每个独立的通道都包含一组信息信号、VALID和READY、LAST信号,用于提供握手机制。
-
信息源端使用VALID信号表示地址、数据和控制信息什么时候有效
-
目的端使用READY信号表示什么时候可以接受信息
-
读数据和写数据通道都包含一个LAST信号,表示什么时候时最后一帧信号
读操作结构示意图图:
写操作结构示意图图:
-
读和写数据通道都包含各自的地址通道,地址通道包含了请求所需的地址和信息
-
读数据通道包含了读数据和读响应的信息,由从机发给主机,读响应信号用于表示读传输是否完成
-
写数据通道由主机发送给从机,包含了写数据的信息,通过WSTRB(频闪信号)表示当前数据的哪个字节有效(以字节为单位)
-
写响应通道,由从机发送给主机通过写响应信号,用于表示写操作是否完成
-
读数据通道和写响应通道还包含一个LAST信号
Note:这里的信号不清楚的建议去看文档IHI0022D
3.2 工作原理
1.时钟和复位
AXI使用的是单端口时钟ACLK,所有的输入信号都在ACLK的上升沿被采集,同时所有的输出都在ACLK的上升沿后输出
AXI协议的复位信号低电平有效,采用异步复位同步释放的原则。在复位后的,如果复位信号拉高,表示要正常工作状态,则下一个时钟后VALID信号拉高
2.通道的信号
Signal | Source | Description | |
AWID | Master | 写地址主设备ID,每个通道都有自己的交易ID | |
AWADDR | Master | 突发传输的初始地址 |
|
AWLEN | Master | 突发长度,发送的数据个数 | |
AWSIZE | Master | 突发大小,数据的大小(最大32Bit) | 0b000 1 0b001 2 0b010 4 0b011 8 0b100 16 0b101 32 |
AWBURST | Master | 突发类型,地址变化 | 0b00 FIXED 0b01 INCR 0b10 WRAP 0b11 Reserved |
AWLOCK | Master | 锁定事物,是正常传输还是独有传输 | AXI4好像不支持 |
AWCACHE | Master | 内存形式,总线的存储类型 | 这里没使用 |
AWQOS | Master | 服务质量,在写/读通道上发送一个4位的Qos标识符 | 一般不使用 |
AWREGION | Master | ||
AWUSER | Master | 用户自定义 | |
AWVALID | Master | 写地址通道Valid信号 | 握手信号 |
AWREADY | Slave | 写地址通道READY信号 |
Signal | Source | Description | |
WID | Master | 写数据主设备ID,每个通道都有自己的交易ID | |
WDATA | Master | 写数据 |
|
WSTRB | Master | 频闪信号,那个数据位有效 | |
WLAST | Master | 写入的最后一个信号,本次突发传输的最后数据时的信号 | |
AWUSER | Master | 用户自定义 | |
AWVALID | Master | 写数据通道Valid信号 | 握手信号 |
WREADY | Slave | 写数据通道READY信号 |
Signal | Source | Description | |
BID | Master | 写响应主设备ID,每个通道都有自己的交易ID | |
BRESP | Master | 写入数据状态 |
OKAY:OK EXOKAY:独占式OK SLVERR:从机错误,数据已经接受 DECERR:解码错误 |
AWUSER | Master | 用户自定义 | |
BVALID | Slave | 写数据通道Valid信号 | 握手信号 |
BREADY | Master | 写数据通道READY信号 |
3.工作机制
握手机制:
AXI的5个独立通道各自发起通讯时,写端和接收端分别有两个准备信号。发送端的VALID信号和接收端的READY信号,只有当两个信号都为高电平时认为数据写入接收端,否则接收端数据通道不打开。(这里的数据包涵地址)
每一个通道都支持全双工发送和接受数据,同时可以各自设置传输的开启和暂停。(这个功能是由于下面这条规则)
一个通道的数据传输只发生在该通道的VALID和READY信号全是高电平的时候
PS:这里注意下,由于信号只有在ACLK的上升沿时才被读取,所以有图这边,在T3后数据才真的再传输。但是再过一个周期后,由于握手机制,数据又会停止传输

选择信号:
WSTRB:写数据通道和读数据通道使用, [3:0]寄存器数据。每一位对应32位数据(4Byte)的对应字节是否有效。例如:
WSTRB = 1001,则写数据通道的数据Data,只有0-7 和 24-31位的数据有效(第一、4个Byte)
数据发送的时间:
由于采用突发传输的方式,一个数据(例如32Bit)的发送只需要一个时钟周期即可完成。在本例中协议规定上升沿传递数据。
DDR SDRAM是可以双边沿接收数据的,这里没有使用这种模式。
读响应状态:
在写入数据完成后,发送状态:
LAST为下降沿后,即已经将状态写入BRESP数据中等待握手条件
BVALID和BREADY为高时,发送状态
这个状态有两个:
一个:写响应通道
另一个:读数据通道
3.工作规则
AXI 具有以下管理突发使用的规则:
• 对于环绕突发,突发长度必须为 2、4、8 或 16
• 突发不得跨越 4KB 地址边界
• 不支持提前终止突发。
回环突发:
• 起始地址必须与每次传输的大小对齐
• 突发的长度必须是 2、4、8 或 16 次传输。
• 突发使用的最低地址范围与要传输的数据的总大小对齐,即为((突发中每个传输的大小)×(突发中的传输数))。这地址被定义为环绕边界。
• 每次传输后,地址以与INCR 突发相同的方式递增。然而,如果这个增加的地址范围是((环绕边界)+(要传输的数据的总大小))然后地址环绕到环绕边界。
• 突发中的第一次传输可以使用高于回绕边界的地址,适用于包装突发的限制。这意味着地址换行任何首地址高于回绕边界的 WRAP 突发。这种突发类型用于高速缓存行访问。
波形示意图,图片来自电子哥
四、基于AXI4协议的DDR数据传输
4.1 实现功能
采用AXI4-Full协议,PL端产生的数据通过总线协议写入DDR3模块中。然后在PS中进行数据处理。
用自定义的AXI协议IP核,可以得到标准的传输协议AXI4,只需要修改写入的参数即可满足实现功能的要求。emmmm,这里使用Vivado的自定义IP核生成AXI协议,怎么生成的和代码这里我就省略步骤喽。
4.2 AXI4核的状态机
整体的状态分为4个:
ILDE:等待触发,只有当使能脉冲到达时才会进入写状态。
WIRTE:写数据状态,只有等到设定的发送数据块全部发送后才会进入读数据状态。
READ:读数据状态,同写状态。
COMPARE:比较状态,将写入数据和读取的数据比较,出错后将error信号致1,同时将完成信号done致1,。返回等待触发状态ILDE。
4.3 代码的重要参数
1.C_MASTER_LENGTH:代表写入的地址范围,通过REQ这个值,同时这个值规定了一次突发传输次数。
例C_MASTER_LENGTH = 3,表示一次突发传输的地址范围大小是0-8(单位是字节Byte) 。同时REQ = 3 - 3 = 0, 这个值在后面作为写判断中止时使用。
C_NO_BURSTS_REQ = C_MASTER_LENGTH-clogb2((C_M_AXI_BURST_LEN*C_M_AXI_DATA_WIDTH/8)-1);
[C_NO_BURSTS_REQ : 0] write_burst_counter;
write_burst_counter[C_NO_BURSTS_REQ] = 1时发送停止。
2.write_index:代表一次突发传输中传输的数据个数,数据传输次数寄存器
3.write_burst_counter:代表突发传输的次数
4.M_AXI_AWBURST:代码里的突发方式只是个标识符,并没有真正的功能,需要自己在地址通道那里自行设置
5.WSTRB:这个值默认是4b'1111,表示32位数据全要
4.4 自定义发送
主要需要配置的参数如下图,然后修