一、AXI简介
AXI——Advanced eXtensible Interface,直译过来就是先进的可扩展接口,是由ARM公司提出的,是一种高性能、高带宽、低延迟的片内总线。FPGA工程师会发现其大量运用于FPGA设计中,Vivado中的接口类IP全部都配有AXI接口,可见其重要性。AXI包括AXI、AXI-Lite(轻量级、简化级)和AXI-Stream(Xilinx特有的高速数据流传输模式),其官方标准文档我已经上传,下载链接在这里,官方标准文档不建议从头看到尾,只需必要时查询使用。
AXI是多Master和多Slave的拓扑结构,如下图所示:
图1 AXI的拓扑结构
中间的Interconnect是指的AXI交换设备。上图需要特别注意的是,我们在设计过程中,有时同一个设备既可以作为Master,也可以作为Slave。
二、AXI总线的信号描述
AXI总线使用基于VALID/READY握手机制的数据传输协议,这是什么意思呢?就是无论是Master端,还是Slave端,要传输任何内容必须要确认对方给出了READY有效(不一定有效之后才传输,但是一定要等到有效,后面会有解释),且无论传输给对方的是数据还是地址,是控制信号还是状态信号,都要在VALID有效时进行传输。
1、AXI总线的通道和信号(AXI和AXI-Lite)
AXI总线一共分为6大通道,对于AXI和AXI-Lite,一般传输的信号线如下列出,对于AXI-Stream,后面单独讨论,对于猝发传输,会多几根信号线,也放在后面单独讨论。
(1)读地址通道,包含ARVALID, ARADDR, ARREADY信号。
(2)读数据通道,包含RVALID, RDATA, RREADY, RRESP信号。
(3)写地址通道,包含AWVALID,AWADDR, AWREADY信号。
(4)写数据通道,包含WVALID, WDATA,WSTRB, WREADY信号。
(5)写应答通道,包含BVALID, BRESP, BREADY信号。
(6)系统通道,包含ACLK,ARESETN信号。
可以看出,除了系统通道之外,每个通道都有VALID和READY。对于每个通道的信号名称,可以得到这样的一个规律:在前面加上一个字母R,表示读通道,加上一个字母W,表示写通道,加上一个字母B,表示应答通道(因为是VALID/READY机制,所以应答通道必然是写应答,表示写操作成功了,为什么没有读应答?读者请自己思考。),对于读通道和写通道,再在前面加上一个字母A表示地址通道,如果不加就是数据通道。根据这样的命名规律,大部分的信号线的意思就十分明白了,只有下面两种信号线需要说明。
RESP——表示Slave发出响应(response),其中BRESP是从设备发出的写响应,表示写操作的状态,RRESP是从设备发出的读响应,表示读操作的状态,这两个信号都是2位的,从00-11分别表示OKAY,EXOKAY,SLVERR,DECERR,一般情况下都是00,表示OKAY,就是说访问成功。EXOKAY是单独访问(exclusive)成功的意思,单独访问是AXI总线的一种访问模式,只允许一个Master对一个Slave进行访问。SLVERR表示访问错误,这时Master的地址和命令是已经给到了Slave了,但是Slave返回一个错误信息给Master。DECERR表示解码(decode)错误,其实是地址解码错误的意思,Master发出的访问地址如果不能被识别,则会由中间的交换设备Interconnect返回DECERR给Master。
WSTRB——写数据段有效,其每一位对应WDATA中的8位(1字节),用于标识对应字节是否有效,WSTRB的第0位为1表示WDATA的低8位有效,第1位为1表示WDATA的次低8位有效,以此类推。
AXI总线的R/WDATA的位宽可以选择32、64、128和256,一般32和64就满足于大部分设计了。当然,对于不同的数据位宽n,WSTRB的位宽是n/8。
2、AXI-Stream的信号和波形
可以不管这个小节直接跳到第三节。AXI4-Stream去掉了地址项,在这种模式下,其实就是简单的从Master发送数据到Slave,中间不经过交换设备,我认为就相当于一般的带着有效使能信号的大量数据传输,和AXI的理念相去甚远。除时钟和复位外,信号的命名规则以T开头,如下所示。
(1)TREADY信号:Slave告诉Master做好传输准备。
(2)TDATA信号:传输数据,可选宽度32、64、128、256bit。
(3)TSTRB信号:每一bit对应TDATA的一个有效字节,宽度为TDATA/8。
(4)TLAST信号:Master告诉Slave传输数据的结尾。
(5)TVALID信号:Master输出的传输有效使能。
(6)TUSER信号 :用户定义信号,宽度为128bit,一般用来给传输计数。
传输波形如下图所示,我个人认为就像使用FIFO存取数据的那种波形,AXI-Stream的传输波形比AXI和AXI-Lite都简单,后面不再讨论这个模式。
图2 AXI-Stream传输波形
三、AXI总线的数据传输过程
一般情况下,AXI-Lite用于配置寄存器和低速数据传输,AXI用于大量数据高速传输,所以AXI-Lite一般不支持猝发传输(也叫突发式传输,burst传输,即一次命令传输大量数据),所以下面分为猝发和非猝发来讨论。
1、非猝发传输
读操作握手过程如下图所示:
图3 AXI读操作握手过程
图3是一个比较好理解的图,但是实际的FPGA仿真波形中不是按这个图的上下顺序给出的信号,下面给出实际仿真的波形。
图4 AXI读操作实际波形
从上图可以看出在FPGA内部,过程是这样子的:
1、主设备有效ARVALID,这个时候必须保证ARADDR已经有效,表示主设备已经准备好地址,等待从设备响应。
2、从设备有效ARREADY,表示从设备已将接收地址和相关的控制信号锁存,告诉主设备不需要再维持这个读地址了,之后主设备可以把ARVALID拉低。
3、从设备有效RVALID,表示读数据可用,这个时候必须保证读数据RDATA已经有效,主设备监控该信号有效就可以读取数据了。
4、这时由于RRESP为0也表示读取数据正确,主设备则有效RREADY,表示主设备读操作完成,从设备这时可以拉低RVALID了。
为什么握手过程图和实际仿真波形会有差异?这时需要查阅标准文档,在标准文档中第三章有一个信号依赖关系图可以说明这个问题。
图5 AXI读操作信号依赖关系
上图中一个箭头表示弱依赖关系,两个箭头表示强依赖关系。
从设备可以在ARVALID有效之后再给出ARREADY,也可以先给出ARREADY,再等待ARVALID有效。
从设备必须等待ARVALID和ARREADY都有效才能给出RVALID,并且同时开始给出数据传输。
主设备可以在RVALID有效之后再给出RREADY,也可以先给出RREADY,再等待RVALID有效。
写操作握手过程如下图所示:
图6 AXI写操作握手过程
同样的,实际的写操作的波形和这个过程图是有差异的。
图7 AXI写操作实际波形
这个过程的描述如下:
1、主设备有效AWVALID和WVALID,这个时候主设备的AWADDR和WDATA必须确保也已经有效,这两个信号不一定同时有效,但我根据经验发现一般情况下都表现为同时有效。表示主设备已经把地址和数据准备好了,等待从设备的AWREADY和WREADY。
2、从设备有效AWREADY和WREADY,这两个信号不一定同时有效。表示从设备已经准备好接收地址和数据,同时告诉主设备可以拉低AWVALID和WVALID了。
3、从设备有效BVALID,表示从设备已经完成了在指定地址接收数据的操作。这个信号虽然大多数情况下会先于BREADY拉高,但是允许其在BREADY之后拉高,也就是说BVALID和BREADY严格意义上讲并没有先后顺序,谁先完成谁先有效,并且拉高时和拉高之后就监控对方是否已经也拉高了,如果对方拉高,则己方在下一个时钟节拍拉低。
4、主设备有效BREADY,表示主设备已经完成了其余工作,此时可以接收来自从设备的BVALID,由于大多数情况下BVALID已经拉高,此时主设备拉高这个信号也是为了告诉从设备可以拉低BVALID了。
和读操作类似,写操作的信号依赖关系图如下。
图8 AXI写操作信号依赖关系
主设备不一定得等待AWREADY或WREADY有效后再给出AWVALID或WVLAID。
从设备可以等待AWVALID或WVALID有效或者两个都有效之后再给出AWREADY,也可以不用等待这两个信号有效就给出AWREADY。
从设备可以等待AWVALID或WVALID有效或者两个都有效之后再给出WREADY,也可以不用等待这两个信号有效就给出WREADY。
从设备必须等待WVALID和WREADY都有效之后,才能给出BVALID,这里需要注意的是对于猝发传输,从设备除了要等待前面两个信号有效之外还要等待WLAST有效之后才能给出BVALID。
主设备可以等待BVALID有效之后再给出BREADY,也可以不用等待BVALID有效直接给出BREADY。
信号依赖关系是不是有点晕,其实不用记这么多,在使用过程中看实际波形就可以了。
2、猝发传输(Burst传输)
AXI总线的最大特点就是其猝发传输(一次命令多个数据的传输形式),猝发传输时比上面的情况多了几根信号线,猝发传输的起始地址最好以4KB对齐。猝发传输的过程以事务为单位,分为读命令事务、写命令事务、读数据事务、写数据事务、写应答事务,分别对应上面的5个通道。以下是我个人的理解:AXI总线的这种将总线操作分解为事务的特点和PCI、PCIE相类似,分解成事务之后,所谓的"总线"这个概念其实就是某种“协议”,所谓的总线的管理过程就是事务的转发过程,其实没有什么看得见摸得着的“总线”,本质就是满足特定协议的一堆接口以及中间的交换设备,这是所有高速总线的一大特点。下面两图大概说明了猝发传输的过程。
图9 AXI读猝发
图10 AXI写猝发
从上面两图,套用事务的概念,可以看出,对于读操作的过程,事务的顺序就是读命令事务—>读数据事务,对于写操作的过程,事务的顺序就是写命令事务—>写数据事务—>写应答事务。
除了第二节中的6个通道包含的信号线以外的AXI信号线如下。
读/写地址通道:
猝发传输相关的信号线:
ARLEN/AWLEN:猝发传输的长度。此长度决定本次猝发传输的数据的个数,每个数据的大小以下面的SIZE决定,为0表示传输1个数据,为1表示传输2个数据,以此类推。
ARSIZE/AWSIZE:猝发传输的大小,为0表示取低8位,即数据大小为1byte,为1表示取低16位,即数据大小为2byte,以此类推,这个数值不能超过总线位宽所决定的最大byte数。
ARBURST/AWBURST:猝发传输的类型(注1)。
其他不常用的信号线:
ARLOCK/AWLOCK:锁类型。原子操作相关(注2),初学者不用考虑,一般为0。
ARCACHE/AWCACHE:用于描述存储类型。AXI总线支持访问多种类型的存储设备,一般不用考虑,由IP核自动填写,存储器类型见图11。
ARPROT/AWPROT:保护类型,指明访问优先级、是否采用安全访问等信息,初学者不用考虑,一般为0。
读/写数据通道:
RLAST/WLAST:指示猝发传输的最后一个数据,不一定是一个节拍,但是一定是在本次需要传输的最后一个数据有效时才有效,如果其从有效变到无效,说明本次传输已经完成。
读/写/地址/数据/应答通道的ID信号线:
ARID/AWID:地址ID,交换设备转发事务的标记。
WID/RID/BID:与前面的ARID/AWID保持一致。
图11 AXI存储类型指示信号的含义
注1:
AXI协议用ARBURST/AWBURST[1:0]信号线定义了三种猝发传输的类型:固定式(FIXED,00)、递增式(INCR,01)、回卷式(WRAP,10)。
(1)固定式是指地址是固定的,每一次传输的地址都不变。这样的猝发传输是重复地对一个固定的位置进行存取,例如FIFO。
(2)递增式是指每一次读写的地址都比上一次的地址增加一个固定的值,就是通常的顺序存储器,这是最常见的猝发传输形式。
(3)回卷式跟递增式类似,当地址递增到边界时,自动返回到起始地址(起始地址必须按ARSIZE/AWSIZE对齐,猝发长度只能是2、4、8、16)。
注2:
原子操作是不可分割的,在执行完毕之前不会被任何其它任务或事件中断。一般在单处理系统中的单条指令中可完成的操作都认为是原子操作。
AXI是一个比较复杂的协议,猝发传输时不一定是一次完成之后再进行下一次,经常会出现重叠式猝发,即同时给出两次以上的命令事务,之后才进行数据事务,或者第一次数据事务还没有完成就给出第二次的命令事务。此外还有窄带传输和不对齐传输,我就不讲了,新手只需掌握非猝发时的AXI握手规则,看懂仿真波形就可以了。在FPGA设计中,对于复杂程度比较高的协议我们通常是利用官方IP核,AXI的猝发传输只需大概看懂波形就可以了,有兴趣可以深究,对于学习其他高速接口很有帮助。
下图是我截取的一段AXI重叠式猝发写的波形图供大家参考,图中Master连续给了两次写命令事务。
图12 AXI的burst写操作的波形
审核编辑 :李倩
全部0条评论
快来发表一下你的评论吧 !