当我们去看有关高速串行总线与并行总线相比较的优点,会发现有这么一条描述,说串行总线能实现分割式数据传输,所有的串行总线都使用包括包和分割式数据传输协议进行数据传输。串行总线有包的概念,包可以有包界定符号,包起始控制符,包结束控制符以及中间的数据信息,CRC校验信息等。

这篇博文,我们就通过仿真来理解下这句话的含义,看看我们是如何发送数据以及如何接收到数据的。

这里稍微偏题,总结下串行总线相较于并行总线的好处:

占用引脚数量少;

TX以及RX信号线上采用差分信号传输方式,这种传输方式具有很高的抗噪声能力;

强错误检测能力,串行协议使用了基于包的数据传输方式并带有CRC校验,接收设备能检测出接收数据包中的错误并通知发送端出现了传输错误,发送端可以重新发送出现错误的包;

全双工数据和控制流等。

好了,下面进入正题,我们的仿真程序使用了Vivado提供的例子程序:

新建工程,建立IP核,之后打开例子程序就好了:

具体见博文:Xilinx RapidIO核例子工程源码分析

可以看看仿真程序的结构:

一个primary,一个mirror,二者之间的关系就是primary发送数据,mirror接收数据,反之也成立。

二者程序都是例化了设计程序,所以内容一致,只不过一个是请求方一个是响应方而已。如下图:

我的IP核采用的是X1模式,也就是只有一对差分发送和接收线TX0_N, TX0_P, RX0_N, RX0_P。

下面是SRIO核的接口示意图:

可以看到,SRIO核协议可以分为三层,逻辑成LOG,传输层Buffer,以及物理层(PHY),数据从物理层出来就到了串行收发器,串行发送数据,或者数据从串行收发器接收串行数据,之后到达物理层,传输层以及逻辑层,用户能够操纵的是逻辑层的数据,我们对用户接口进行操作得到我们需要的数据(解析)。

逻辑层的包采用HELLO格式,关于这个格式可以看博文:【FPGA】SRIO中的关键问题总结(一)SRIO中的关键数据包格式总结

这种格式把包的包头进行标准化,而且把包头和数据在接口上分开传输,这将简化控制逻辑并且允许数据与发送边界对齐,有助于数据管理。

如下图:

下面是携带有数据负载的HELLO格式包在用户接口上传输的时序图,这个时序图传输了4个64位数据,也就是4个双字,加上包头,传输需要5个时钟周期。

当然,也并非必须携带数据负载,并且传输也可以等待,如下:

首先,有两个背靠背(back-to-back)单周期包(包不带数据负载,仅包含一个包头)。包的边界通过拉高tlast信号进行指示。在单周期包传输完毕以后,主机等待了一个时钟周期才开始发送下一个包。在发送第三个包的过程中,主机(Master)和从机(Slave)分别通过拉低tvalid和tready信号一个时钟周期来暂停数据的发送,由于第三个包的数据负载为2个双字,所以传输第三个包一共消耗了3个有效时钟,加上2个无效的时钟周期,一共消耗了5个时钟周期。

数据在逻辑层上传输后到达传输层,组装其他信息得到一个传输层的包,之后在传输到物理层,再次组装并添加信息层位物理层的包,这个包是最终的包,最终到达串行收发器发送出去,最终的包的格式如下:

可见,这里的包包括了各个层的信息。

当然发送出去的也并非都是数据包,也有控制符号包,如下为控制符号包格式:

控制符号通常用于充当包的起始标志,或结束标志,成为包起始控制符号以及包结束控制符号。

具体参看:【FPGA】SRIO中的关键问题总结(一)SRIO中的关键数据包格式总结

这点我们可以通过下面的仿真来理解。

先观察几个关键信号的波形,例如port_initialized和link_initialized,它们有效则表示端口和链路初始化成功。

之后观察发送的第一个发送的事物SWRITE:

localparam [64*37-1:0] swrite_instruction = {// RSVD,   FTYPE, TTYPE,  ADDRESS,       SIZE// SWRITEs{12'h000, SWRITE, 4'h0,   36'h000000777, 8'd0},  {12'h000, SWRITE, 4'h0,   36'h000008806, 8'd0},  {12'h000, SWRITE, 4'h0,   36'h000000125, 8'd0},  {12'h000, SWRITE, 4'h0,   36'h000000124, 8'd0},  {12'h000, SWRITE, 4'h0,   36'h000000123, 8'd0},  {12'h000, SWRITE, 4'h0,   36'h000000122, 8'd0},  {12'h000, SWRITE, 4'h0,   36'h000000121, 8'd0},  {12'h000, SWRITE, 4'h0,   36'h000000120, 8'd0},  {12'h000, SWRITE, 4'h0,   36'h000000126, 8'd1},  {12'h000, SWRITE, 4'h0,   36'h000000124, 8'd1},  {12'h000, SWRITE, 4'h0,   36'h000000122, 8'd1},  {12'h000, SWRITE, 4'h0,   36'h000004350, 8'd1},  {12'h000, SWRITE, 4'h0,   36'h000004355, 8'd2},  {12'h000, SWRITE, 4'h0,   36'h000012300, 8'd2},  {12'h000, SWRITE, 4'h0,   36'h000012304, 8'd3},  {12'h000, SWRITE, 4'h0,   36'h000345000, 8'd3},  {12'h000, SWRITE, 4'h0,   36'h000345003, 8'd4},  {12'h000, SWRITE, 4'h0,   36'h004550000, 8'd4},  {12'h000, SWRITE, 4'h0,   36'h004550002, 8'd5},  {12'h000, SWRITE, 4'h0,   36'h198877600, 8'd5},  {12'h000, SWRITE, 4'h0,   36'h198877601, 8'd6},  {12'h000, SWRITE, 4'h0,   36'h2ABBCCDD8, 8'd6},  {12'h000, SWRITE, 4'h0,   36'h2ABBCCDD8, 8'd7},  {12'h000, SWRITE, 4'h0,   36'h2ABBCCDD8, 8'd15}, {12'h000, SWRITE, 4'h0,   36'h2ABBCCDD8, 8'd31}, {12'h000, SWRITE, 4'h0,   36'h120000600, 8'd63}, {12'h000, SWRITE, 4'h0,   36'h230000600, 8'd95}, {12'h000, SWRITE, 4'h0,   36'h340000600, 8'd127},{12'h000, SWRITE, 4'h0,   36'h450000600, 8'd255},{12'h000, SWRITE, 4'h0,   36'h560000600, 8'd15}, {12'h000, SWRITE, 4'h0,   36'h670000600, 8'd31}, {12'h000, SWRITE, 4'h0,   36'h780000600, 8'd63}, {12'h000, SWRITE, 4'h0,   36'h780000600, 8'd95}, {12'h000, SWRITE, 4'h0,   36'h890000600, 8'd127},{12'h000, SWRITE, 4'h0,   36'h9A0000600, 8'd255},{12'h000, SWRITE, 4'h0,   36'hAB0000600, 8'd15}, {12'h000, SWRITE, 4'h0,   36'hCD0000600, 8'd15}}; 

下面以上图第50行的SWRITE事务为例来说明整个SWRITE事务的传输过程。这个事务表示的是利用SWRITE事务往地址36’hCD0000600发送16个字节的数据。

由于是一个请求事物,找到ireq开头的波形,如下图:

可以看上述波形中的tvalid,tready,tdata以及tlast可以清楚的看出传输的数据,这个波形和下面的传输时序图一致:

由于仅当tvalid和tready同时为高时,tdata上的数据才为有效数据,所以这个SWRITE一共消耗了三个有效时钟周期,其中第一个时钟周期发送的是HELLO包头,后面两个时钟周期分别发送8个字节的数据(第一个时钟发送的数据是0000000000000000,第二个时钟发送的数据是0101010101010101),一共16个字节的数据,和instruction_list.vh中第50行定义完全一致,整个时序也与HELLO格式的时序完全吻合。

对照HELLO格式解析包头。包头为006020fcd0000600,转化为二进制后与HELLO格式各个字段对应关系如下所示:

由上图可知FTYPE字段的值为6,表明确实是一个SWRITE事务。

SWRITE事务通道ireq通道(接口1)传输给SRIO核以后进入SRIO的逻辑层,逻辑层会给包添加传输层的信息发送给Buffer(接口3),然后Buffer会把数据发送给物理层(接口5),之后在发到SRIO串行收发器,这里直接看看观察SRIO收发器的数据通道gttx_data[31:0]:

7c96f004中的7c是特殊字符/K28.3/,它是一个包界定符(Packet Deliminator Control Symbol),968012是一个包起始控制符,968215是一个包结束控制符号。二者之间是包的内容:

b04600ad_d0000600_00000000_00000000_01010101_01010101_e8d30000是SWRITE事务串行物理层的包,把它转化为二进制后各个字段的对应关系如下图所示

上图中data字段是传输的00000000_00000000_01010101_01010101这16个字节数据的二进制码,因为它的二进制码太长了所以我直接用data替代。由于本次传输的字节小于80个字节,所以SWRITE事务的最后面的三个字段不存在,大家可以抓一下数据量为256个字节的SWRITE包,当数据量大于了80字节,后面的三个字段也会有数据。

这只是SWRITE事物中一个包而已,其他包类似分析。

参考:

【SRIO】6、Xilinx RapidIO核仿真与包时序分析

pg007

【FPGA】SRIO例子程序仿真分析实践相关推荐

  1. javafx11 最佳实践_JavaFX移动应用程序最佳实践,第1部分

    javafx11 最佳实践 到现在为止,所有对JavaFX感兴趣的人都会知道,JavaFX Mobile发行了不久 前. 可以肯定的是,这真是令人难以置信. 我感到非常筋疲力尽,在发行期间我什至没有精 ...

  2. JavaFX移动应用程序最佳实践,第1部分

    到现在为止,所有对JavaFX感兴趣的人都会知道,JavaFX Mobile发行了不久 前. 可以肯定的是,这真是令人难以置信. 我感到筋疲力尽,在发行期间我什至没有精力去写博客-- 但是到目前为止, ...

  3. 2018-2019-2学号20189220余超《移动平台应用程序开发实践》课程总结

    2018-2019-2学号20189220余超<移动平台应用程序开发实践>课程总结 第一周作业:简要学习java语言的基本语法结构.java语言的特点.环境等.循环语句. 第二周作业:对象 ...

  4. 【Vuforia AR Unity 2018.3.12f1】MikuAR安卓程序开发实践(三)代码终结篇_2019.4.24

    Unity平台 + Vuforia SDK实现的AR程序开发 模型的三大操作(平移 旋转 缩放)代码 一.平移 二.旋转缩放 三.操作代码解析 模型的选定(射线法) 食用方法 自发光组件 食用方法 V ...

  5. 新闻资讯小程序开发实践

    新闻资讯小程序开发实践 在腾讯小程序上线一周年之际,公司又决定把App产品部分内容在小程序上实现.就在小程序刚上线的时候,公司也有一款产品进行了小程序的研发,但后续没有持续的维护.这过了一年的时间,微 ...

  6. 腾讯在线教育小程序开发实践之路

    前言: 小程序是一种新的开放能力, 开发者可以快速地开发一个小程序,便可以在微信内被便捷得获取和传播,同时具有出色的使用体验.随着近两年来小程序风口的爆发,越来越多的开发者.企业开始接入小程序,那么在 ...

  7. javafx11 最佳实践_JavaFX移动应用程序最佳实践,第2部分

    javafx11 最佳实践 警告:我在这里给出的提示适用于JavaFX Mobile的当前版本,该版本是JavaFX 1.1 SDK的一部分. 在将来的版本中,行为将发生变化,上述工件的当前不良性能将 ...

  8. JavaFX移动应用程序最佳实践,第2部分

    警告:我在这里给出的技巧对于JavaFX Mobile的当前版本是正确的,该版本是JavaFX 1.1 SDK的一部分. 在将来的版本中,行为将改变,上述工件的当前不良性能将被优化或至少得到显着改善. ...

  9. ext js如何动态更改xtype_K8S ConfigMap 用于动态应用程序的实践

    编辑:小君君 技术校对:星空下的文仔.bot 在 Kubernetes 中,ConfigMap 是允许管理员将配置组件与镜像内容解耦,使容器化应用程序产生可移植性的一种资源.ConfigMap 可以与 ...

最新文章

  1. JSP/SERVLET(6)——Jquery EasyUI 选项卡Tabs的使用方法
  2. python 串口_Python串口操作库pyserial(1)
  3. python 下载文件-Python实现HTTP协议下的文件下载方法总结
  4. 贪心 FZU 2013 A short problem
  5. Windows API串口编程
  6. 【BZOJ2115】Xor(线性基---求无向图1-n路径上最大的边权异或值--可出现环)
  7. Silverlight 下载
  8. 生存分析第四课:Cox Proportional hazards model
  9. angular里的filter过滤数据传参
  10. MAC系统重置root密码
  11. python发微信工资条_使用python自动发放员工工资条到个人邮箱
  12. CentOS7 或 Ubuntu20.04、22.04 安装最新版 Podman-4.1.1,离线安装请移步到连接
  13. 网易我的世界服务器光影文件夹在哪,我的世界光影设置在哪
  14. Java书签 #MyBatis之setMapperLocations配置多个mapper路径的两种方法详解
  15. 针对好玩游戏物品清单
  16. [bzoj4722]由乃
  17. ShareSDK移动APP社会化分享组件
  18. bq30z55调试常见故障排除
  19. 利用ArcGIS制作圈层分布图(以某一点作为中心)
  20. 质量管理体系之测试质量

热门文章

  1. 读书笔记之:Boost程序库完全开发指南(Ch1-4)
  2. dell笔记本电脑驱动_戴尔Dell电脑u盘启动盘重装win10系统步骤
  3. centos下面安装mysql_centos下安装mysql
  4. linux查看CPU利用率与负载,Linux CPU负载利用率统计
  5. 计算机起源于发展论文,关于计算机起源及发展的论文1500字左右,论文形式.
  6. arcgis 经纬度转大地坐标_土地报备坐标txt(坐标交换数据)转shp遇到的坑及其Python(ArcPy/ArcGIS)实现...
  7. 测试一款CSDN免费下载软件
  8. 第十六届智能车竞赛浙江赛区比赛胜利结束
  9. 电机贴上锡纸到底有没有作用?
  10. 百度线下赛道报名通知!