当前位置:   article > 正文

amba_axi_聊一聊narrow single_axi awsize

axi awsize

        AMBA总线无论是soc还是FPGA,应该都是比较常用的一组总线协议,对于其中的协议,有一种传输形式叫Narrow Transfers。

>>Axsize

        在AXI4协议中,aw通道以及ar通道均存在一个size字段:

        

这里面就有点儿意思了,比如说在FPGA中常用的512byte总线位宽场景下,FPGA设计里一般也会直接固定死arsize,awsize为0x6,即每拍传输64bytes,然而协议里面的设置野允许了axsize可以设置为0x0~0x6中任一值,即每一拍可以传输1,2,4,8,16,32,64中的任一情况,而这种不满位宽输出的场景,即为“Narrow Transfers”

>>传输规则

在AXI4总线中,协议中规定了其传输规则:

# start_addr:Master发起传输的起始地址

# data_bytes:总线数据位宽

# aligned_addr:地址对齐的其实地址

# address_N:第N拍的传输地址(1为第一拍)

# wrap_Boundary:wrap传输的相应地位地址

# Lower_byte_Lane:每拍传输的地位地址

# Upper_byte_lane:每拍传输的高位地址

# INT(x):X向下取整

对于传输,定义:start_addr= axaddr

                             aligned_addr= INT(start_addr/size)*size

这里Aligned_addr就有点意思了,其采用的是size(1<<AxSize)而非总线的位宽,也就意味着当总线位宽是512时,若AxSize为6,则意味着:

                              Aligned_Addr= INT(start_addr/64)*64

而当axsize=5时,则意味着: 

                              Aligned_Addr= INT(start_addr/32)*32

对于第一拍传输,则:

                              address_1= start_addr

对于INCR传输以及未回环的Wrap传输:

                              Address_N= Aligned_addr+ (N-1)*size

对于首拍,Lower_byte_lane和Upper_byte_lane采用:

               Lower_byte_lane  = start_addr-(INT(start_addr/data_bytes)*data_bytes)

               Upper_byte_lane  = Aligned_addr+(size-1) -(INT(start_addr/data_bytes)*data_bytes)

除了首拍之外的其他拍则有:

               Lower_byte_lane  = Address_N-(INT(start_addr/data_bytes)*data_bytes)

               Upper_byte_lane  = Lower_byte_lane+size -1

光看公式确实很枯燥,来具体举例看看,我们假定:

# 总线位宽为8byte

#起始地位为3,传输16字节

对于Awsize为3,即8字节时,传输时序为:

对于Awsize为2,即4字节时,传输时序为:

 

 对于Awsize为1,即2字节时,传输时序为:

仔细分析上面的三张图,除了awsize为3的正常传输外,剩下的两个均是narrow transfer,如果你从下往上看,想俄罗斯方块那种从下往上堆叠,在地址不跨越总线位宽地址8byte的情况下,像俄罗斯方块那种模式,则会有:

 

所以,所谓的narrow transfer,不过是正常的传输给拆分成按照(1<< awsize)为地址边界进行拆分,有效字节对应的位置是相同的,只不过是每次是能的字节位置不同:

 

完结! 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/493593
推荐阅读
相关标签
  

闽ICP备14008679号