AXI4_Stream入门(2): 接口与信号

本文来自自学过程中所记的笔记,可能有不少错漏与胡言乱语,仅供参考,建议主要以ARM官方文件进行参考。原参考文档官网可下载,为了方便各位,我也上传了,需要的自取;
链接:https://pan.baidu.com/s/1voHyFmkpGqABcKH8OSF_Ng
提取码:izix

信号类型:

  • 信号的宽度有以下几类:

n:数据总线的宽度(按byte);

i:8-bits;

d:4-bits;

u:线宽的整数倍(按byte);

在这里插入图片描述

握手:

TVALID与TREADY握手决定了数据传输的时间。双向传输的机制允许主机或从机都可以控制传输的速率与信息。要建立传输,TVALID与TREADY都必须被声明,双方都可以先进行声明,也可以在同一个ACLK周期内同时声明;

如果主机要进行数据传输,其不可以等待TREADY出现后再声明TVALID,当声明了TVALID后这个声明必须在TREADY的声明出现之前保持;

从机可以在等待TVALID出现之后再声明TREADY; 同时,从机也可以先声明TREADY并等待TVALID;

以下是几个例子,箭头指示的时间节点发生信息传递:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

信息传输:

  1. 数据在数据流中的位置:

    在一波数据流中,低阶总线传递的数据应该较早出发;

    当所有数据被完全打包好(没有空包),给定Byte在数据流中的位置如下:

    1. n表示为第n byte;
    2. t表示为第t次传输;
    3. 数据总线宽度为w bytes;
    4. INT(x)代表对x向下取整;
    5. b代表byte的位置;

    t = L N T ( n / w ) t = LNT(n/w) t=LNT(n/w);

    b = n − t ∗ w b = n-t*w b=ntw;

  2. 数据型(Byte types)详解:

    Data byte: Data byte必须从信源被传输至目标地;data byte的数量,相关的TDATA数据值,数据流中数据位的相对位置都应在传输过程中保持不变;

    Position byte: Position byte必须从信源被传输至目标地;Position byte的数量与数据流中数据位的相对位置都应在传输过程中保持不变;

    Null byte: 不包含任何数据,也没有任何限制;

    在连接传输过程中,链接不被允许对Data Byte与Position Byte的相对位置与数量进行调整。但链接传输过程中可以对空字节进行增减,以匹配更宽或更窄的总线。需要注意的是,主从机都无需支持空字节,所以在到达需要处理的位置之前,所有空字节都需要被删除;

  3. 数据合并、打包与宽度转换

    在设计时,数据总线被希望可以适应不同宽度的接口。这样不同接口设计的总线可以被连接,多个设备也可以接入统一接口;

    对多数应用来说,接口应该是2^N个字节的宽度,但对于协议来说,只需为整数Byte宽度即可;

    所有增大与缩小操作,都需要保留所有声明过TKEEP数据的byte;如果增大或减小操作后没有足够的宽度进行输出,可以增加额外的无TKEEP声明的位数;

    合并考虑: 合并指两个来自不同传输的两组数据合并为一个传输;在一个传输中存在可以被移除的空指针时,合并就有条件发生; 合并的规则如下:

    a: 只有具有相匹配的TID与TDEST标识符的传输可以被合并;

    b: 如果现在的传输被标注为TLAST,则其不能与后一次传输合并。也因此如果一个传输被标注为TLAST,便意味着其后没有可以合并的传输,也意味着其不应被延迟传输;

    c: 必须保持位置与数据byte的正确位置;

    d: 必须保持TLAST, TSTRB与TUSER的正确关系;

    部分合并是被允许的;

    打包考虑:打包是从数据流中删除空字节的过程,往往出现在放大、缩小与合并等操作中; 空字节无需被全部移除,所以打包前后都可能出现空字节;

    缩小考虑: 缩小用于适配更窄的端口,这个过程通常伴随着单个输入/输出变为多个输入/输出;这个比例一般是2/1,但也不一定; 缩减的规则如下:

    a: 输入输出顺序匹配;

    b: TSTRB必须使用与data相似的方法缩小,以确保位置关系不会出现错误;

    c: TLAST必须在缩减后也最后传输;

    d: 输出传输的所有TID与TDEST都必须与输入的相匹配;

    e: TUEST必须与相同字节匹配;

    #只含空字节,没有TKEEP与TLAST字节的数据流可以被阻断;

    放大考虑: 一般用于单转多。如果包含合并,放大过程将是一个很复杂的过程,因为上游难以随时确定下游数据是否来自一个paket;放大的规则如下:

    a: 输入输出顺序匹配;

    b: TSTRB必须使用与data相似的方法放大,以确保位置关系不会出现错误;

    c: TLAST必须被保留;

    d: 输出传输的所有TID与TDEST都必须与输入的相匹配;

    e: TUEST必须与相同字节匹配;

字节限制符:

在AXI-4 Stream中有两个字节限制符:

TKEEP: 一个用于显示该字节是否一定要被传输至目的地的限制符;

TSTRB: 一个用于展示相关字节是位置字节还是数据字节的限制符;

每一个字节限制符都与一个byte相关:

TKEEP[x](TSTRB[x])与TDATA[(8x+7):8x]相关;

TKEEP限定: TKEEP被约束为0时表示其为一个空字节,反之则表示其一定要被传输至目的地。一个TKEEP全部为0的传输是合法的。除非TLAST位被约束为1,否则阻断一个全部TKEEP为0的传输是合法的; 主从机都无需支持空字节,所以在到达需要处理的位置之前,所有空字节都需要被删除;

TSTRB限定: 当TSTRB被约束为1时,代表这是一个有意义的数据字节,反之则为一个无意义的位置字节。位置字节被用于在传输中确定正确的相对位置,在信息流需要在目的地位置进行部分更新时常用。由于与位置相关的数据是无效的,所以TSTRB为LOW的时候,TADTA上的数据不被传输;

在这里插入图片描述

Packet边界:

Packet的解释上面已经给过了,在将信号打包时,需要考虑的信号有: TID, TDEST, TLAST; TLAST的用法如下:

a: 当其未被声明时,表示后面还会有后续传输跟进,因此为了完成增大、缩小或合并的延迟是可接受的;

b: 当其被声明时,目标地点可以将其作为packet的边界;

c: 当其被声明时,其可以作为共享链路上进行仲裁改变的有效依据;

在用于传输时,Packet的数量与TLAST的数量必须在主服务器与从服务器上保留;

虽然有结尾包,但packet的开始边界并未被定义一般判断一个包开始传输的依据有:

  1. 复位后第一次出现TID与TDSET;
  2. 一个包结束后收到的第一个有TID与TDSET的包;

所有有相同来源与目标地址的包都具有完全相同的TID与TDSET值;

两个不同的数据包不能合并,故如果早一步的传输收到了TLAST,哪怕具有完全相同的TID与TDSET值,也不能将两个字节合并传输; 若TID与TDSET不同,则不能将两个字节合并;

传输可以声明TLAST,但不包含任何数据\位置位,以用于:

  1. 当没有多余的数据需要传输时,结束包的传输;
  2. 遍历在缓存区中存储的数据;
  3. 完成一个在等待TLAST的操作;

不包含任何数据\位置位的TLAST声明,可以与只包含任何数据\位置位的字节结合;

信源与目的地信号:

信源与目的地信号有以下几种:

TID: 对流进行标记,用于区分通过一个数据接口的多个数据流;

TDEST: 为数据流提供大致的路由信息;

具有相同的TID与TDEST的数据来自同一个流,只有来自同一个数据流的数据才能被合并;

在非TLAST边界处,不同数据流的交叉是可以被允许的;

新的TID可以被生成,用于将一个数据流分成两个;

新的TDEST可以被生成,用于为数据流指明路由信息;

任何对TID和TDEST的操作都不能用于将两个数据流合成一个;

一个常见的模型是一个链接基于数据流的TID为其分配TDEST;

时钟和复位:

Clock: 每个组件都是用一个单独的时钟信号ACLK,所有输入的采样都必须在时钟的上升沿,所有输出的变化都必须在时钟的上升沿之后;

Reset: 异步复位,同步释放,active-LOW;

在复位阶段,TVALID必须被驱动为LOW,而其他信号可以随意变化;

在ARESETn解除后的第一个时钟上升沿,TVALID可以被驱动为HIGH;

在这里插入图片描述

用户信号:

用户使用边带接口传输一些byte,packet或给予fream的信息是一种常见的用法。用户信号有多种用法,如:

  1. 标记特殊数据项的位置与类型;
  2. 提供必须与数据伴随的辅助信息,如:奇偶校验、标志位;
  3. 识别数据包的段;

用户信号的传输以字节为单位;

按照建议,信号TUSER的位数应当与TDATA信号的Byte数成整数倍关系,每个字节所对应的用户信号必须从相邻的TUSER链路打包发送; 用户信号的定义如下:

  • 假设每个数据Byte对应m位User Signal;
  • 数据线的宽度为n Bytes;
  • User Bits的总宽度就应为 m*n
  • 如果User Bits的数量小于这个值,则会将其与前几位byte的总线相对应,后面的总线的User Bits会被默认为0(非协议内容,来源互联网);

如果对应的TKEEP位为0,则TUSER位的内容也无需传输。如果对应的空字节被删除,则其TUSER位也必须删除。当空字节被插入时,对应数量的TUSER也必须被插入,后插入的TUSER应被统一置为0;

TUSER也可以直接针对整个传输进行定义,而不是只能对单个字节。当整个传输都使用相同的某项配置时,只声明该配置一次明显好于在每次传输上都进行声明;

TUSER可以被用于对整个传输进行定义,但传输机制会基于传输机制划分TRUST信息。可信的基于传输的TUSER信息只有在满足以下条件时才成立:

  1. 连接的输入与输出接口必须相互匹配;
  2. 连接处的任何数据宽度转化都不涉及拆包;

当传输经过复杂的互联时,TUSER信号有时会经过支持不同TRUST宽度的互联部分。此时便需要填充(Padding)与修剪(Trimming)TUSER信息;

修剪和填充时,是在每一bit的前一位上进行增减。要进行填充时,填入的位数必须为0;示例如下:

在这里插入图片描述
按单BIT操作的PADDING

在这里插入图片描述
按单BIT操作的TRIMMING

在这里插入图片描述
按双BIT操作的PADDING

在这里插入图片描述
按双BIT操作的TRIMMING

设置TUSER的宽度:

对于有多个主从接口参与的互联,TUSER宽度的定义为:

MIN(MAX[主机每byte对应的TUSER的最小bit数],MAXP[从机每byte对应的TUSER的最小bit数]);

任何主从机发送的数据所对应的TUSER宽度都不能小于这个值;

TUSER的使用遵循以下守则:

  1. 主机的TUSER接口比链接接口窄,则必须增加置零的TUSER位来匹配链接;
  2. 主机的TUSER接口宽于最宽的链接接口,则必须修建接口以匹配链接;
  3. 在互联中任何比下游窄的TUSER接口,都必须补零进行连接;
  4. 在互联中任何比下游最宽的接口宽的TUSER接口,都必须进行修建以匹配链接;
  5. 在到达从机端时,如果从机接口比链接中的窄,则必须进行修剪;
  6. 在到达从机端时,如果从机接口比链接中的宽,则必须置零加宽;

如果在互联中附带了通信的主从机各自的信息,则对TUSER传输还可以进行进一步的优化;

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值