AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer

时间:2024-04-10 11:03:20

AXI总线学习连载(8)

 

鲁迅曾经说过:

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

 

我也曾经说过:

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

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

 

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

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

 

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

 

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

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

上一个连载我们学习了数据地址通道当中传输方式,包括首地址,对齐地址,burst size burst length等关键概念,其实这些东西就是我们说的读写控制信息和控制信息,上一讲我们细致分析了机制。回过头来我们

定性看,其实不就是规定了,接下来数据往哪个地址写,地址后续怎么变化,然后有加上了一系列的规范限制。

这一个连载我们将要学习,有了这些控制信号以后,读写数据在数据通道内的架构。说白了,前面的连载先学习握手机制,再学习读写地址通道操作,这一次就是读写数据通道的操作。

 

这个部分可能会持续两到三个连载,主要会讲解,在不同的burst size和burst length 和burst type的约束下,AXI原型在读和写数据总线上是如何进行传输的,并且也向我们展示了混合字方式和不对齐方式传输。

这里有两个新概念什么叫做混合字方式,什么叫做不对齐方式。后续我们会拿出来专门讲解。这个专题大致目标就是如上叙述,包含的流程概念如下:

                                 AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer

 

这四个概念,我也不知道怎么翻译为好,很多书上有不同的叫法,大概就这么叫吧:

    write strobes :叫做写字节通路

    narrow TRANSFER:狭窄传输

   BYTE invariance :字节不变性

   unaligened  transfer:不对齐传输

  这四个大概念,就是我们接下来会讲解的,加上刚才说的混合字模式和不对齐方式

  mixed-endian 混合字模式

  unaligened transfer 不对齐传输

 

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

第一个概念    write strobes 写字节通路。

AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer

同样先放出官方英文定义,在进行解析,我们可以看见上面出现了三个信号,根据连载2当中给出的信号列表,我们翻回去查阅,这里我就单独拿出来

 

AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer

 

这两个信号是在写数据通道内(W通道),先看第一个WDATA很好理解就是写入的数据,第二个WSTRB叫做写选通,这个信号表示的是,在WDATAD的数据哪一些字节是有效的,这就是理解为哪几个八位有效,

后一句翻译就是WSTRB每一位的1,表示WDATA内每一个八位,这里可能还是有点模糊,我们回到第一张图。

第一张图翻译说WSTRB信号如果哪一位是高电平,则代表数据通路上WDATA哪八位是有效。他说的太冗长举个例子。假设WSTRB是1001,则代表WDATA最高八位和最低八位有效。这个类似于mask的效果。

 

这里指出了,只有WDATA中数据有用,即WVALID高电平,才能够说字节通路开始有用,如果说WVALID为低电平,也就是说数据没有用,则这个时候字节通路即WSTRB可以为任意值,但是建议如果WVALID

为低电平,还是建议WSTRB维持上次的值或是低电平,这个很好理解,从代码风格讲,逻辑更清晰更完善,从电路角度看,WSTRB的所拓扑的电路结构,不存在更多电平变化,对于系统更加稳定。我们知道如果

电路是cmos电路,或者是FinFET型的,电平转换意味着动态功耗大幅增加,如果电路能够维持稳定,则基本保持一个静态工作的模式,更能降低能耗。

 

 

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

第二个概念  narrow transfer 

AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer

 

根据官方定义,当主设备发起的一次传输,比总线宽度更窄,其实就是burst size 比总线宽度小,那么地址和控制信息(burst的type size length)决定了到底是哪几位在传,也就是哪几个字节通路在传送

     注意在增长和倾斜传输这两者模式里面,每一拍的传送用的是不同的字节通路

     在固定模式下,固定了字节通路。

怎么理解这个呢,把官方图拿出来就可以了

AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer

其实可以看见WDATA是32位,然后有五次transfer,每次传送8bit,这样说也不详细。

我们看第一次传输,地址总线是32,字节通路选择的是第0到第7位,这时候WSTRB其实是0001,对于第一次传输。

第二次传输,由于是INCR模式,地址从0到4,但是WSTRB其实是0010,所以只有中间第8到第15位的WDATA写进去

第三次地址通路变成0100,第四次1000,第五次0001,所以这个就很好理解什么是NARROW transfer,其实就是,字节通路

存在然后总线上只有一部分是传输的,但是都是字节为单位哈。

还有一个narrow的例子

AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer

 

这个就更好理解了,作为读者思考吧。根据我自己的结论第一次传输wstrb是11110000,第二次00001111,第三次11110000

 

md,其实我第一次看的时候半天也没弄明白,这里就提示一下!!!这种传输,传输的数据为什么少,是因为字节通路存在,然后和size type length 共同决定的!!!!!

所以再一次强调不要觉得这东西简答,其实很连贯的,总线协议计算机组成原理讲的很简单,这是一个实际的总线,而且是广泛用,当前前沿或者成熟的总线技术,学懂了,就真的

明白什么是总线了,就像都喜欢美女,都知道美女,但是都没有见过,突然有一天,你找了个美女了!你就真懂了。。。。。。

 

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

 

总结

这次讲的两个概念,字节通路,狭窄传输。

这两个其实是互相相关的概念,字节通路是数据通道内的一个开关,狭窄传输是由burst size length type 和字节通路,还有axi总线规则制定的一种transfer方式。

这两个概念一方面是新知识,一方面也是复习前面。好了现在我做一个自我检测习题。用于梳理概念。也当一个中期总结。

 

首先我们定义一次burst ,机制是incr 起始地址我们就安排在0x0,定义WDATA是32位,那么假设我的wstrb一直在变化

第一拍   1011

第二拍   1100

第三拍   1011

第四拍    0011

然后起始地址0x0 burst size 设置32 ,字节通路已经有了,burst length就是4吧(因为这里就用了四拍),然后传输开始

画一个表格,

 

AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer

画出来就是这样的是不是很简单。但是别忘了 记得4kB地址边界,然后tpye不同,造成的对齐影响,还有上一次讲的,我们建议对齐

那么我给一个命题

如果我希望每一次都传一个16位的定点数(好吧这其实就是我现在做的,笔者自己写的一个接口,作为练习去替代这个axi bram controller)

这时候从设备起始就是这个bram,那么bram配置是32位位宽,然后深度1024,有人问不是说传输burst不能超过4kB,你这32bit*1024都多少KB,再一次强调,这是说单次burst不超过4KB

你可以第二次burst 调整起始位置就可以了,在AW通道内改就可以了。

好了继续问题,现在我说了建议对齐传输,这样读取好读取,现在我们知道,数据位宽是32位,但是我只传16,也就是WSTRB是0011了,然后继续,一共16个数,虽然一个32位我每次只用了

16,但是还是耗费了资源,所以其实我这个行为传了32*16也就是64BYTES,并没超过边界4KB,这样我们就有了参数

来统计一下

WDATA 32bit

burst size 4

burst type incr

start 0x0

burst length 16

对了这里补充一下,就是地址增长怎么算,其实我们在嵌入式里面写,其实是用offset 偏移量来表示,比如这里就要偏离4,即第一次地址为0第二次就应该是4,这个其实就是burst size。

好了这样我们就可以开始传数据了。

逻辑就是

AW通道握手完毕,好了传START地址,然后size length type都传过去,分别用AWSIZE AWLEN AWBURST这三个信号线写,记得给这些信号线赋值的时候要注意加不加1,或者减1,

此时 AWSIZE 是4代表四个字节

        AWLEN 是1111 提醒一下length=AWLEN+1;!!!!!

       AWBURST 01 代表burst类型为增长型

好了这时候控制信息和起始地址完毕,可以开始写W通道了

     因为我们size是32位,但是我们其实只需后16位数据,所以W握手开始了,则WSTRB则变成0011

   这时候数据在写进来,好了就完成了!!!!撒花!!!!!

当然写完了还需要响应这就之后讲解了。这一次是写数据通道的东西,提醒一下这仅仅是对于写行为,不是读哈!!!读是没有这个字节通路这一说的。所以如果你是不对齐写进去,读起来会

很麻烦呢。。。。。。

最后把这个图画出来,刚才讲的这个传输模式,虽然原理简单,但是涉及的逻辑不简单,然后在编程环节,笔者也花了很多时间,由于工作环境限制,所以就不放细节代码了。

学会了这个逻辑就大胆尝试! 这是我的老师告诉我的,不要怕错!错了按着学过的逻辑去调节就好了。

成功的时候是很快乐的呢

 

AXI总线学习-------从零开始详细学-------------连载(8)读数据通中字节通路,narrow transfer