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

  基于Ultrascale+系列GTY收发器64b/66b编码方式的数据传输(一)——Async Gearbox使用及上板测试 一文介绍了64B/66B编码方式及如何使用GTY IP核提供的Async Gearbox进行64B/66B数据传输,由于Async Gearbox方式下无法使用buffer bypass方式提供的低延时,因此本文介绍另一种64B/66B实现方式Sync Gearbox的使用方法。

Sync Gearbox原理

  Sync Gearbox相当于一个不同位宽的同步FIFO,TX端的Sync Gearbox用于将输入的66bit数据(2bit同步头+64bit数据(TX_DATA_WIDTH))转换为64bit位宽(TX_INT_DATAWIDTH)的输出数据。为了带宽匹配,每输入32个周期的66bit到Sync Gearbox,都需要33个周期通过64bit从Sync Gearbox输出。因此Sync Gearbox每隔33个周期都会有一个周期不存储输入的数据。

图片

  同样的,在RX端的Sync Gearbox用于将输入的64bit位宽(RX_INT_DATAWIDTH)转换为66bit数据(2bit同步头+64bit数据(RX_DATA_WIDTH))的输出数据,为了带宽匹配,每输入33个周期的64bit到Sync Gearbox,都需要32个周期通过66bit从Sync Gearbox输出。因此Sync Gearbox每隔33个周期都会有一个周期不输出有效的数据。

图片

  在具体实现上,Sync Gearbox的输入及输出位宽存在多种选择,不同方式在相隔多少个周期停顿一个周期、以及每隔多少周期向FIFO/从FIFO中读取一个数据两个方面存在区别。以外部数据位宽与内部数据位宽均为64情况为例,发送数据每两个TXDEQUENCE时钟周期变化一次,每发送32个数据后都需要暂停一次发送新的数据。

图片

GTY IP核配置

  GTY的配置方式与Async Gearbox类似,这里为了便于逻辑实现,采用外部数据位宽为64,内部数据位宽为32的方式。

图片

代码编写

发送部分

  发送主要用到txheader_in_r、txsequence_in_r、gtwiz_userdata_tx_in_r三个变量,不同点在于txheader_in_r需要在txsequence_in_r计数到32时的数据无效,即令TX发送端不认为txheader_in_r此时发送了数据。

    assign txsend_stop_s = (&txsequence_in_r[4:0]) == 1'b1 ? 1'b1 : 1'b0; // 31always_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: beginif (txsend_stop_s) begintx_fsm_s = TX_IDLE;end else begintx_fsm_s = TX_SEND_MIX_DATA;endendTX_SEND_MIX_DATA: beginif (txsend_stop_s) begintx_fsm_s = TX_SEND_MIX_DATA;end else begintx_fsm_s = TX_SEND_DATA;endendTX_SEND_DATA: beginif (txsend_stop_s) begintx_fsm_s = TX_SEND_DATA;end else begintx_fsm_s = TX_IDLE;endenddefault: tx_fsm_s = TX_RESET;endcaseendalways_ff @(posedge gtwiz_userclk_tx_usrclk2_out) begincase (tx_fsm_s)TX_RESET: begintxsequence_in <= 7'b0;txsequence_in_r <= 7'b0;enddefault: begintxsequence_in <= txsequence_in_r;txsequence_in_r[6:6]  <= 1'b0;if (txsequence_in_r[5] == 1'b1) begintxsequence_in_r[5:0] <= 6'd0;end else begintxsequence_in_r[5:0]  <= txsequence_in_r[5:0] + 'd1;endendendcaseendalways_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: begintxheader_in_r[1:0] <= 2'b10;gtwiz_userdata_tx_in_r[63:0] <= {{7{XGMII_IDLE}}, 8'h1e};endTX_SEND_MIX_DATA: begintxheader_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: begintxheader_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};  endendcaseendalways_ff @(posedge gtwiz_userclk_tx_usrclk2_out) beginif (~txsend_stop_s) begintxheader_in <= txheader_in_r;endend

接收部分

  接收主要用到rxgearboxslip_in、rxdatavalid_out、rxheader_out、rxheadervalid_out,其中rxdatavalid_out与rxheadervalid_out为不同于Async Gearbox的信号,他们用于指示fifo是否读空,即此时输出的数据要当做无效数据处理。

  帧同步过程与接收部分与Async Gearbox时用到的方法类似,只是需要在header_valid为无效状态时暂停同步相关计数器计数。

    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;endcaseendalways_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 (rxheadervalid_out[0]) 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;endend else beginrx_keep <= 8'h00;rx_strb <= 8'h00;endendendcaseend

仿真结果

图片

上板测试

图片

完整代码

  本文所涉及代码可于同名公众号回复GTY_64B66B_SYNC获取。

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

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

相关文章

阿里云服务器上配置Docker 以及常用命令讲解

目录 一、认识docer二、在阿里云服务器上配置Docker三、底层原理4、常用命令&#xff08;1&#xff09;Docker中常见镜像命令&#xff08;2&#xff09;Docker中常见容器命令&#xff08;3&#xff09;日志查看命令&#xff08;4&#xff09;进入容器的命令与拷贝命令 一、认识…

【三维Dvhop定位】基于麻雀搜索算法的多通信半径和跳距加权的三维Dvhop定位算法【Matlab代码#81】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. Dvhop定位算法2. 麻雀搜索算法3. 多通信半径和跳距加权策略3.1 多通信半径策略3.2 跳距加权策略 4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文…

网络爬虫软件学习

1 什么是爬虫软件 爬虫软件&#xff0c;也称为网络爬虫或网络蜘蛛&#xff0c;是一种自动抓取万维网信息的程序或脚本。它基于一定的规则&#xff0c;自动地访问网页并抓取需要的信息。爬虫软件可以应用于大规模数据采集和分析&#xff0c;广泛应用于舆情监测、品牌竞争分析、…

函数 基础知识

本笔记为观看 50 函数-函数的定义_哔哩哔哩_bilibili的学习笔记 1 函数概述 作用:将一段经常使用的代码封装起来&#xff0c;减少重复代码一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个块实现特定的功能。 2 函数的定义 eg: int max(int a,int b); {retu…

CSS:filter(滤镜)属性

用途 可以用于img标签&#xff0c;div标签等 图像&#xff0c;背景&#xff0c;边框的调整 常用属性 1. 灰度 grayscale()&#xff0c;默认是0&#xff0c;100%就是黑白 2. blux 给图像设置高斯模糊的程度&#xff0c;radius值设定高斯模糊的程序&#xff0c;表示像素点…

Eureka基础介绍和使用

目录 一.理论基础 二.父项目 2.1 新建父项目 2.2 管理依赖 三.子项目 3.1 新建子项目 3.2 注册中心Server依赖和启动类和配置文件 3.3 生产者Client 依赖和启动类和配置文件 3.5 消费者Custmer依赖和配置类、启动类和配置文件 四.心跳 五.公共资源项目 5.1新建实体…

【Qt】Qt Hello World 程序

文章目录 1、Qt Hello World 程序1.1 使用按钮实现1.1.1 使用可视化方式实现 1.1.2 纯代码方式实现 label创建堆&#xff08;内存泄漏&#xff09;或者栈问题Qt基础类&#xff08;Qstring、Qvector、Qlist&#xff09;乱码问题零散知识 1、Qt Hello World 程序 1.1 使用按钮实…

【任务调度】Apache DolphinScheduler快速入门

Apache DolphinScheduler基本概念 概念&#xff1a;分布式、去中心化、易扩展的可视化DAG工作流任务调度系统。 作用&#xff1a;解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。Apache DolphinScheduler是一款开源的调度工具&#xff…

android远程更新下载apk

最近业务有涉及到&#xff0c;奈何是个app代码小白&#xff0c;遂记录一下 一&#xff1a;AndroidManifest.xml文件配置 application标签里面加上 android:networkSecurityConfig"xml/network_config" <!-- app下载更新配置--> <uses-permission andr…

HBuilder真机调试检测不到荣耀Magic UI系列(包括手机和电脑)解决办法

HBuilder真机调试检测不到荣耀Magic UI系列&#xff08;包括手机和电脑&#xff09;解决办法解决方法&#xff1a; 1.在开发人员选项中开启USB调试 如何进入开发者选项&#xff1f; 设置->关于->版本号&#xff0c;点击版本号直至出现您已处于开发者模式 2.选择USB配置…

Swift-19-基础入门

从本章开始大概用10篇左右文章介绍下Swift语言的基本用法。 简介 Objective-C作为一门比较老的语言&#xff0c; 缺少很多现代语言所具备的高级特性。Swift是目标是比C&#xff0c;C, ObjC更安全可靠&#xff0c;从而减少开发者对在应用运行时出错的代码进行调试的时间成本。本…

ARouter之kotlin build.gradle.kts

ARouter之kotlin build.gradle.kts kotlin的配置需要用到kapt 项目的build.gradle.kts plugins {id("com.android.application") version "8.1.2" apply falseid("org.jetbrains.kotlin.android") version "1.9.0" apply falseid(&…