天天看点

AXI外设IP的AXI-lite代码阅读记录

AXI lite 总线源码时碰见未见过的运算符,所以搜索记录下,此运算符在for语句用得多。

https://zhuanlan.zhihu.com/p/77528158

https://zhuanlan.zhihu.com/p/145936888

以上链接为AXI lite的代码分析

“+:”、"-:"语法

运算符,运用在多位的变量中,如下:

slv_reg0[(byte_index8) +: 8] <= S_AXI_WDATA[(byte_index8) +: 8];

"+:"

变量[起始地址 +: 数据位宽]

等价于

变量[(起始地址+数据位宽-1):起始地址]

data[0 +: 8]  //等价于--> data[7:0]
data[15 +: 2] //等价于--> data[16:15]
           

"-:"

变量[结束地址 -: 数据位宽]

等价于

变量[结束地址:(结束地址-数据位宽+1)]

data[7 -: 8]  //等价于--> data[7:0]
data[15 -: 2] //等价于--> data[15:14]
           

//

由FDMA代码里的AWSIZE引出是基本概念

参考:

https://zhuanlan.zhihu.com/p/96804919

AXI FULL、AXI Lite、AXI Stream

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

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

AXI是支持多个数据的。这种传输模式叫突发传输。至于为什么叫突发而不叫连续,自己品。

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

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

Burst size:

指的是 每一拍含有的 Byte数,而不是bit数,所以总线32位,每次只能传输32bit burst size = 32,也就是AWSIZE[2:0] = b101,那么每一拍含有 32 x8 bits

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

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

AXI外设IP的AXI-lite代码阅读记录

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

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

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

AXI外设IP的AXI-lite代码阅读记录

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

AXI外设IP的AXI-lite代码阅读记录

AXI-Lite:

AXI-LITE是Burst-length严格定于1, burst size严格定于总线位宽的AXI.

最明显的阉割就是不支持burst length, 只能一个数据一个数据读写,读写的位宽和总线位宽一致的。其他阉割可以自己看文档。

AXI-STREAM:

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

AXI-STREAM相比于AXI最显著的特点是,总线上没有数目。只用TLAST表示传输结束。这样导致AXI-STREAM的信号非常简单。

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

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

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

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

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

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

AXI外设IP的AXI-lite代码阅读记录

其他细节处查手册

总结

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

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

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