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)]
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn5ENFpnT3VlaNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5ETY5MGZmZjN0Y2M5UGM5UGN4QDN4QmNwEWYwcTNjF2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
比如上面这个例子,32bit的地址总线。burst size给了个8bit. 那就靠WSTRB这个信号确定往哪儿写。比如上面。传输了5次。可以控制数据往不同地方写。
Burst type: 这个有三种。FIXED表示你一直往初始地址猛怼。INCR表示你从初始地址开始累加。WRAP表示加到某个值后返回初始地址。
另外要说的一点是。AXI是支持非对齐传输的。
例如上面这种情况。如果地址从7开始。传输5次。前三个BYTE是无效的,不会被传输。用WSTRB信号就可保证这一点。keep信号表示的是BTYE是否有效。
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-FULL作用是给定地址与传输数量,进行burst传输。
AXI-LITE作用是给定地址,单个数据的读写。
AXI-STREAM作用是不给地址,不给数量,像水管一样靠last这个阀门传输数据。