AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

 

AXI总线学习连载(7)

 

鲁迅曾经说过:

学硬件,不是学哪里查哪里,有一些东西是必须系统的学的,不管是嵌入式还是FPGA,硬件学习的积累一定要是系统的。

 

我也曾经说过:

英文手册非常重要,这是学习硬件标准的不二法门,没有捷径,我们这一行可以不说英语,英语也可以像我和我某些同事一样口语富有乡土气息,但是一定要能熟练看,内心看,做阅读理解一样看

跟着这篇博客,慢慢学习,对着官方文档,不仅可以学会这个协议,更能够学会硬件学习的方法,所谓举一反三。(我说的比鲁迅还多)

 

好了既然是axi,那么这么说,只要你使用arm架构的芯片,arm和fpga(pl 可编程逻辑)部分通信,或者外部设备通信,你都会用上这个协议。所以一起来学习,打工人!就该把自己的时间全部放在上面 

好了不废话了,一起来探索吧! 

 

不要厌烦枯燥,理论学习是在实践之前的必经过程,当学习完axi原型后,我也会专门贴出来一个axi协议使用开发的详细详细详细的n次方的接口解析。请学习过程中不要放弃,不要觉得枯燥!! (其实说给自己听的)

 

qq:2198187857  这里放出来一下,就是希望朋友们指导,有不足的地方批评教育一下,作为新手,还是很认真在学习

--------------------------------------------------------------分割线-----------------------------------------笨蛋看不见-----------------------------------------

 

上一个连载学习了burst size 和burst length 回忆一下,我们知道再一次burst的过程里,burst size 实际上是数据总线位宽,burst length 是拍数,两个的乘积就是数据的总量,但是数据总量不能超过4KB的

容量。

好了现在这一次我们学习burst size 和burst address

在AXI原型当中有三种类型的burst ,我们一个一个认识

还是放出官方的英语注解进行解析

 

AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

第一种叫做fixed burst机制,这时候每一次都是重复的往这一个地址写东西,这个很好理解,这个其实就是FIFO的作用,往一个地址的地方重复的写入。这个很简单

 

第二种就是我们说的增长burst机制,顾名思义,这个方式是每一次传输都在上一次传输地址的基础上增长,地址到底增长多少取决于burst size ,其实就是要是burst size每次增加

多少个字节相应的做出变化,官方做了一个实例,假设每一次传输的burst size 都是32位即4个字节,由于是字节编址,所以下一次的传输地址会增加4,但是要记住地址通道

其实只传输首地址,至于后续地址怎么变化,其实就是取决于burst type。

这种方式,其实常用于一般的存储单元的有序访问,比如ram读写什么的

AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

 

接下来倾斜模式,这个翻译对不对我也不知道,就这么叫吧,反正也是英文用的多,其实这个机制和刚才增长机制很像,除了一点不同就是当写到最高地址的时候

又回到了最开始的最低起始地址。当然有如下的要求

      在wrapping模式里有以下的约束

       开始地址必须和这个传输的burst size对齐,什么叫做对齐,其实就是,你存的数据是多少位,就必须给够,假设burst size 是32 那么第一次地址为0 则下一个为4

在下一个是8.这样堆积起来,自己可以画一个图看看。

     第二个就是burst length 必须是2,4,8,16

其实就是不超过4KB的一个保证而已。

    对于这种wrap的burst 有以下表现

 常常最低地址是用来对齐这个最开始的burst size的,所以接下来的传输,如果我们要的到这种burst边界在哪里,我们可以想,burst size 决定了每一次需要占据

多少地址的字节,那么burst size 就表示单次transfer有多少个字节,然后乘以这个burst length 就是整个burst有多少字节,这样一来就知道了最后一个字节地址是

多少了,那么这个字节就是边界了。

在每一次传输之后,地址都会增长,按照incr模式一样,只是需要对齐,但是注意上限。如果有一次增长地址变成了边界地址加上burst size接下来则会倾斜回原来的

边界地址。

这种机制常常用来为cache 的访问。

当然在我们地址通道内肯定会需要一个信号先表示这种机制,所以如图

 

AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

 

AXBURST 代表ARBURST 和AWBURST

--------------------------------------------------------------分割线-----------------------------------------笨蛋看不见-----------------------------------------

 

在介绍burst address之前我们必须要复习下我们学过的三个表示burst的指标

1.burst size 数据总线宽度

2,burst length 一次burst 一共多少拍

3,burst size 代表读写的方式,有三种方式可以选择

对应的信号线分别是

AXSIZE

AXLEN

AXBURST 请注意这些都是地址通道内部的控制信号。

下面开始介绍burst address 其实burst address是很多术语组成的用来决定这个burst当中涉及的地址和字节传输数,类似几个计算公式

 

AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

 

第一个是起始地址   是由主设备发送的

第二个Number_bytes  每一次transfer中字节的最大数,其实和burst size差不多

第三个是每次传输的字节通路的个数,这个比较绕,其实就是说数据总线上有几个字节是用来传数据的

第四个对齐地址       也就是每一次传输,地址都按照对齐的方式,举个例子就是挨个挨个放好,画个图

 

AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

 

灵魂画手作图。

第五个 burst length 就是burst内有多少拍

第六个 address_n  这个好理解就是第几次传输的地址,n如果是1就是第一次传输的地址

第七个 wrap_boundary 在一次wrap传输的最低的那个地址

第八个 lower_byte_lane 这个不好理解,其实这个就是说因为每次传输都是很多位,然后除以八就是字节,最低八位每次占据的地址,就是 lower_byte_lane

第九个upper_byte_lane 这个很像前面的,每次传输都是很多位,所以除以8就是多少个字节,这个表示最高的八位每一次传输所要去的地址

最后一个就是四舍五入的意思,int(x)就是代表对x四舍五入

好了光说不练假把式

现在我们开始一个实战!!!!把我们设计要用的真实量和这些概念合在一起

 

1.start_address=AXADDR 这个好理解其实就是AXADDR传递都是当前burst 的首个地址

2.number_bytes=2^AXSIZE 这个需要把表格拿出来,我们说的burst size 是指数据总线有多少个字节宽,但是对于AXSIZE是表示他的信号线是有区别的,其实是2^AXSIZE=burst size

我再把上一连载图放出来,你就知道了,这么说来就知道了。根据刚才的讲解number_bytes就是说数据总线上有多少字节,所以我之前说其实就是burst size。

AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

3.burst _length 同样的是AXLEN+1

4.AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

这是对齐地址,其实就是对齐方式传输的地址,即每一次增加多少,这个其实没有必要按照这个计算,就按照我画的图来继续,图上这个公式

其实是从任意其实开始算,我们还是用刚才的图,假设start_address是5,然后burst size 就是number bytes是1(传一个字节),那么算下来

就是5。如果burst size 是16那么如果要对齐起始地址就是0;   

用这么图去演算就可以。

AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

5.Address_1=start_ADDRESS

   第一次传输的地址就是起始地址嘛

 

 

6.   对一次增长burst和倾斜wrap,当还在地址增长阶段,就是说地址还没有回去的时候,这个公式决定了,第N

次传输地址是多少

   ADDRESS_N=Aligned_Address+(N-1)xnumber_bytes其实就是其实的那个地址加上经过了传输多少个

字节,因为每一个字节就是一次地址加

 

7.对于一次wrap burst ,这个warp_boundary 按照如下定义

   AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

这个算起来太麻烦了。。。所以还是记住,还是按照我这个图算吧。。。你每次穿多少字节,burst length是多少

然后burst size 是多少,按照字节一个一个加吧,,,,,这个真的太麻烦了。。。。。验证一下起始结果是对的

 

好了 接下来的量其实都是很好推算的,只要清楚了概念,我就把剩余几个放在这里

AXI总线学习-------从零开始详细学-------------连载(7)读写处理架构,burst介绍,burst细节定义(burst type burst address)

 

其实我在使用这个访问cache的时候其实没有这么复杂,按照size length 还有总量一次次去算就可以了,不用太在意。

 

--------------------------------------------------------------分割线-----------------------------------------笨蛋看不见-----------------------------------------

 

接下来我会手工打一个书上的伪代码,表示的是数据transfer的逻辑,并且附上注释

//data transfer

//===========

data transfer(start_addr,number_bytes,burst_length,data_bus_bytes,mode.iswrite)    这一句其实体现整个transfer其实是受控于其中几个变量的,这些都是我们熟悉的

//这里两个我们需要注意下,mode其实是burst type 

//iswrite是读写模式 true代表写模式,false代表读模式

assert mode in {fixed,wrap,incr}   //这里是确定burst type

addr=start_addr//给起始地址

aligened_address=(int(addr/number_bytes)*number_bytes)//如果用对齐传输,则用这个作为起始地址

aligned=(aligened_address==addr)这个是判定条件,如果addr等于对齐地址则代表原来传输本来就是对齐,如果不等于则原来传输不是对齐,建议调整为对齐

dtsize=number_bytes*burst_length//代表一个burst内总的数据量单位是字节哈注意一下

if mode==warp then//这个情况是如果是wrap模式,接下来就需要低边界和高边界

  lower_wrap_boundary=int(addr/dtsize)*number_bytes//这个看前面的表格,如果起始地址是0就直接为0

  upper_wrap_boudary=lower_wrap_boundary+dtsize//这个好理解,全部字节如果都装满了就到了上边界

for n=1toburst_length //这表示第一次到第n次传输的循环

lower_byte_lane=addr-(int(addr/data_bus_bytes))*data_bus_bytes//这个很简单起始就是指每一次transfer最低字节所去的地址

if aligned then 

   upper_byte_lane=lower_byte_lane+number_bytes-1//这个更好理解了,对齐方式最高字节,就按照递增往上走就可以了,这是对齐模式

else//如果不是对齐模式,其实也不建议这么用

   upper_lane_=aligned_address+number_bytes-1-(int(addr/data_bus_bytes))*data_bus_bytes//真不建议用不对齐的方式,,很混乱

//perform data transfer 好了确定了地址,但是还要说明这个地址是读的还是写的

好了后面的伪代码就没什么意思了。就是设置是读还是写,其实这些都在配置界面,创建ip核的时候会写好,但是

我们需要对此理解之后,往上面加我们自己的逻辑

 

--------------------------------------------------------------分割线-----------------------------------------笨蛋看不见-----------------------------------------

今天干货满满了,这就完完全全解析清楚了所有地址和地址控制信号了,接下来就是真正的读和写数据通道

我们会更细致理解transcation transfer 还有这个burst 还有对齐和非对齐

如果有遗忘回头来看就是了,一定记住,记住原理是最重要的,这是我们设计的基本功

!!!!!

强调一次,如果是设计一定要学好这节,地址通道的安排非常重要,虽然现在eda工具已经不需要我们自己写这个接口,但是我们会在这个接口基础上去

写各种新的逻辑,所以如果你想完全掌握你所写的axi接口的ip核 是必备的!!!!!!

今天九点15 昨晚肝到三点,今天打一把战地就休息了,好好的学习真知识,少内卷,安安心心追求真知就好

晚安!明天见!