基于Ultrascale+系列GTY收发器64b/66b编码方式的数据传输(一)——Async Gearbox使用及上板测试

  于20世纪80年代左右由IBM提出的传统8B/10B编码方式在编码效率上较低(仅为80%),为了提升编码效率,Dgilent Techologies公司于2000年左右提出了64b/66b编码并应用于10G以太网中。Xilinx GT手册中没有过多64b/66b编码介绍,这里本人主要参考(https://www.ieee802.org/3/10GEPON_study/public/july06/thaler_1_0706.pdf、https://grouper.ieee.org/groups/802/3/ae/public/mar00/walker_1_0300.pdf、https://www.ieee802.org/3/bn/public/mar13/hajduczenia_3bn_04_0313.pdf)三篇文献。本文对64B/66B编码方式、GTY IP核Aync Gearbox 64B/66B配置及使用方法进行介绍并进行仿真及上板测试。

64B/66B编码简介

  64B/66B仍采用突发数据传输的方式传输数据,一个完整的数据传输过程包含S(起始位)、D(数据位)、T(停止位)三种类型的字符,在空闲时刻,可以发送C / Z(控制类字符)。不同于8B/10B的是,64B/66B会对一个完整的数据流进行分割,变成几个64bit的蓝色小段。

图片

  几个蓝色小段的格式需要满足如下表格中的某一模式,64B/66B会对这些64bit的小段编码成66bit(加上2bit Sync字段)的数据。

图片

  如上图,64B/66B仍包括控制字符和数据字符两种字符,不同于8B/10B的是,数据传输的起始停止控制字符通过块类型字段隐形确定其类型及位置。其中起始控制字符只有位与第0字节和第5字节两种情况。

  完整的控制字符列表如下,其中不同协议所规定的控制字符标识有所不同,本文使用XGMII协议的控制字符:

图片

字节对齐(帧同步算法): 8B/10B的字节对齐通过划窗检测逗号K码进行,64B/66B的字节对齐方式与之类似,通过划窗检测有效Sync header同步头进行,有效同步头仅包含01和10两种类型,当识别到11或00无效同步头后,划窗进行下次判定。

  • 在连续识别到64个有效同步头后,确定帧同步完成,字节对齐

  • 在64个同步头中识别到16个无效同步头后,确定帧同步失效,重新进行同步

  • 在125us中出现任意16个错误后,认为帧同步无法实现,禁止帧同步。

图片

图片

防止字节对齐误判: 当TX发送的66bit报文过于特殊时,如{{8’h01, 8’h02, 8’h03, 8’h04, 8’h05, 8’h06, 8’h07, 8’h78, {8’h08, 8’h09, 8’h0a, 8’h0b, 8’h0c, 8’h0d, 8’h0e, 8’hff}},64B/66B字节对齐可能会出现在数据中位置,如下图所示,此时检测的同步始终为01和10,但得到的同步后的数据是错误的。

图片

  幸运的是,64/66bit报文通常需要进行加扰解扰操作(Scramble/Descramble),即在发送的数据中添加白噪声,当接收后去掉白噪声得到原始数据。

** 64B/66B加扰解扰:** 64B/66B加扰解扰的表达式为 X58 + X19 + 1 = 0,其具体实现方式可参考Xilinx GT示例工程。

图片

GTY的64B/66B配置方式

  对于64B/66B编码,GTY支持采用Async Gearbox和Sync Gearbox两种方式,两种方式的区别在于异步变速箱提供的用户时钟能够完美匹配64B的发送速率,不会出现每隔一段时间停发一次数据的情况,本文采用Async Gearbox方式进行实现。此外,由于64B/66B对64B数据进行编码,因此本文选择使用64bit的用户数据位宽。

图片

  64B/66B的字节对齐由用户逻辑进行判断,因此无法选择。在其他配置上,本文使用的配置与8B/10B配置相同,如仍选用QSFP1所在GT。

GTY 64B/66B的使用方法:

发送模块

  发送主要包含txheader_in_r、txsequence_in_r、gtwiz_userdata_tx_in_r三个信号,txheader_in_r用于填入同步头,gtwiz_userdata_tx_in_r用于填入待传输块数据,txsequence_in_r用于填入一个累加计数器,TX Async Gearbox相同于一个66bit转64bit的异步FIFO,txsequence_in_r用于TX Async Gearbox FIFO的写入数据计数。

  发送一个14字节数据包的代码如下:

    enum logic [3:0] {TX_RESET,TX_IDLE,TX_SEND_MIX_DATA,TX_SEND_DATA} tx_fsm_r, tx_fsm_s;always_comb begincase (tx_fsm_r)TX_RESET: beginif (gtwiz_reset_tx_done_out) begintx_fsm_s = TX_IDLE;end else begintx_fsm_s = TX_RESET;endendTX_IDLE: begintx_fsm_s = TX_SEND_MIX_DATA;endTX_SEND_MIX_DATA: begintx_fsm_s = TX_SEND_DATA;endTX_SEND_DATA: begintx_fsm_s = TX_IDLE;enddefault: tx_fsm_s = TX_RESET;endcaseendalways_ff @(posedge gtwiz_userclk_tx_usrclk2_out) begincase (tx_fsm_s)TX_RESET: begintxheader_in_r <= 6'b0;gtwiz_userdata_tx_in_r <= 64'h0;endTX_IDLE: begin // C0C1C2C3/C4C5C6C7txheader_in_r[1:0] <= 2'b10;gtwiz_userdata_tx_in_r[63:0] <= {{7{XGMII_IDLE}}, 8'h1e};endTX_SEND_MIX_DATA: begin // S0D1D2D3/D4D5D6D7txheader_in_r[1:0] <= 2'b10;gtwiz_userdata_tx_in_r[63:0] <= {8'h01, 8'h02, 8'h03, 8'h04, 8'h05, 8'h06, 8'h07, 8'h78};  endTX_SEND_DATA: begin // D0D1D2D3/D4D5D6T7txheader_in_r[1:0] <= 2'b10;gtwiz_userdata_tx_in_r[63:0] <= {8'h08, 8'h09, 8'h0a, 8'h0b, 8'h0c, 8'h0d, 8'h0e, 8'hff};  endendcaseend

接收同步模块

  接收同步模块按照前文所说同步算法进行实现,包含SYNC_OUT未同步和SYNC_IN同步完成两个状态。主要利用rxgearboxslip_in进行单比特划窗,以及rxheader_out检测同步头。

    enum logic [3:0] {RX_SYNC_RESET,RX_SYNC_OUT,RX_SYNC_IN} rx_sync_fsm_r, rx_sync_fsm_s;always_comb begincase (rx_sync_fsm_r)RX_SYNC_RESET: beginif (gtwiz_reset_rx_done_out) beginrx_sync_fsm_s = RX_SYNC_OUT;end else beginrx_sync_fsm_s = RX_SYNC_RESET;endendRX_SYNC_OUT: begin if (rxheadervalid_out & ^rxheader_out[1:0] && valid_sync_headers_cnt_r == 6'd63) beginrx_sync_fsm_s = RX_SYNC_IN;end else beginrx_sync_fsm_s = RX_SYNC_OUT;endendRX_SYNC_IN: beginif (rxheadervalid_out & ~(^rxheader_out[1:0]) && invalid_sync_headers_cnt_r == 5'rx_sync_fsm_s = RX_SYNC_OUT;end else beginrx_sync_fsm_s = RX_SYNC_IN;endenddefault: rx_sync_fsm_s = RX_SYNC_RESET;endcaseendalways_ff @(posedge gtwiz_userclk_rx_usrclk2_out) begincase (rx_sync_fsm_s)RX_SYNC_RESET: beginvalid_sync_headers_cnt_r <= 6'd0;invalid_sync_headers_cnt_r <= 4'd0;headers_cnt_r <= 6'd0;rxgearboxslip_in <= 1'b0;endRX_SYNC_OUT: beginif (rxheadervalid_out) beginif (^rxheader_out[1:0]) beginvalid_sync_headers_cnt_r <= valid_sync_headers_cnt_r + 6'd1;end else beginvalid_sync_headers_cnt_r <= 6'd0;headers_cnt_r <= headers_cnt_r + 6'd1;endendif (rxheadervalid_out && headers_cnt_r == 6'd63) beginrxgearboxslip_in <= 1'b1;end else beginrxgearboxslip_in <= 1'b0;endendRX_SYNC_IN: beginvalid_sync_headers_cnt_r <= 6'd0;if (rxheadervalid_out) beginif (~(^rxheader_out[1:0])) begininvalid_sync_headers_cnt_r <= invalid_sync_headers_cnt_r + 6'd1;end else if (headers_cnt_r == 6'd63) begininvalid_sync_headers_cnt_r <= 6'd0;endheaders_cnt_r <= headers_cnt_r + 6'd1; endrxgearboxslip_in <= 1'b0;endendcaseend

接收模块

  接收同步模块输出采用AXI-Stream接口,主要根据rxheader_out_r、gtwiz_userdata_rx_out_r[7:0]进行查表,得出tkeep、tstrb、tlast、tvalid、tdata的相应值。

    enum logic [3:0] {RX_RESET,RX_RECV} rx_fsm_r, rx_fsm_s;always_comb begincase (rx_fsm_r)RX_RESET: beginif (rx_reset_flag_rr) beginrx_fsm_s = RX_RESET;end else beginrx_fsm_s = RX_RECV;endendRX_RECV: begin rx_fsm_s = RX_RECV;enddefault: rx_fsm_s = RX_RESET;endcaseend(* MARK_DEBUG= "true" *) logic [63:0] rx_data;(* MARK_DEBUG= "true" *) logic [7:0]  rx_keep;(* MARK_DEBUG= "true" *) logic [7:0]  rx_strb;(* MARK_DEBUG= "true" *) logic        rx_valid;(* MARK_DEBUG= "true" *) logic        rx_last;always_ff @(posedge gtwiz_userclk_rx_usrclk2_out) begincase (rx_fsm_s)RX_RESET: beginrx_data <= 64'h0;rx_keep <= 8'h0;rx_strb <= 8'h0;rx_valid <= 1'b0;rx_last <= 1'b0;endRX_RECV: beginif (rxheader_out_r[1:0] == 2'b10) begincase (gtwiz_userdata_rx_out_r[7:0])8'h78: begin            // S0D1D2D3/D4D5D6D7rx_valid <= 1'b1;rx_data <= {gtwiz_userdata_rx_out_r[63:8], 8'h0};rx_keep <= 8'hff;rx_strb <= 8'hfe;rx_last <= 1'b0;end8'hff: begin            // D0D1D2D3/D4D5D6T7rx_data <= {8'h0, gtwiz_userdata_rx_out_r[63:8]};rx_keep <= 8'hff;rx_strb <= 8'h7f;rx_last <= 1'b1;end8'h1e: beginrx_valid <= 1'b0;endendcaseend else if (rxheader_out_r[1:0] == 2'b01) beginrx_data <= gtwiz_userdata_rx_out_r[63:0];rx_keep <= 8'hff;rx_strb <= 8'hff;rx_last <= 1'b0;endendendcaseend

仿真测试

图片

上板测试

图片

完整代码

  完整代码可于同名公众号回复GTY_64B66B_SIMPLE下载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

绝地求生:PUBG地形破坏功能上线!分享你的游玩感受及反馈赢丰厚奖励

随着29.1版本更新&#xff0c;地形破坏功能及新道具“镐”正式在荣都地图亮相&#xff01;大家现在可以在荣都地图体验“动手挖呀挖”啦。 快来分享你的游玩感受及反馈&#xff0c;即可参与活动赢取精美奖励&#xff01; 参与方式 以发帖/投稿的形式&#xff0c;在 #一决镐下#…

【记录】Python|Selenium 下载 PDF 不预览不弹窗(2024年)

版本&#xff1a; Chrome 124Python 12Selenium 4.19.0 版本与我有差异不要紧&#xff0c;只要别差异太大比如 Chrome 用 57 之前的版本了&#xff0c;就可以看本文。 如果你从前完全没使用过、没安装过Selenium&#xff0c;可以参考这篇博客《【记录】Python3&#xff5c;Sele…

有用的网址分类

网址分类 Pythonplotninematplotlibnumpyscipypandas 人工智能opencvkeras 工具网站电子工具 Python plotnine plotnine matplotlib matplotlib官网 numpy numpy官网 scipy scipy官网 pandas pandas官网 人工智能 opencv keras 工具网站 电子工具 半导小芯

kafka---topic详解

一、分区与高可用 在Kafka中,事件(events 事件即消息)是以topic的形式进行组织的;同时topic是分区(partitioned)的,这意味着一个topic分布在Kafka broker上的多个“存储桶”(buckets)上。这种数据的分布式放置对于可伸缩性非常重要,因为它允许客户端应用程序同时从多个…

Stable Diffusion WebUI 控制网络 ControlNet 插件实现精准控图-详细教程

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ 本文主要介绍 Stable Diffusion WebUI 一个比较重要的插件 ControlNet&#xff08;控制网络&#xff09;&#xff0c;主…

前端遇到的问题

1.window.οnlοadfunction(){} 和 $(function(){}); window.onload是js原生事件&#xff1b; $(function(){})是JQuery的方法&#xff1b; 实例&#xff1a;jsp中的元素 $ {html}是通过VelocityEngine生成的html元素 <% page contentType"text/html;charsetUTF-8&qu…

PHP货运搬家/拉货小程序二开源码搭建的功能

运搬家/拉货小程序的二次开发可以添加许多功能&#xff0c;以增强用户体验和提高业务效率。以下是一些可能的功能&#xff1a; 用户端功能&#xff1a; 注册登录&#xff1a;允许用户创建个人账户并登录以使用应用程序。货物发布&#xff1a;允许用户发布他们需要搬运的货物信息…

HTML转EXE 各平台版本(Windows, IOS, Android)

前言&#xff1a; 在几年前&#xff0c;我在盒子论坛中看到有人提供了一个将HTML打包成EXE文件的程序的软件&#xff0c;好像是外国人做的&#xff0c;该软件是收费的。当时我在想&#xff0c;这个功能不是很难实现呀&#xff0c;于是我就有了开发一个HTML转EXE的工具想法&…

python如何写一个将保存数据和读取数据程序合并

在python中如果要保存数据和读取数据&#xff0c;需要分别编写程序&#xff0c;如果要合并起来执行&#xff0c;如果输入的数据没有保存&#xff0c;就保存&#xff0c;如果输入的数据已经保存&#xff0c;就读取保存的内容 思路如下 分别引用path库和json库 首先创立一个js…

数据可视化-ECharts Html项目实战(13)

在之前的文章中&#xff0c;我们深入学习ECharts动态主题切换和自定义ECharts主题。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECharts Html项…

写后端项目的分页查询时,解决分页不更新

写基于VueSpringBoot项目&#xff0c;实现分页查询功能时&#xff0c;改完代码后&#xff0c;发现页数不更新&#xff1a; 更改处如下&#xff1a; 显示如图&#xff1a; 发现页数没有变化&#xff0c;两条数据还是显示在同一页&#xff0c;而且每页都10条。且重启项目也没有更…

零基础小白,如何入门计算机视觉?

目录 前言 计算机视觉技术学习路线 基础知识 1. 数学基础 2. 编程基础 3. 图像处理基础 基础算法与技术 1. 特征提取与描述符 2. 图像分割与对象检测 3. 三维重建与立体视觉 机器学习与深度学习 1. 机器学习基础 2. 深度学习 高级主题与应用 1. 高级机器学习与深度学习 2. 计算…

基于双向长短期神经网络BILSTM的收盘预测,基于gru神经网络的收盘预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络BILSTM的收盘预测,基于gru神经网络的收盘预测 完整代码:基于双向长短期神经网络BILSTM的收盘预测,基于gru神经网络的收盘预测(代码完整,数据齐全)资源-CSDN文库 https://download.cs…

论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?

iclr 2024 reviewer 评分 6668 1 intro 大型语言模型&#xff08;LLMs&#xff09;已显示出在上下文中学习的能力 给定几个带注释的示例作为演示&#xff0c;LLMs 能够为新的测试输入生成输出然而&#xff0c;现行的上下文学习&#xff08;ICL&#xff09;范式仍存在以下明显…

简述PDF原理和实践

Hello&#xff0c;我是小恒不会java。 由于最近有输出PDF报表的项目需求&#xff0c;所以复习一下PDF到底是什么&#xff0c;该如何产生&#xff0c;如何应用至项目中。 更多参见Adobe官方文档&#xff08;https://www.adobe.com/cn/&#xff09; PDF原理 PDF&#xff08;Port…

机器学习实验二-----决策树构建

决策树是机器学习中一种基本的分类和回归算法&#xff0c;是依托于策略抉择而建立起来的树。本文学习的是决策树的分类 1. 构建决策树流程 选择算法&#xff1a;常用的算法包括ID3、C4.5、CART等。 划分节点&#xff1a;根据数据特征和算法选择&#xff0c;递归地划分节点&…

亚信安全数据安全运营平台DSOP新版本发布 注入AI研判升维

在当今快速发展的数字经济时代&#xff0c;企业对于数据的依赖日益加深&#xff0c;数据安全已成为企业的生命线。亚信安全推出数据安全运营平台DSOP全新版本&#xff0c;正是为满足企业对数据安全的高度需求而设计。这款平台以其卓越的能力和技术优势&#xff0c;为企业的数据…

【达梦数据库--无效的列】

【需求】 MySQL需要替换成达梦数据库 【问题】 在适配过程中查询、更新、删除都没有问题&#xff0c;只有在insert时会报错&#xff0c;显示无效的列 【解决】 1.先根据日志&#xff0c;将执行的sql去达梦执行无报错&#xff0c;排除列及类型错误 2.数据库表均是大写&#xf…

漂亮的七彩引导页导航HTML源码

源码介绍 漂亮的七彩引导页导航HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 漂亮的七彩…

ceph large omap objects

问题 出现下面告警信息 ceph -scluster:id: xxxxxxxxxxxxxxxxxxxxxxxhealth: HEALTH_WARN7 large omap objects获取问题 pool # ceph health detail HEALTH_WARN 7 large omap objects; 4 clients failing to respond to cache pressure [WRN] LARGE_OMAP_OBJECTS: 7 larg…