AXI总线学习连载(8)
鲁迅曾经说过:
学硬件,不是学哪里查哪里,有一些东西是必须系统的学的,不管是嵌入式还是FPGA,硬件学习的积累一定要是系统的。
我也曾经说过:
英文手册非常重要,这是学习硬件标准的不二法门,没有捷径,我们这一行可以不说英语,英语也可以像我和我某些同事一样口语富有乡土气息,但是一定要能熟练看,内心看,做阅读理解一样看
跟着这篇博客,慢慢学习,对着官方文档,不仅可以学会这个协议,更能够学会硬件学习的方法,所谓举一反三。(我说的比鲁迅还多)
好了既然是axi,那么这么说,只要你使用arm架构的芯片,arm和fpga(pl 可编程逻辑)部分通信,或者外部设备通信,你都会用上这个协议。所以一起来学习,打工人!就该把自己的时间全部放在上面
好了不废话了,一起来探索吧!
不要厌烦枯燥,理论学习是在实践之前的必经过程,当学习完axi原型后,我也会专门贴出来一个axi协议使用开发的详细详细详细的n次方的接口解析。请学习过程中不要放弃,不要觉得枯燥!! (其实说给自己听的)
qq:2198187857 这里放出来一下,就是希望朋友们指导,有不足的地方批评教育一下,作为新手,还是很认真在学习
--------------------------------------------------------------分割线-----------------------------------------笨蛋看不见-----------------------------------------
上一个连载我们学习了数据地址通道当中传输方式,包括首地址,对齐地址,burst size burst length等关键概念,其实这些东西就是我们说的读写控制信息和控制信息,上一讲我们细致分析了机制。回过头来我们
定性看,其实不就是规定了,接下来数据往哪个地址写,地址后续怎么变化,然后有加上了一系列的规范限制。
这一个连载我们将要学习,有了这些控制信号以后,读写数据在数据通道内的架构。说白了,前面的连载先学习握手机制,再学习读写地址通道操作,这一次就是读写数据通道的操作。
这个部分可能会持续两到三个连载,主要会讲解,在不同的burst size和burst length 和burst type的约束下,AXI原型在读和写数据总线上是如何进行传输的,并且也向我们展示了混合字方式和不对齐方式传输。
这里有两个新概念什么叫做混合字方式,什么叫做不对齐方式。后续我们会拿出来专门讲解。这个专题大致目标就是如上叙述,包含的流程概念如下:
这四个概念,我也不知道怎么翻译为好,很多书上有不同的叫法,大概就这么叫吧:
write strobes :叫做写字节通路
narrow TRANSFER:狭窄传输
BYTE invariance :字节不变性
unaligened transfer:不对齐传输
这四个大概念,就是我们接下来会讲解的,加上刚才说的混合字模式和不对齐方式
mixed-endian 混合字模式
unaligened transfer 不对齐传输
--------------------------------------------------------------分割线-----------------------------------------笨蛋看不见-----------------------------------------
第一个概念 write strobes 写字节通路。
同样先放出官方英文定义,在进行解析,我们可以看见上面出现了三个信号,根据连载2当中给出的信号列表,我们翻回去查阅,这里我就单独拿出来
这两个信号是在写数据通道内(W通道),先看第一个WDATA很好理解就是写入的数据,第二个WSTRB叫做写选通,这个信号表示的是,在WDATAD的数据哪一些字节是有效的,这就是理解为哪几个八位有效,
后一句翻译就是WSTRB每一位的1,表示WDATA内每一个八位,这里可能还是有点模糊,我们回到第一张图。
第一张图翻译说WSTRB信号如果哪一位是高电平,则代表数据通路上WDATA哪八位是有效。他说的太冗长举个例子。假设WSTRB是1001,则代表WDATA最高八位和最低八位有效。这个类似于mask的效果。
这里指出了,只有WDATA中数据有用,即WVALID高电平,才能够说字节通路开始有用,如果说WVALID为低电平,也就是说数据没有用,则这个时候字节通路即WSTRB可以为任意值,但是建议如果WVALID
为低电平,还是建议WSTRB维持上次的值或是低电平,这个很好理解,从代码风格讲,逻辑更清晰更完善,从电路角度看,WSTRB的所拓扑的电路结构,不存在更多电平变化,对于系统更加稳定。我们知道如果
电路是cmos电路,或者是FinFET型的,电平转换意味着动态功耗大幅增加,如果电路能够维持稳定,则基本保持一个静态工作的模式,更能降低能耗。
--------------------------------------------------------------分割线-----------------------------------------笨蛋看不见-----------------------------------------
第二个概念 narrow transfer
根据官方定义,当主设备发起的一次传输,比总线宽度更窄,其实就是burst size 比总线宽度小,那么地址和控制信息(burst的type size length)决定了到底是哪几位在传,也就是哪几个字节通路在传送
注意在增长和倾斜传输这两者模式里面,每一拍的传送用的是不同的字节通路
在固定模式下,固定了字节通路。
怎么理解这个呢,把官方图拿出来就可以了
其实可以看见WDATA是32位,然后有五次transfer,每次传送8bit,这样说也不详细。
我们看第一次传输,地址总线是32,字节通路选择的是第0到第7位,这时候WSTRB其实是0001,对于第一次传输。
第二次传输,由于是INCR模式,地址从0到4,但是WSTRB其实是0010,所以只有中间第8到第15位的WDATA写进去
第三次地址通路变成0100,第四次1000,第五次0001,所以这个就很好理解什么是NARROW transfer,其实就是,字节通路
存在然后总线上只有一部分是传输的,但是都是字节为单位哈。
还有一个narrow的例子
这个就更好理解了,作为读者思考吧。根据我自己的结论第一次传输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吧(因为这里就用了四拍),然后传输开始
画一个表格,
画出来就是这样的是不是很简单。但是别忘了 记得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
这时候数据在写进来,好了就完成了!!!!撒花!!!!!
当然写完了还需要响应这就之后讲解了。这一次是写数据通道的东西,提醒一下这仅仅是对于写行为,不是读哈!!!读是没有这个字节通路这一说的。所以如果你是不对齐写进去,读起来会
很麻烦呢。。。。。。
最后把这个图画出来,刚才讲的这个传输模式,虽然原理简单,但是涉及的逻辑不简单,然后在编程环节,笔者也花了很多时间,由于工作环境限制,所以就不放细节代码了。
学会了这个逻辑就大胆尝试! 这是我的老师告诉我的,不要怕错!错了按着学过的逻辑去调节就好了。
成功的时候是很快乐的呢