当前位置:首页 > > ZYNQ
		


ZYNQ的FPGA系统呢,AXI总线是个绕不开的话题。


以AXI4为例。又有AXI FULL/LITE/STREAM之分。不同总线起到的效果是不一样的。由于AXI的文档三百多页。。。对于没有了解过AXI的人来说就是天书。所以这篇文章着重讲一下AXI总线的一些基本概念和使用方法。高级的用法再去查文档。


01AXI是干什么的


你可以理解为一种用于传输数据的模块或者总线。用于两个模块或者多个模块之间相互递数据。反正它有一堆优点。。被SOC广泛采用了。


02先对AXI有个了解,它是怎么传输数据的


AXI FULL传输数据是全双工的。也就是说。读写是同时进行的。


一条AXI总线上有5个通道。两个用于读。三个用于写。


先说AXI怎么写数据。。



首先,主通过写地址channel给奴给了个地址...奴收到信号以后就可以疯狂通过写数据channel往里送数据。写完以后通过写回复channel给主一个结束信号。


写回复通道其实2个BIT.能代表四种状态,传成功了。以及几种传失败了的状态。


这就是一次AXI写操作。



AXI读操作如上...主给奴个地址,于是奴疯狂的给主返回数据。


那为什么读只需要两个通道呢??因为完成信号可以用read data channel一并传输。


实际上的AXI还有各种奇奇葩葩的信号。你只需要了解上面几个就行。其他的当你有需求的时候自然会看。


03然后,介绍一下5个通道内部是怎么传数据的

每个通道为了调节速度,保证传输。都采用了ready valid握手协议的办法。主给出valid,奴给出ready, 只有当ready和valid都是高的时候,这次传输才算成功。



如上图。valid和ready哪个先来不重要。同时来了以后information就被传输了。


那举个栗子,读数据的时候ready valid信号怎么给?



如上图,主先给地址的valid名叫arvalid. 然后奴等自己洗好了以后给出地址的ready arready。然后说明地址传输好了。当主检测到arvalid和arready同时为高是,就和以把读数据通道rvalid置高,愉快的传数据了。此时要是从设备准备接受数据了拉个rready. 数据就传输完成了。



写也类似。如上图。上面一行是主设备。下面一行是从设备。其中BVALID就是response通道的valid. 其他应该不难看懂。前面的差不多。就是多了个bvalid. 主设备只有检测到wvalid, wready 同时为高,且数据传输完成了,就把bvalid给置高。


04然后,再介绍一下如何传多个数据


上面讲完以后。。。似乎传输address这种单个数据的就清楚了。但是数据通道连续传输数据似乎比较模糊。这儿就开始讲。


AXI是支持多个数据的。这种传输模式叫突发传输。至于为什么叫突发而不叫连续,就有点儿不明觉厉了。


一个突发传输是靠几个信号来描述的。这些信号同在AXI总线里。


Burst length: ARLEN[7:0]和AWLEN[7:0]表示的就是这个。表示的是连续传输的周期数。一个burst内部是不可以被打断的。。所以data valid一旦高起来就要把一个burst传完再拉低,slave的ready信号可以中断,但是最终还是要高起来传完一个burst. 对于master来说,一旦开始传数,一个burst之间的valid应该是不会低的。


Burst size: 指的是一个burst里面有多少Byte. ARSIZE[2:0]和AWSIZE[2:0] 里就是这个。。为什么只有3bit呢?因为只有8种情况。1,2,4,8,16,32,64,128。这个里面其实有个非常小的问题。。一般来说。总线位宽和burst size一致的。。比如总线64bit, burst size是8Byte. 但是你要说我头铁非要给个不一样的值。。那也没问题。你总线是8BTYE, 你给了个2BYTE的Burst size, 那你就要指定,,每次传输这个2BYTE要放到8BYTE的哪几个BTYE上去。。。所以没事儿别折腾自己。


那你说我非要折腾自己呢?也行。这种传输叫narrow transfers。往哪个地方上写,可以用WSTRB[N]这歌信号控制。数据会写到WDATA[(8n)+7: (8n)]



比如上面这个例子。32bit的地址总线。burst size给了个8bit. 那就靠WSTRB这个信号确定往哪儿写。比如上面。传输了5次。可以控制数据往不同地方写。


Burst type: 这个有三种。FIXED表示你一直往初始地址猛怼。INCR表示你从初始地址开始累加。WRAP表示加到某个值后返回初始地址。


另外要说的一点是。。AXI只支持非对齐传输的。



例如上面这种情况。。如果地址从7开始。传输5次。前三个BYTE是无效的,不会被传输。用WSTRB信号就可保证这一点。keep信号表示的是BTYE是否有效。


05然后介绍一下AXI的弟弟:AXI-LITE是个什么东西

上面讲了一堆。。AXI FULL怎么传数据的基本上应该是清楚了。下面介绍一下它的阉割版。。


阉割的东西不少,但是你简单理解一下的话。


AXI-LITE是Burst-length严格定于1, burst size严格定于总线位宽的AXI. 最明显的阉割就是不支持burst length, 只能一个数据一个数据读写,读写的位宽和总线位宽一致的。其他阉割可以自己看文档。


06然后介绍一下AXI的堂妹:AXI-STREAM是个什么东西


这个东西是干什么的。。。顾名思义,是stream。流的意思。视频流,数据流什么的。AXI-STREAM和AXI之间的关系不像是相互阉割的关系。而是各有所长。当然,他们用的握手协议还是一样的。


AXI-STREAM相比于AXI最显著的特点是,总线上没有数目。只用TLAST表示传输结束。


这样导致AXI-STREAM的信号非常简单。


TVALID\TREADY\TDATA 兄弟三不用多解释,是个总线都有。


TLAST 由于总线上没有传输数目。所以最后一个数据时TLAST会高起,表明传输完成了。


TKEEP 这是一个多比特的信号。比如总线8个Byte. 这个信号8bit. 没一个bit对应的是总像是对应的BYTE是不是有效的。


TSTRB 这也是一个多比特信号。。也是说明总线上的数据是不是有效的。。


那这个地方你可能会问,TKEEP和TSTSTRB到底有啥区别?


区别是这样的。。TKEEP要是为0。代表了这个数据完全没用,可以被扔掉了。


在TKEEP为1的前提下,表示这个信号不能扔掉。那TSTRB就起作用了。TSTRB为1,表示对应的数据有效,是个好数据。TSTRB为0时,表示这个是个占位数据,没啥意义,但是不能丢掉。为什么需要占位数据呢?是因为有时候需要AXISTREAM传输的数据队形不能乱。就像下图对应的情况。。。



然后其他的东西就比较细节了。用的时候再查也不迟。


07总结


写到这个,你对AXI应该已经有个简单的概念了。


AXI系列用处是用来传输数据的总线。


AXI-FULL作用是给定地址与传输数量,进行burst传输。


AXI-LITE作用是给定地址,单个数据的读写。


AXI-STREAM作用是不给地址,不给数量,像水管一样靠last这个阀门传输数据。


具体用哪个,可以灵活选用。


但是据我自己的工程实践,这种总线最好直接用ARM或者VIVADO提供的ip核。。虽然协议清楚,但是你不要头铁自己写。否则BUG真实无穷无尽。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭