64B/66B GT Transceiver 配置
一、前言
前一篇文章已经讲述了64B/66B的编码原理,此篇文章来配置一下7系列GT的64B/66B编码。并讲述所对应的例子工程的架构,以及部分代码的含义。
二、IP核配置
1、打开7 Series FPGAs Transceiver Wizards,选择将共享逻辑放置在example design中
2、线速率、参考时钟选择

(1)协议选择从0开始
(2)线速率选择10G,参考时钟选择156.25M
(3)PLL选择:当线速率大于6.6G,自动选择为QPLL
(4)Transceiver选择:保持默认就可以,在布局布线的时候,软件会根据管脚绑定自动选择Transceiver。
3、编码和时钟选择

(1)选择TX、RX外部数据带宽为64bit,选择编码方式为64B/66B with Ext Seq Ctr,内部数据带宽为32bit,DRP时钟为100M
这里的64B/66B with Ext Seq Ctr表示使用64B/66B编码,并使用外部计数器。关于这方面的知识可以去参考UG476中的Gearbox的章节,或者参考此篇文章:详解GearBox设计原理
(2)这里的选项几乎都是有关8B/10B编码的,不需要勾选
(3)这里使用弹性Buffer去做跨时钟域,选择TXUSERCLK的源为TXOUTCLK,TXOUTCLK的源为参考时钟。
(4)这里的选项大多关于PCS、PMA复位或者QPLL、CPLL掉电的,也不需要勾选
4、逗号对齐和均衡

(1)这里的选项全部都是8B/10B所用到的,所以不能选择
(2)均衡方式这里选择DFE,接收端的阈值电压设置为800mv
(3)这里将TX极性转换、幅值控制、前加重、后加重选上,RX端将RX极性转换选上。
5、这是是使用PCIe或者SATA所用的选项,这里只将loopback勾选
6、通道绑定和时钟矫正
在这里使用序列长度为2的时钟矫正序列,并设置为BC50
7、总结,关注以下内部带宽、外部带宽,参考时钟频率、TXUSERCLK2就好
三、例子工程
工程架构:

Frame_gen模块:用来产生数据帧;
Scrambler模块:用来对所发送的数据进行加扰;
Descrambler模块:用来对接收的模块进行解扰;
Block_syn模块:用于进行块同步。
Frame_chck:用于检测接收到的数据正确性
四、加扰、解扰模块
64B/66B自同步扰码实现随机化,编码所使用的扰码器为: X58+X39+1
扰码的数学原理使用了多项式,多项式的选择通常是基于扰码的特性,包括生成数据的随机度,以及打乱连0和连1的能力。一个简单的扰码器包含一组排列好的触发器,用于移位数据流。大部分的触发器只需要简单地输出下一个比特流即可,但是在复杂的扰码电路中,触发器需要与数据流中的历史比特进行逻辑运算(与和或运算)。
例子工程中加扰、解扰模块是按照如下的示意图进行的:

加扰、解扰程序如下
//加扰模块
module gtwizard_0_SCRAMBLER #
( parameter TX_DATA_WIDTH = 32
)
(// User Interfaceinput wire [(TX_DATA_WIDTH-1):0] UNSCRAMBLED_DATA_IN,input wire DATA_VALID_IN,output reg [(TX_DATA_WIDTH-1):0] SCRAMBLED_DATA_OUT,// System Interfaceinput wire USER_CLK,input wire SYSTEM_RESET
);//***************************Internal Register Declarations******************** integer i;reg [57:0] poly;reg [(TX_DATA_WIDTH-1):0] scrambled_data_i;reg [57:0] scrambler;reg [(TX_DATA_WIDTH-1):0] tempData;reg xorBit;//*********************************Main Body of Code***************************always @(scrambler,UNSCRAMBLED_DATA_IN)beginpoly = scrambler;for (i=0;i<=(TX_DATA_WIDTH-1);i=i+1)beginxorBit = UNSCRAMBLED_DATA_IN[i] ^ poly[38] ^ poly[57];poly = {poly[56:0],xorBit};tempData[i] = xorBit;endend //________________ Scrambled Data assignment to output port _______________ always @(posedge USER_CLK)beginif (SYSTEM_RESET)beginSCRAMBLED_DATA_OUT <= `DLY 'h0;scrambler <= `DLY 58'h155_5555_5555_5555;endelse if (DATA_VALID_IN)beginSCRAMBLED_DATA_OUT <= `DLY tempData;scrambler <= `DLY poly;endendendmodule
//解扰模块
module gtwizard_0_DESCRAMBLER #
( parameter RX_DATA_WIDTH = 32
)
(// User Interfaceinput wire [(RX_DATA_WIDTH-1):0] SCRAMBLED_DATA_IN,input wire DATA_VALID_IN,output reg [(RX_DATA_WIDTH-1):0] UNSCRAMBLED_DATA_OUT,// System Interface
input wire USER_CLK,
input wire SYSTEM_RESET
);//***************************Internal Register Declarations******************** reg [57:0] descrambler;integer i;reg [57:0] poly;reg [(RX_DATA_WIDTH-1):0] tempData;reg [(RX_DATA_WIDTH-1):0] unscrambled_data_i;reg xorBit;//*********************************Main Body of Code***************************always @(descrambler,SCRAMBLED_DATA_IN)beginpoly = descrambler;for (i=0;i<=(RX_DATA_WIDTH-1);i=i+1)beginxorBit = SCRAMBLED_DATA_IN[i] ^ poly[38] ^ poly[57];poly = {poly[56:0],SCRAMBLED_DATA_IN[i]};tempData[i] = xorBit;endend//________________ Scrambled Data assignment to output port _______________ always @(posedge USER_CLK)beginif (SYSTEM_RESET)beginUNSCRAMBLED_DATA_OUT <= `DLY 'h0;descrambler <= `DLY 58'h155_5555_5555_5555;endelse if (DATA_VALID_IN)beginUNSCRAMBLED_DATA_OUT <= `DLY tempData;descrambler <= `DLY poly;endendendmodule
五、块对齐
64B/66B和64B/67B协议依赖于块同步来确定它们的块边界。块同步是必需的,因为在实现块锁定之前,所有传入的数据都未对齐。其目标是通过更改数据对齐方式来搜索有效的同步标头。RXGEARBOXSLIP输入端口用于改变Gearbox数据对齐,以便可以在正常模式下检查所有可能的对齐。RXGEARBOXSLIP输入端口用于改变变速箱数据对齐,以便可以在正常模式下检查所有可能的对齐。这个滑移和测试同步头的过程重复,直到实现块锁定。使用RXGearbox时,FPGA逻辑中需要块同步状态机。
整个过程按照如下的状态机进行:

例子工程的代码如下,将一些关键条件进行注释:
`timescale 1ns / 1ps
`define DLY #1module gtwizard_0_BLOCK_SYNC_SM #
(parameter SH_CNT_MAX = 64,parameter SH_INVALID_CNT_MAX = 16
)
(// User Interfaceoutput reg BLOCKSYNC_OUT,output reg RXGEARBOXSLIP_OUT,input wire [2:0] RXHEADER_IN,input wire RXHEADERVALID_IN,// System Interfaceinput wire USER_CLK,input wire SYSTEM_RESET
);//**************************** Wire Declarations ******************************wire slip_pulse_i; wire next_begin_c;wire next_sh_invalid_c; wire next_sh_valid_c; wire next_slip_c; wire next_sync_done_c; wire next_test_sh_c; wire sh_count_equals_max_i; wire sh_invalid_cnt_equals_max_i; wire sh_invalid_cnt_equals_zero_i; wire slip_done_i; wire sync_found_i; //***************************External Register Declarations*************************** reg begin_r;reg sh_invalid_r; reg sh_valid_r; reg [31:0] slip_count_i; reg slip_r; reg sync_done_r; reg [9:0] sync_header_count_i; reg [9:0] sync_header_invalid_count_i; reg test_sh_r; //**************************** Main Body of Code *******************************// assign sync_found_i = (RXHEADER_IN[1:0] == 2'b01) || (RXHEADER_IN[1:0] == 2'b10);//寻找到数据头//________________________________ State machine __________________________ // State registersalways @(posedge USER_CLK)if(SYSTEM_RESET){begin_r,test_sh_r,sh_valid_r,sh_invalid_r,slip_r,sync_done_r} <= `DLY 6'b100000;elsebeginbegin_r <= `DLY next_begin_c;test_sh_r <= `DLY next_test_sh_c;sh_valid_r <= `DLY next_sh_valid_c;sh_invalid_r <= `DLY next_sh_invalid_c;slip_r <= `DLY next_slip_c;sync_done_r <= `DLY next_sync_done_c;end// Next state logic//begin信号相当于一个复位信号,当同步 或者 滑动计数器已满 或者 同步计数器已经达到最大值但是无效同步计数器有值 或者 同步头无效,同步头的数量到达最大值 都要将计数器清0assign next_begin_c = sync_done_r //已经同步| (slip_r && slip_done_i) //slip的滑动计数器已满| (sh_valid_r && sh_count_equals_max_i && !sh_invalid_cnt_equals_max_i) //同步头有效,同步头的数量到达最大值,无效同步头的数量也没有达到最大值| (sh_invalid_r && sh_count_equals_max_i && !sh_invalid_cnt_equals_max_i && BLOCKSYNC_OUT); //同步头无效,同步头的数量到达最大值,无效同步头的数量也没有达到最大值 快同步继续进行assign next_test_sh_c = begin_r //开始| (test_sh_r && !RXHEADERVALID_IN) //正在检测同步头,并且没有有效的同步头输入,则下一个时钟周期继续检测头部| (sh_valid_r && !sh_count_equals_max_i) //同步头有效,但是有效同步头的数量没有达到最大值| (sh_invalid_r && !sh_count_equals_max_i && !sh_invalid_cnt_equals_max_i && BLOCKSYNC_OUT); //同步头无效、同步头的数量没有到达最大值、无效同步头的数量也没有达到最大值、快同步继续进行assign next_sh_valid_c = (test_sh_r && RXHEADERVALID_IN && sync_found_i); //同步头已经找到,并且输入头有效,并且正在处于查找输入头的状态assign next_sh_invalid_c = (test_sh_r && RXHEADERVALID_IN && !sync_found_i); //正在处于查找输入头的状态,输入头有效,但是同步头没有找到,assign next_slip_c = (sh_invalid_r && (sh_invalid_cnt_equals_max_i || !BLOCKSYNC_OUT)) //下一次滑动的条件:同步头无效,无效同步头计数达到最大值 或者 块同步输出为0| (sh_valid_r && sh_count_equals_max_i && ! sh_invalid_cnt_equals_zero_i && (sh_invalid_cnt_equals_max_i || !BLOCKSYNC_OUT)) //同步头有效并且有效同步头计数器已达到最大值,但是无效同步计数器不为0,并且此时的无效同步计数器达到最大值或者块同步没有输出| (slip_r && !slip_done_i); //滑动信号有效并且滑动计数器没有计满assign next_sync_done_c = (sh_valid_r && sh_count_equals_max_i && sh_invalid_cnt_equals_zero_i); //同步标志:输入的同步头有效并且有效同步头计数器达到最大值并且无效同步器计数为0//________________ Counter keep track of sync headers counted _____________ always @(posedge USER_CLK)if(begin_r) beginsync_header_count_i <= `DLY 10'd0;endelse if (sh_valid_r || sh_invalid_r) //同步计数器在有效同步头和无效同步头的时候都会加1beginsync_header_count_i <= `DLY sync_header_count_i + 10'd1;endassign sh_count_equals_max_i = (sync_header_count_i==SH_CNT_MAX);//________________ Counter keep track of invalid sync headers ____________ always @(posedge USER_CLK)if(begin_r) beginsync_header_invalid_count_i <= `DLY 10'd0;endelse if (sh_invalid_r) //记录无效同步头的数量beginsync_header_invalid_count_i <= `DLY sync_header_invalid_count_i + 10'd1;end// signal to indicate max number of invalid sync headers has been reachedassign sh_invalid_cnt_equals_max_i = (sync_header_invalid_count_i==SH_INVALID_CNT_MAX);// signal to indicate no invalid sync headersassign sh_invalid_cnt_equals_zero_i = (sync_header_invalid_count_i==0);//_______ Counter wait for 16 cycles to ensure that slip is complete _______ assign slip_pulse_i = next_slip_c && !slip_r; //滑动信号输出always @(posedge USER_CLK)RXGEARBOXSLIP_OUT <= slip_pulse_i;//_____________ Ouput assignment to indicate block sync complete _________ always @(posedge USER_CLK)if(!slip_r) slip_count_i <= `DLY 32'h00000000;else slip_count_i <= `DLY {slip_count_i[30:0],RXGEARBOXSLIP_OUT}; //滑动计数器assign slip_done_i = slip_count_i[31];//_____________ Pulse GEARBOXSLIP port to slip the data by 1 bit _________ always @(posedge USER_CLK)if(SYSTEM_RESET || slip_r) BLOCKSYNC_OUT <= `DLY 1'b0;else if (sync_done_r) BLOCKSYNC_OUT <= `DLY 1'b1; //当同步时,证明块同步已完成endmodule
六、总结
具体的块对齐过程可以结合仿真看一下,由于过程比较复杂,这里就不细说了
相关文章:
64B/66B GT Transceiver 配置
一、前言 前一篇文章已经讲述了64B/66B的编码原理,此篇文章来配置一下7系列GT的64B/66B编码。并讲述所对应的例子工程的架构,以及部分代码的含义。 二、IP核配置 1、打开7 Series FPGAs Transceiver Wizards,选择将共享逻辑放置在example …...
ES6: promise对象与回调地狱
ES6: promise对象与回调地狱 一、回调地狱二、Promise概述三、Promise的组成四、用函数封装Promise读取文件操作 一、回调地狱 在js中大量使用回调函数进行异步操作,而异步操作什么时候返回结果是不可控的,所以希望一段程序按我们制定的顺序执…...
Qt事件处理机制2-事件函数的传播
所有继承自QObject的类都有event函数,该函数用来处理自身的事件,函数定义如下: virtual bool QObject::event(QEvent *e);Qt帮助文档: This virtual function receives events to an object and should return true i…...
【PDF.js】PDF文件预览
【PDF.js】PDF文件预览 一、PDF.js二、PDF.js 下载1、下载PDF.js2、在项目中引入3、屏蔽跨域错误 三、项目中使用四、说明五、实现效果 使用PDFJS实现pdf文件的预览,支持预览指定页、关键词搜索、缩略图、页面尺寸调整等等。 一、PDF.js 官方地址 文档地址 二、PD…...
从建表语句带你学习doris_表索引
1、doris建表概述 1.1、doris建表模板 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [DATABASE.]table_name (column_definition1[,column_deinition2,......][,index_definition1,[,index_definition2,]] ) [ENGINE [olap|mysql|broker|hive]] [key_desc] [COMMENT "tabl…...
Linux CentOS 安装 MySQL 服务教程
Linux CentOS 安装 MySQL 服务教程 1. 查看系统和GNU C库(glibc)版本信息 1.1 查询机器 glibc 版本信息 glibc,全名GNU C Library,是大多数Linux发行版中使用的C库,为系统和应用程序提供核心的API接口。在Linux系统中,特别是在…...
MSSQL 命令行操作说明 sql server 2022 命令行下进行配置管理
说明:本文的内容是因为我在导入Access2019的 *.accdb 格式的数据时,总是出错的背景下,不得已搜索和整理了一下,如何用命令行进行sql server 数据库和用户管理的方法,作为从Access2019 直接导出数据到sql server 数据库…...
【系统分析师】系统安全分析与设计
文章目录 1、安全基础技术1.1 密码相关1.1.1对称加密1.1.2非对称加密1.1.3信息摘要1.1.4数字签名1.1.5数字信封 1.2 PKI公钥体系 2、信息系统安全2.1 保障层次2.2 网络安全2.2.1WIFI2.2.2 网络威胁与攻击2.2.3 安全保护等级 2.3计算机病毒与木马2.4安全防范体系 1、安全基础技术…...
ActiveMQ 07 集群配置
Active MQ 07 集群配置 官方文档 http://activemq.apache.org/clustering 主备集群 http://activemq.apache.org/masterslave.html Master Slave TypeRequirementsProsConsShared File System Master SlaveA shared file system such as a SANRun as many slaves as requ…...
Redis(哨兵模式)
什么是哨兵机制 问题: redis 主从复制模式下, 一旦主节点由于故障不能提供服务, 需要人工进行主从切换, 同时大量客户端需要被通知切换到新的主节点上, 对于有一定规模的应用来说, 对于人力的资源消耗会很大.解决: 通过哨兵对主从结构进行监控, 一旦出现主节点挂了的情况, 自动…...
一种基于镜像指示位办法的RingBuffer实现,解决Mirror和2的幂个数限制
简介 在嵌入式开发中,经常有需要用到RingBuffer的概念,在RingBuffer中经常遇到一个Buffer满和Buffer空的判断的问题,一般的做法是留一个单位的buffer不用,这样做最省事,但是当RingBuffer单位是一个结构体时࿰…...
【Java开发指南 | 第十一篇】Java运算符
读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 算术运算符关系运算符位运算符逻辑运算符赋值运算符条件运算符(?:)instanceof 运算符Java运算符优先级 Java运算符包括:算术运算符、关系运算符、位运算符、逻辑运算符、赋值…...
【IC前端虚拟项目】验证环境方案思路和文档组织
【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 对于mvu的验证环境,从功能角度就可以分析出需要搭建哪些部分,再看一下mvu的周围环境哈: 很明显验证环境必然要包括几个部分: 1.模拟idu发送指令; 2.模拟ram/ddr读写数据; 3.rm模拟mvu的行为; …...
程序设计|C语言教学——C语言基础1:C语言的引入和入门
一、程序的执行 1.定义 解释:借助一个程序,那个程序能够试图理解你的程序,然后按照你的要求执行。下次执行的时候还需要从零开始解释。 编译:借助一个程序,能够像翻译官一样,把你的程序翻译成机器语言&a…...
初学python记录:力扣928. 尽量减少恶意软件的传播 II
题目: 给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示。在节点网络中,只有当 graph[i][j] 1 时,节点 i 能够直接连接到另一个节点 j。 一些节点 initial 最初被恶意软件感染。只要两个节点直接连接,…...
LlamaIndex 组件 - Storing
文章目录 一、储存概览1、概念2、使用模式3、模块 二、Vector Stores1、简单向量存储2、矢量存储选项和功能支持3、Example Notebooks 三、文件存储1、简单文档存储2、MongoDB 文档存储3、Redis 文档存储4、Firestore 文档存储 四、索引存储1、简单索引存储2、MongoDB 索引存储…...
在Linux系统中设定延迟任务
一、在系统中设定延迟任务要求如下: 要求: 在系统中建立easylee用户,设定其密码为easylee 延迟任务由root用户建立 要求在5小时后备份系统中的用户信息文件到/backup中 确保延迟任务是使用非交互模式建立 确保系统中只有root用户和easylee用户…...
JVM之方法区的详细解析
方法区 方法区:是各个线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、即时编译器编译后的代码等数据,虽然 Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是也叫 Non-Heap(非堆) 设置方法…...
Go 使用ObjectID
ObjectID介绍 MongoDB中的ObjectId是一种特殊的12字节 BSON 类型数据,用于为主文档提供唯一的标识符,默认情况下作为 _id 字段的默认值出现在每一个MongoDB集合中的文档中。以下是ObjectId的具体组成: 1. 时间戳(Timestamp&…...
基于SpringBoot+Vue的疾病防控系统设计与实现(源码+文档+包运行)
一.系统概述 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对疾病防控信息管理的提升&a…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...
