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的时钟矫正序列,并设置为BC507、总结,关注以下内部带宽、外部带宽,参考时钟频率、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

六、总结

具体的块对齐过程可以结合仿真看一下,由于过程比较复杂,这里就不细说了

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

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

相关文章

使用DockerCompose安装Redis

本文使用docker-compose的方式安装Redis&#xff0c;如何未安装docker-compose&#xff0c;可以参考这篇文章进行安装【在Ubuntu上安装Docker Compose】 一、创建一个DockerCompose配置文件 第一步&#xff1a;创建相关目录文件 为了更好的组织管理Docker容器的配置文件和映射…

5G网络开通与调测ipv4

要求如下&#xff1a; 1. 勘站规划 1. 【重】首先观察NR频点&#xff0c;完成设备选型 2645--选择N41 3455--选择N78 4725--选择N79 设备选型如下&#xff1a;观察AAU的通道数&#xff0c;最大发射功率&#xff1b;选择N41的选型频段也要选41 2. …

【MATLAB源码-第189期】基于matlab的人工蜂群优化算法(ABC)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Artificial Bee Colony&#xff08;ABC&#xff09;算法是一种模仿蜜蜂觅食行为的优化算法&#xff0c;它通过模拟蜜蜂群体的社会结构和行为来解决数学优化问题。本文将详细介绍ABC算法的基本原理、算法流程、以及在实际应用…

代理模式(结构型模式)

目录 1、概述 2、结构 2.1、角色分类 2.2、类图 3、静态代理 3.1、案例类图 3.2、案例代码 4、JDK 动态代理 4.1、案例代码 4.2、底层原理 4.3、执行流程说明 5、CGLib 动态代理 5.1、案例代码 6、三种代理的对比 6.1、JDK代理和CGLib代理 6.2、动态代理和静态…

matlab学习(三)(4.9-4.15)

一、空域里LSB算法的原理 1.原理&#xff1a; LSB算法通过替换图像像素的最低位来嵌入信息。这些被替换的LSB序列可以是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。 2.实现步骤&#xff1a; &#xff08;1&#xff09;将图像文件中的所有像素点以RGB形…

【C语言】每日一题,快速提升(1)!

调整数组使奇数全部都位于偶数前面 题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分 所有偶数位于数组的后半部分 解题思路&#xff1a; 给定两个下标left和right&#xff0c;left放在数组的起始…

Web端Excel的导入导出Demo

&#x1f4da;目录 &#x1f4da;简介:✨代码的构建&#xff1a;&#x1f4ad;Web端接口Excel操作&#x1f680;下载接口&#x1f680;导入读取数据接口 &#x1f3e1;本地Excel文件操作⚡导出数据&#x1f308;导入读取数据 &#x1f4da;简介: 使用阿里巴巴开源组件Easy Exce…

软考中级工程师网络技术第二节网络体系结构

OSPF将路由器连接的物理网络划分为以下4种类型&#xff0c;以太网属于&#xff08;25&#xff09;&#xff0c;X.25分组交换网属于&#xff08;非广播多址网络NBMA&#xff09;。 A 点对点网络 B 广播多址网络 C 点到多点网络 D 非广播多址网络 试题答案 正确答案&#xff1a; …

【鸿蒙开发】第二十一章 Media媒体服务(二)--- 音频播放和录制

1 AVPlayer音频播放 使用AVPlayer可以实现端到端播放原始媒体资源&#xff0c;本开发指导将以完整地播放一首音乐作为示例&#xff0c;向开发者讲解AVPlayer音频播放相关功能。 以下指导仅介绍如何实现媒体资源播放&#xff0c;如果要实现后台播放或熄屏播放&#xff0c;需要…

Java使用OpenOffice将office文件转换为PDF

Java使用OpenOffice将office文件转换为PDF 1. 先行工作1.1 OpenOffice官网下载1.2 JODConverter官网下载1.3 下载内容 2.介绍3. 安装OpenOffice服务3.1.Windows环境3.2 Linux环境 4. maven依赖5. 转换代码 1. 先行工作 请注意&#xff0c;无论是windows还是liunx环境都需要安装…

Flutter - iOS 开发者速成篇

首先 安装FLutter开发环境&#xff1a;M1 Flutter SDK的安装和环境配置 然后了解Flutter和Dart 开源电子书&#xff1a;Flutter实战 将第一章初略看一下&#xff0c;你就大概了解一下Flutter和Dart这门语言 开始学习Dart语言 作为有iOS经验的兄弟们&#xff0c;学习Dart最快…

C# dynamic 数据类型

在C#中&#xff0c;dynamic是一种数据类型&#xff0c;它允许在运行时推迟类型检查和绑定。使用dynamic类型&#xff0c;可以编写更具灵活性的代码&#xff0c;因为它允许在编译时不指定变量的类型&#xff0c;而是在运行时根据实际情况进行解析。 dynamic类型的变量可以存储任…

【脚本】多功能Ubuntu临时授予用户sudo权限管理工具

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 设计原理和初衷可以看这里&#xff1a;【技巧】Ubuntu临时授予用户sudo权限&#xff0c;并在一定时间后自动撤销_ubuntu jianshao sudo-CSDN博客文章浏览阅读404次。非常实用_ubuntu jianshao sudohttps://blog.c…

SpringBoot+FreeMaker

目录 1.FreeMarker说明2.SpringBootFreeMarker快速搭建Pom文件application.properties文件Controller文件目录结构 3.FreeMarker数据类型3.1.布尔类型3.2.数值类型3.3.字符串类型3.4.日期类型3.5.空值类型3.6.sequence类型3.7.hash类型 4.FreeMarker指令assign自定义变量指令if…

C++版【AVL树的模拟实现】

前言 在学习AVL树的底层之前&#xff0c;先回顾一下二叉搜索树&#xff0c;我们知道二叉搜索树在极端场景是会形成单支树的&#xff0c;如下图&#xff1a; 在退化成单支树后&#xff0c;查找的效率就会降到O(n)&#xff0c;所以为了解决退化成单支树的情况&#xff0c;AVL树就…

stm32移植嵌入式数据库FlashDB

本次实验的程序链接stm32f103FlashDB嵌入式数据库程序资源-CSDN文库 一、介绍 FlashDB 是一款超轻量级的嵌入式数据库&#xff0c;专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同&#xff0c;FlashDB 结合了 Flash 的特性&#xff0c;具有较强的性能…

Ubuntu20.04安装FloodLight最新版本

Ubuntu20.04安装FloodLight最新版本 网上的很多教程尝试了一下都不对&#xff0c;并且很多都是基于Ubuntu14的旧版本系统&#xff0c;其中的Python环境大多是基于2.0的&#xff0c;由于本人所使用的系统是Ubuntu20.04&#xff0c;后再油管澳大利亚某个学校的网络教学视频的帮助…

【Vue】面试题

vue的组建通信方式 父子关系&#xff1a;props & $emit 、 $parent / $children 、 ref / $refs 、 插槽跨层级关系&#xff1a; provide & inject通用方案&#xff1a;Vuex 或 eventbus 插播&#xff1a;兄弟组建怎么通信&#xff1f; eventbusVuex通过中间件&…

架构师系列-搜索引擎ElasticSearch(六)- 映射

映射配置 在创建索引时&#xff0c;可以预先定义字段的类型&#xff08;映射类型&#xff09;及相关属性。 数据库建表的时候&#xff0c;我们DDL依据一般都会指定每个字段的存储类型&#xff0c;例如&#xff1a;varchar、int、datetime等&#xff0c;目的很明确&#xff0c;就…

STM32之DHT11温湿度传感器

目录 一 DHT11温湿度传感器简介 1.1 传感器特点 1.2 传感器特性 1.3 传感器引脚说明 二 测量原理及方法 2.1 典型应用电路 2.2 单线制串行简介 2.2.1 串行接口 (单线双向) 2.2.2 数据示例 2.3 通信时序 三 单片机简介 3.1 STM32F103C8T6最小系统板 四 接线说明 …