赞
踩
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)为地址边界进行拆分,有效字节对应的位置是相同的,只不过是每次是能的字节位置不同:
完结!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。