AXI总线你需要知道的事儿
扫描二维码
随时随地手机看文章
ZYNQ的FPGA系统呢,AXI总线是个绕不开的话题。
以AXI4为例。又有AXI FULL/LITE/STREAM之分。不同总线起到的效果是不一样的。由于AXI的文档三百多页。。。对于没有了解过AXI的人来说就是天书。所以这篇文章着重讲一下AXI总线的一些基本概念和使用方法。高级的用法再去查文档。
你可以理解为一种用于传输数据的模块或者总线。用于两个模块或者多个模块之间相互递数据。反正它有一堆优点。。被SOC广泛采用了。
AXI FULL传输数据是全双工的。也就是说。读写是同时进行的。
一条AXI总线上有5个通道。两个用于读。三个用于写。
先说AXI怎么写数据。。
首先,主通过写地址channel给奴给了个地址...奴收到信号以后就可以疯狂通过写数据channel往里送数据。写完以后通过写回复channel给主一个结束信号。
写回复通道其实2个BIT.能代表四种状态,传成功了。以及几种传失败了的状态。
这就是一次AXI写操作。
AXI读操作如上...主给奴个地址,于是奴疯狂的给主返回数据。
那为什么读只需要两个通道呢??因为完成信号可以用read data channel一并传输。
实际上的AXI还有各种奇奇葩葩的信号。你只需要了解上面几个就行。其他的当你有需求的时候自然会看。
每个通道为了调节速度,保证传输。都采用了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给置高。
上面讲完以后。。。似乎传输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是否有效。
上面讲了一堆。。AXI FULL怎么传数据的基本上应该是清楚了。下面介绍一下它的阉割版。。
阉割的东西不少,但是你简单理解一下的话。
AXI-LITE是Burst-length严格定于1, burst size严格定于总线位宽的AXI. 最明显的阉割就是不支持burst length, 只能一个数据一个数据读写,读写的位宽和总线位宽一致的。其他阉割可以自己看文档。
这个东西是干什么的。。。顾名思义,是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传输的数据队形不能乱。就像下图对应的情况。。。
然后其他的东西就比较细节了。用的时候再查也不迟。
写到这个,你对AXI应该已经有个简单的概念了。
AXI系列用处是用来传输数据的总线。
AXI-FULL作用是给定地址与传输数量,进行burst传输。
AXI-LITE作用是给定地址,单个数据的读写。
AXI-STREAM作用是不给地址,不给数量,像水管一样靠last这个阀门传输数据。
具体用哪个,可以灵活选用。
但是据我自己的工程实践,这种总线最好直接用ARM或者VIVADO提供的ip核。。虽然协议清楚,但是你不要头铁自己写。否则BUG真实无穷无尽。





