前言
本文针对秋招面试高频问题: AXI总线进行总结学习;
1.简介 AXI是个什么东西呢,它其实不属于Zynq,不属于Xilinx,而是属于ARM。它是ARM最新的总线接口,以前叫做AMBA,从3.0以后就称为AXI了。
AXI(Advanced eXtensible Interface)是一种总线协议,该协议是ARM公司提出的AMBA3.0中最重要的部分,是一种面向高性能、高带宽、低延迟的片内总线。AMBA4.0将其修改升级为AXI4.0。
AMBA4 包括AXI4、AXI4-lite、ACE4、AXI4-stream。
AXI4:(For high-performance memory-mapped requirements.)主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输;
AXI4-Lite:(For simple, low-throughput memory-mapped communication )是一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。
AXI4-Stream:(For high-speed streaming data.)面向高速流数据传输;去掉了地址项,允许无限制的数据突发传输规模。
1.1 AXI协议特点
AMBA AXI协议支持支持高性能、高频率系统设计;
关键特点
1.2 AXI读写架构
AXI协议是基于burst的传输,并且定义了以下5个独立的传输通道:读地址通道、读数据通道、写地址通道、写数据通道、写响应通道。 地址通道携带控制消息,用于描述被传输的数据属性;
数据传输使用写通道来实现master到slave的传输,slave使用写响应通道来完成一次写传输;
读通道用来实现数据从slave到master的传输。
读架构
写架构
AXI使用基于VALID/READY的握手机制数据传输协议;
传输源端使用VALID表明地址/控制信号、数据是有效的;
目的端使用READY表明自己能够接受信息 ;
通道名称 | 通道功能 | 数据流向 |
---|---|---|
read address | 读地址通道 | 主机->从机 |
read data | 读数据通道(包括数据通道和读响应通道) | 从机->主机 |
write address | 写地址通道 | 主机->从机 |
write data | 写数据通道(包括数据通道和每8bit一个byte的写数据有效信号) | 主机->从机 |
write response | 写响应通道 | 从机->主机 |
1.3 接口和互联
AXI协议提供单一的接口定义,用在下述三种接口之间:master/interconnect、slave/interconnect、master/slave。可以使用以下几种典型的系统拓扑架构:
寄存器片(Register Slices):每个AXI通道使用单一方向传输信息,并且各个通道直接没有任何固定关系。因此可以可以在任何通道任何点插入寄存器片,当然这会导致额外的周期延迟。
使用寄存器片可以实现周期延迟(cycles of latency)和最大操作频率的折中;
使用寄存器片可以分割低速外设的长路径;
2.信号描述
信号名 | 来源 | 描述 |
---|---|---|
ACLK | system clock | 全局时钟信号 |
ARESTn | system reset | 全局复位信号,低有效 |
全局信号
信号名 | 来源 | 描述 |
---|---|---|
AWID | master | 写地址ID(用于区分该地址属于哪个写地址组) |
AWADDR | master | 写地址 |
AWLEN | master | 突发长度 |
AWSIZE | master | 突发尺寸(每次突发传输的最长byte数) |
AWBURST | master | 突发方式(FIXED,INCR,WRAP) |
AWCACHE | master | 存储类型(标记系统需要的传输类型) |
AWPROT | master | 保护模式 |
AWQOS | master | QoS标识符 |
AWREGION | master | region标识符(当slave有多种逻辑接口时标识使用的逻辑接口) |
AWUSER | master | 用户自定义信号 |
AWVALID | master | 写地址有效信号(有效时表示AWADDR上地址有效) |
AWREADY | master | 写从机就绪信号(有效时表示从机准备好接收地址) |
写地址通道信号
信号名 | 来源 | 描述 |
---|---|---|
WDATA | master | 写数据 |
WSTRB | master | 数据段有效(标记写数据中哪几个8位字段有效) |
WLAST | master | last信号(有效时表示当前为突发传输最后一个数据) |
WUSER | master | 用户自定义信号 |
WVALID | master | 写有效信号(有效时表示WDATA上数据有效) |
WREADY | slave | 写ready信号(有效时表示从机准备好接收数据) |
写数据通道信号
信号名 | 来源 | 描述 |
---|---|---|
BID | slave | 响应ID |
BRESP | slave | 写响应 |
BUSER | slave | 用户自定义信号 |
BVALID | slave | 写响应信号有效 |
BREADY | master | 写响应ready(主机准备好接受写响应信号) |
写响应通道信号
信号名 | 来源 | 描述 |
---|---|---|
ARID | master | 读地址ID |
ARADDR | master | 读地址 |
ARLEN | master | 突发长度 |
ARSIZE | master | 突发尺寸(每次突发传输的byte数) |
ARBURST | master | 突发类型(FIXED,INCR,WRAP) |
ARCACHE | master | 存储类型 |
ARPROT | master | 保护类型 |
ARQOS | master | QoS标识符 |
ARREGION | master | 区域标识符 |
ARUSER | master | 用户自定义 |
ARVALID | master | 读地址有效(有效时表示ARADDR上地址有效) |
ARREADY | slave | 写有效信号(有效时表示从机准备好接收读地址) |
读地址通道信号
信号名 | 来源 | 描述 |
---|---|---|
RID | slave | 读ID标签 |
RDATA | slave | 读数据 |
RRESP | slave | 读响应 |
RLAST | slave | 有效时表示为突发传输的最后一个 |
RUSER | slave | 用户自定义 |
RVALID | slave | 读数据有效信号 |
RREADY | master | 主机就绪信号(有效时表示) |
读数据通道信号
信号名 | 来源 | 描述 |
---|---|---|
CSYSREQ | Clock controller | 该信号有效时,系统退出低功耗模式 |
CSYSACK | Peripheral device | 退出低功耗模式应答信号 |
CACTIVE | Peripheral device | 外设申请时钟信号 |
低功耗接口信号
3.信号接口要求
3.1读写传输
3.1.1 握手过程
5个传输通道均使用VALID/READY信号对传输过程的地址、数据、控制信号进行握手。使用双向握手机制,传输仅仅发生在VALID、READY同时有效的时候。
下图是几种握手机制:
VALID和READY的先后关系具有三种情况:
此外,需要注意的是允许READY信号等待VALID信号再有效,即使从机准备好,也可以不提供READY信号,等到主机发送VALID信号再提供READY信号。对应的VALID信号不允许等待READY信号,即不允许VALID等待READY信号拉高后再拉高,否则容易产生死锁现象。
命令通道握手(读地址,写地址,写响应)
数据通道握手(写数据和读数据)
通道握手信号:每个通道有自己的xVALID/xREADY握手信号对。
写地址通道:当主机驱动有效的地址和控制信号时,主机可以断言AWVALID,一旦断言,需要保持AWVALID的断言状态,直到时钟上升沿采样到从机的AWREADY。AWREADY默认值可高可低,推荐为高(如果为低,一次传输至少需要两个周期,一个用来断言AWVALID,一个用来断言AWREADY);当AWREADY为高时,从机必须能够接受提供给它的有效地址。
写数据通道:在写突发传输过程中,主机只能在它提供有效的写数据时断言WVALID,一旦断言,需要保持断言状态,知道时钟上升沿采样到从机的WREADY。WREADY默认值可以为高,这要求从机总能够在单个周期内接受写数据。主机在驱动最后一次写突发传输是需要断言WLAST信号。
写响应通道:从机只能它在驱动有效的写响应时断言BVALID,一旦断言需要保持,直到时钟上升沿采样到主机的BREADY信号。当主机总能在一个周期内接受写响应信号时,可以将BREADY的默认值设为高。
读地址通道:当主机驱动有效的地址和控制信号时,主机可以断言ARVALID,一旦断言,需要保持ARVALID的断言状态,直到时钟上升沿采样到从机的ARREADY。ARREADY默认值可高可低,推荐为高(如果为低,一次传输至少需要两个周期,一个用来断言ARVALID,一个用来断言ARREADY);当ARREADY为高时,从机必须能够接受提供给它的有效地址。
读数据通道:只有当从机驱动有效的读数据时从机才可以断言RVALID,一旦断言需要保持直到时钟上升沿采样到主机的BREADY。BREADY默认值可以为高,此时需要主机任何时候一旦开始读传输就能立马接受读数据。当最后一次突发读传输时,从机需要断言RLAST。
3.1.2 通道顺序
传输中,通道传输的先后有以下规定
通道握手信号的依耐关系
为防止死锁,通道握手信号需要遵循一定的依耐关系。
下面有几个图表明依耐关系,单箭头指向的信号能在箭头起点信号之前或之后断言;双箭头指向的信号必须在箭头起点信号断言之后断言。
读传输握手依耐关系
上图为读操作的依赖关系,ARREADY可以等待ARVALID信号,RVALID必须等待ARVALID和ARREADY同时有效后(一次地址传输发生)才能能有效;
写传输握手依耐关系
从机写响应握手依耐关系
在AXI3中,写操作中唯一的强依赖关系是写响应通道BVALID,仅当WVALID和WREADY信号同时有效(数据传输完成)且WLAST信号有效(突发传输的最后一个数据传输完成)后才会被置位;
在AXI4中,定义了额外的依赖关系,即BVALID必须依赖AWVALID、AWREADY、WVALID和WREADY信号;
3.2时钟复位
时钟: 每个AXI组件使用一个时钟信号ACLK,所有输入信号在ACLK上升沿采样,所有输出信号必须在ACLK上升沿后发生。
复位: AXI使用一个低电平有效的复位信号ARESETn,复位信号可以异步断言,但必须和时钟上升沿同步去断言。
复位期间对接口有如下要求:
在复位后,主机可以在时钟上升沿驱动ARVALID,AWVALID,WVALID为高电平。
4.传输结构
4.1.地址通道数据结构
AXI总线是基于突发传输的总线,若主机要开始一次突发传输,需要传输一次地址和相关控制信号,之后从机自动计算地址(主机只给出突发传输的第一个字节的地址,从机必须计算突发传输后续的地址),但一次突发传输的地址范围不能跨越4KB(防止突发跨越两个从机的边界,也限制了从机所需支持的地址自增数)。
(1).突发传输信息
burst传输具有如下规则:
所有的组件都不能提前终止一次突发传输。然而,主机可以通过解断言所有的写的strobes来使非所有的写字节来减少写传输的数量。读burst中,主机可以忽略后续的读数据来减少读个数。也就是说,不管怎样,都必须完成所有的burst传输。
提醒:对于FIFO,忽略后续读数据可能导致数据丢失,必须保证突发传输长度和要求的数据传输大小匹配。
传输首地址和每次传输的大小对齐。最低的地址整个传输的数据大小对齐。地址空间被划分为长度[突发尺寸*突发长度]的块,即回环边界等于(AxSIZE*AxLEN)。
(2).存储类型(AxCACHE)
AXI4可支持不同的存储类型,AxCACHE[3:0]用于描述不同的存储类型,如下图所示
ARCACHE[3:0] | AWCACHE[3:0] | Memory type |
---|---|---|
0000 | 0000 | Device Non-bufferable |
0001 | 0001 | Device Bufferable |
0010 | 0010 | Normal Non-cacheable Non-bufferable |
0011 | 0011 | Normal Non-cacheable Bufferable |
1010 | 0110 | Write-through No-allocate |
1110 (0110) | 0110 | Write-through Read-allocate |
1010 | 1110 (1010) | Write-through Write-allocate |
1110 | 1110 | Write-through Read and Write-allocate |
1011 | 0111 | Write-back No-allocate |
1111 | (0111) 0111 | Write-back Read-allocate |
1011 | 1111 (1011) | Write-back Write-allocate |
1111 | 1111 | Write-back Read and Write-allocate |
4.2.数据通道数据结构
(1).数据选通(WSTRB)
WSTRB的每一位对应数据中的8位(1字节),用于标志数据中的对应字节是否有效。即当WSTRB[n] = 1时,标志数据中WDATA[(8n)+7: (8n)]部分有效。
WSTRB[n:0]对应于对应的写字节,WSTRB[n]对应WDATA[8n+7:8n]。WVALID为低时,WSTRB可以为任意值,
WVALID为高时,WSTRB为高的字节线必须指示有效的数据。
(2).数据(xDATA)
窄带传输(Narrow transfers)
当主机产生比它数据总线xDATA要窄的传输时,为窄带传输,每次使用的数据位数不同,由地址和控制信号决定哪个字节被传输:
INCR和WRAP,不同的字节线决定每次burst传输的数据,FIXED,每次传输使用相同的字节线。
下图给出了5次突发传输,起始地址为0,每次传输为8bit,数据总线为32bit,突发类型为INCR。
窄传输示例
上图为地址递增突发下,在32位数据信号下使用8bit传输的窄带传输使用的位数图。第一次传输使用0~7位,第二次使用8~15位,依次递增;在第五次传输时回到开头使用0~7位.
下图给出3次突发,起始地址为4,每次传输32bit,数据总线为64bit。
窄传输示例
不对齐传输(Unaligned transfers)
AXI支持非对齐传输。在大于一个字节的传输中,第一个自己的传输可能是非对齐的。如32-bit数据包起始地址在0x1002,非32bit对齐。主机可以:
当传输位宽超过1byte,起始地址不为数据总线硬件带宽(byte单位)整数倍时,为不对齐传输。不对齐传输的时候需要配合数据选通在第一次传输时将某几个byte置为无效,使第二次突发传输的起始地址(从机自动计算)为突发尺寸的整数倍。
对齐非对齐传输示例1-32bit总线
对齐非对齐传输示例2-64bit总线
对齐的回环传输示例
读写响应结构
读传输的响应信息是附加在读数据通道上的,写传输的响应在写响应通道。
RRESP[1:0],读传输
BRESP[1:0],写传输
OKAY('b00):正常访问成功
EXOKAY('b01):Exclusive 访问成功
SLVERR('b10):从机错误。表明访问已经成功到了从机,但从机希望返回一个错误的情况给主机。
DECERR('b11):译码错误。一般由互联组件给出,表明没有对应的从机地址。
5. AXI-Stream
AXI-Stream,是一种连续流接口,不需要地址线(类似FIFO,一直读或一直写就行)。对于这类IP,ARM必须有一个转换装置才能对内存映射方式控制,例如AXI-DMA模块来实现内存映射到流式接口的转换。
AXI-Stream适用的场合有很多:视频流处理;通信协议转换;数字信号处理;无线通信等。其本质都是针对数值流构建的数据通路,从信源(例如ARM内存、DMA、无线接收前端等)到信宿(例如HDMI显示器、音频输出等)构建起连续的数据流。这种接口适合做实时信号处理。
用户其实不需要对AXI时序了解太多,因为Xilinx已经将和AXI时序有关的细节都封装起来,官方IP和向导生成的自定义IP,用户只需要关注自己的逻辑实现即可
AXI4-Stream协议是一种用来连接需要交换数据的两个部件的标准接口,它可以用于连接一个产生数据的主机和一个接受数据的从机。当然它也可以用于连接多个主机和从机。该协议支持多种数据流使用相同共享总线集合,允许构建类似于路由、宽窄总线、窄宽总线等更为普遍的互联。
AXI4-Stream接口比较重要的信号线:
ACLK:时钟线,所有信号都在ACLK上升沿被采样;
ARESETn:复位线,低电平有效;
TVALID:主机数据同步线,为高表示主机准备好发送数据;
TREADY:从机数据同步线,为高表示从机准备好接收数据;这两根线完成了主机与从机的握手信号,一旦二者都变高有效,数据传输开始。
TDATA:数据线,主机发送,从机接收。
TKEEP:主机数据有效指示,为高代表对应的字节为有效字节,否则表示发送的为空字节。
TLAST:主机最后一个字指示,下一clk数据将无效,TVALID将变低。
TID,TDEST,TUSER均为多机通信时的信号,不予考虑。
利用AXI总线做转换,可以把PS里DDR4的内容以Stream形式发出去,例如以固定速度送往DA,完成信号发生器的设计;
ZYNQ的PS部分是ARM CortexA9系列,支持AXI4,AXI-Lite总线。PL部分也有相应AXI总线接口,这样就能完成PS到PL的互联。仅仅这样还不够,需要PL部分实现流式转换,即AXI-Stream接口实现。
Xilinx提供的从AXI到AXI-Stream转换的IP核有:AXI-DMA,AXI-Datamover,AXI-FIFO-MM2S以及AXI-VDMA等。
AXI-DMA:实现从PS内存到PL高速传输高速通道AXI-HP到AXI-Stream的转换;
AXI-FIFO-MM2S:实现从PS内存到PL通用传输通道AXI-GP到AXI-Stream的转换;
AXI-Datamover:实现从PS内存到PL高速传输高速通道AXI-HP到AXI-Stream的转换,只不过这次是完全由PL控制的,PS是完全被动的;
AXI-VDMA:实现从PS内存到PL高速传输高速通道AXI-HP到AXI-Stream的转换,只不过是专门针对视频、图像等二维数据的。
AXI总线和接口的区别:
总线是一种标准化接口,由数据线、地址线、控制线等构成,具有一定的强制性。
接口是其物理实现,即在硬件上的分配。
在ZYNQ中,支持AXI-Lite,AXI4和AXI-Stream三种总线,但PS与PL之间的接口却只支持前两种,AXI-Stream只能在PL中实现,不能直接和PS相连,必须通过AXI-Lite或AXI4转接。PS与PL之间的物理接口有9个,包括4个AXI-GP接口和4个AXI-HP接口、1个AXI-ACP接口,均为内存映射型AXI接口。