GT收发器64B66B协议(2)自定义PHY设计

文章目录

  • 前言
  • 一、设计框图
  • 二、GT_module
  • 三、PHY_module
    • 3.1、PHY_tx模块
    • 3.2、PHY_rx_bitsync模块
    • 3.3、PHY_rx模块
  • 四、上板测试

前言

有了对64B66B协议的认识以及我们之前设计8B10B自定义PHY的经验,本文开始对64B66B自定义PHY的设计

一、设计框图

在这里插入图片描述

二、GT_module

该模块整体设计与8B10B几乎一致,只有一些端口的区别;再就是将QPLL复位产生模块gtwizard_0_common_resetGT_channel模块放到了GT_module模块,但其实本质没有任何区别。

主要还是IP核配置变为64B66B之后输入输出的接口有一些变化,包括帧头信号,对齐信号以及发送队列计数器信号等。

同理,用户需要多个channel的时候只需要在GT_module模块当中例化多个GT_channel模块即可。

module GT_channel(input                   i_sysclk                    ,input                   i_gtrefclk                  ,input                   i_rx_rst                    ,input                   i_tx_rst                    ,output                  o_tx_done                   ,output                  o_rx_done                   ,input                   i_tx_polarity               ,input  [3 :0]           i_tx_diffctrl               ,input  [4 :0]           i_txpostcursor              ,input  [4 :0]           i_txpercursor               ,     input                   i_rx_polarity               ,input  [2 :0]           i_loopback                  ,input  [8 :0]           i_drpaddr                   , input                   i_drpclk                    ,input  [15:0]           i_drpdi                     , output [15:0]           o_drpdo                     , input                   i_drpen                     ,output                  o_drprdy                    , input                   i_drpwe                     ,input                   i_qplllock                  , input                   i_qpllrefclklost            , output                  o_qpllreset                 ,input                   i_qplloutclk                , input                   i_qplloutrefclk             , input                   i_data_valid                ,output                  o_rx_clk                    ,output [63:0]           o_rx_data                   ,output                  o_rx_valid                  ,output [1 :0]           o_rx_header                 ,output                  o_rx_header_valid           ,input                   i_rx_slipbit                ,output                  o_tx_clk                    ,input  [63:0]           i_tx_data                   ,input  [1 :0]           i_tx_header                 ,input  [6 :0]           i_tx_sequence               ,      output                  o_gt_tx_p                   ,output                  o_gt_tx_n                   ,input                   i_gt_rx_p                   ,input                   i_gt_rx_n                   
);

三、PHY_module

PHY层对数据进行组包和对齐的处理是难点所在
设计思路及代码思路参考了FPGA奇哥系列网课

3.1、PHY_tx模块

发送端工作流程:

  • 空闲时期拉高READY,用户数据进入FIFO,s_axis_last断言后拉低READY
  • FIFO不为空的时候从FIFO当中读出数据进行组帧
  • 当前数据帧发送完毕重新拉高READY
  • 大小端处理

发送数据时需要注意:每发送32个64bit数据之后用户需要暂停发送一拍数据,因为此时Gearbox需要将自己缓存的64bit数据吐出去。 从下图波形上看,sequence计数到31后,第32拍的用户数据是没办法被正常发送的,所以我们需要将该数据延迟到下一拍发送,所以图中的32和0时候的数据是一样的。
这个逻辑通过信号w_gt_send_valid 实现,达到30的时候拉低w_gt_send_valid ,这是因为还要考虑组帧时候的FIFO读潜伏期。

assign          w_gt_send_valid = ro_tx_sequence == 30 ? 0 : 1  ;

在这里插入图片描述
以上情况很好处理,但是如果刚刚好是在FIFO读使能拉高的时候w_gt_send_valid被拉低(下图所示),组帧逻辑就会混乱,主要是数据不会在ro_tx_sequence为32和0的时候保持不变,因此加入一个r_invalid用来处理这种情况,这里有点过于复杂了,还是需要多看看波形图进行分析,应该有比较简单的办法的。
不过思想是很简单的:就是保证在ro_tx_sequence == 32和ro_tx_sequence == 0的时候输出数据要连续保持,才能使得数据不会丢失。
在这里插入图片描述
最后一点就是大小端处理,我个人习惯处理数据按照大端处理,在最后发送的时候一次性转为小端模式。

assign o_tx_data = { ro_tx_data[7 : 0],ro_tx_data[15: 8],ro_tx_data[23:16],ro_tx_data[31:24],ro_tx_data[39:32],ro_tx_data[47:40],ro_tx_data[55:48],ro_tx_data[63:56]};

3.2、PHY_rx_bitsync模块

该模块实现接收端字节对齐的功能
整体思路很简单:下图为xilinx手册ug476当中对示例文件的介绍。
大致思维:

  • 在64B66B当中,只有2;b10和2’b01俩种帧头是有效的,所以我们只需要判断帧头是否是有效的,就可以判断当前字节是否对齐。
  • 当检测到错误帧头时,拉高一个slipbit脉冲信号,那么Gearbox会自动将对齐窗口向后滑动一个比特,注意:每次拉高slipbit脉冲信号的时候至少要隔32个RXUSRCLK2时钟周期
  • 为了防止误判,只有当连续收到64个正确头的时候,才会判定为当前成功对齐,随后释放PHY_rx的复位,进行正常数据接收。
  • 在xilinx文档当中的状态机还增加了重新复位接受模块的状态,就是判定对齐之后,当连续收到16个错误头后判断对齐出现了错误,重新进行对齐(本工程当中没有这个状态,出现一个错误头立马复位,然后重新进行同步)。

在这里插入图片描述
下图为仿真波形,第一条黄线之前是进行不断同步的过程,每次同步之间相隔32时钟周期,俩条黄线之间是发生了错误判断的情况,但在收到一个错误帧头后立马重新开始了同步,第二条黄线(有点看不清,可以看下面黄色框框位置)后是正常同步。
在这里插入图片描述

3.3、PHY_rx模块

接收端处理流程:

  • 先将GT输入数据进行大小端转换
  • 识别到SOF之后开始恢复数据
  • 识别EOF以及EOF位置
  • 根据EOF位置处理最后一拍数据以及KEEP信号

同样的,在接收数据的时候,每隔32时钟周期就有一个无效数据,进行VALID信号处理的时候需要考虑该情况。这里还有一点很重要,那就是识别到SOF后紧接着这个无效数据就来了,这种情况也是需要单独讨论的,接收端的r_invalid信号就是用来处理这种情况的。
在这里插入图片描述
主要代码:

always@(posedge i_rx_clk,posedge i_rx_rst)
beginif(i_rx_rst)rm_axis_data <= 'd0;else if(r_eof && (r_eof_local < 7 && r_eof_local > 0))rm_axis_data <= {ri_rx_data_1d[47:0],16'd0};  else if(w_eof && (w_eof_local == 0))rm_axis_data <= {ri_rx_data_1d[55:0],8'd0};else if(w_eof && (w_eof_local <= 7))rm_axis_data <= {ri_rx_data_1d[55:0],ri_rx_data[55:48]};  else if(r_receiving && ri_rx_valid)rm_axis_data <= {ri_rx_data_1d[55:0],ri_rx_data[63:56]};else rm_axis_data <= 'd0;
endalways@(posedge i_rx_clk,posedge i_rx_rst)
beginif(i_rx_rst)rm_axis_keep <= 8'b1111_1111;else if(r_eof && (r_eof_local < 7 && r_eof_local > 0))case(r_eof_local)1           :rm_axis_keep <= 8'b1111_1100;2           :rm_axis_keep <= 8'b1111_1000;3           :rm_axis_keep <= 8'b1111_0000;4           :rm_axis_keep <= 8'b1110_0000;5           :rm_axis_keep <= 8'b1100_0000;6           :rm_axis_keep <= 8'b1000_0000;           default     :rm_axis_keep <= 8'b1111_1111;endcaseelse if(w_eof && (w_eof_local == 0 || w_eof_local == 7))case(w_eof_local)0           :rm_axis_keep <= 8'b1111_1110;7           :rm_axis_keep <= 8'b1111_1111;            default     :rm_axis_keep <= 8'b1111_1111;endcaseelse rm_axis_keep <= 8'b1111_1111;
endalways@(posedge i_rx_clk,posedge i_rx_rst)
beginif(i_rx_rst)rm_axis_last <= 'd0;else if(rm_axis_last && rm_axis_valid)rm_axis_last <= 'd0;else if(rm_axis_valid && r_eof && (r_eof_local < 7 && r_eof_local > 0))rm_axis_last <= 'd1;else if(rm_axis_valid && w_eof && (w_eof_local == 7 || w_eof_local == 0))rm_axis_last <= 'd1;else rm_axis_last <= rm_axis_last;
endalways@(posedge i_rx_clk,posedge i_rx_rst)
beginif(i_rx_rst)rm_axis_valid <= 'd0;else if(r_sof)rm_axis_valid <= 'd1;else if(rm_axis_last && rm_axis_valid)rm_axis_valid <= 'd0;else if((!ri_rx_valid && ri_rx_header != 2'b10) || r_invalid)rm_axis_valid <= 'd0;else if(r_revalid)rm_axis_valid <= 'd1;else rm_axis_valid <= rm_axis_valid;
end

四、上板测试

暂时还没有加扰和解扰,所以直接光纤连接通信有点问题,这里是开启回环模式下上板测试结果,收发是正常的。
在这里插入图片描述

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

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

相关文章

蓝桥杯单片机速成8-NE555频率测量

一、原理图 NOTE&#xff1a;使用NE555测量频率之前&#xff0c;需要将J3-15(SIGNAL)与J3-16(P34短接) 在使用矩阵键盘的时候也记得把跳冒拔下&#xff0c;因为有公共引脚P34 又是因为他的输出引脚是P34&#xff0c;所以只能用定时器0来作为计数器进行频率测量了 二、代码实现 …

CSS设置网页背景

目录 概述&#xff1a; 1.background-color: 2.background-image&#xff1a; 3.background-repeat&#xff1a; 4.background-position&#xff1a; 5.background-attachment&#xff1a; 6.background-size&#xff1a; 7.background-origin&#xff1a; 8.background-…

Linux初学(十四)LampLnmp

一、简介 LAMP和LNMP是两种常见的web服务器组合。具体如下&#xff1a; LAMP&#xff1a;LAMP代表的是Linux&#xff08;操作系统&#xff09; Apache&#xff08;HTTP服务器&#xff09; MySQL&#xff08;数据库&#xff09; PHP&#xff08;编程语言&#xff09;。这个组合被…

C++利用键值对计算某一个数对应的最值及其索引位置

目录 一、算法概述二、代码实现1、计算最值2、计算最值及其索引 三、结果展示 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫与GPT。 一、算法概述 类似下图所示&#xff0c;计算第一列中1或2对应的最…

线段树练习

1.单点修改区间查询 P3374 【模板】树状数组 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n,m&#xff0c;分别表示该数列数字的个数和操作的总个…

ChatGPT 与 OpenAI 的现代生成式 AI(下)

原文&#xff1a;Modern Generative AI with ChatGPT and OpenAI Models 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 七、通过 ChatGPT 掌握营销技巧 在本章中&#xff0c;我们将重点介绍营销人员如何利用 ChatGPT&#xff0c;在这一领域中查看 ChatGPT 的主要用例…

Delphi编写的图片查看器

UNIT Unit17;INTERFACEUSESWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,Vcl.StdCtrls, Vcl.ExtDlgs, Vcl.ExtCtrls, Vcl.Imaging.jpeg; //注意&#xff1a;要加入jpej 否侧浏览图…

ids工业相机与电控位移台同步控制及数据采集

通过VS2017和OpenCV,实现ids工业相机与电控位移台同步控制及数据采集 目录项目环境配置代码流程及思路项目架构项目开发运行效果开发关键ids相机配置位移台环境配置相机头文件相机参数设置保存图像函数设置电控位移台头文件电控位移台设置参数最后就是通过main函数进行调用和控…

《QT实用小工具·十一》Echart图表JS交互之仪表盘

1、概述 源码放在文章末尾 该项目为Echart图表JS交互之炫酷的仪表盘&#xff0c;可以用鼠标实时改变仪表盘的读数。 下面为demo演示&#xff1a; 该项目部分代码如下&#xff1a; #include "widget.h" #include "ui_widget.h" #include "qurl.h&q…

PWM技术的应用

目录 PWM技术简介 PWM重要参数 PWM实现呼吸灯 脉宽调制波形 PWM案例 电路图 keil文件 直流电机 直流电机的控制 直流电机的驱动芯片L293D L293D引脚图 L293D功能表 直流电机案例 电路图 keil文件 步进电机 步进电机特点 步进电机驱动芯片L298 L298引脚图 L…

vue快速入门(一)vue的导入方法

注释很详细&#xff0c;直接上代码 新增内容 下载js代码导入实例数据绑定显示 源码 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

HbnnMall电子商城系统介绍(功能与技术栈)

今天在看我个人网站上的文章时&#xff0c;看到了曾经在2020年自己开发的电商系统。那时我已经入职小米有一段时间了&#xff0c;基本已经对各个业务线&#xff0c;各种业务知识有了系统性的了解和学习&#xff0c;所以想自己动手写一个电商系统&#xff0c;以便进一步提高自己…

书生·浦语训练营二期第二次笔记

文章目录 1. 部署 InternLM2-Chat-1.8B 模型进行智能对话1.1 配置环境1.2 下载 InternLM2-Chat-1.8B 模型 2. 实战&#xff1a;部署实战营优秀作品 八戒-Chat-1.8B 模型2.1 配置基础环境2.2 使用 git 命令来获得仓库内的 Demo 文件&#xff1a;2.3 下载运行 Chat-八戒 Demo 3. …

19.网络测试

考试频率低&#xff1b;主要是上午题&#xff1b; 主要议题&#xff1a; 1.网络全生命周期测试策略 2.网络设备评测指标 吞吐量&#xff1a;单位时间内完成xxxx的数量&#xff1b;如&#xff1a;不丢包情况下&#xff0c;系统最大的包转发速度&#xff1b; 丢包率&#xff…

哈佛大学商业评论 -- 第二篇:增强现实是如何工作的?

AR将全面融入公司发展战略&#xff01; AR将成为人类和机器之间的新接口&#xff01; AR将成为人类的关键技术之一&#xff01; 请将此文转发给您的老板&#xff01; --- 本文作者&#xff1a;Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的&#xff0c;但大…

C语言进阶课程学习记录-第22课 - 条件编译使用分析

C语言进阶课程学习记录-第22课 - 条件编译使用分析 条件编译基本概念条件编译实验条件编译本质实验-ifdefinclude本质实验-间接包含同一个头文件解决重复包含的方法-ifndef实验-条件编译的应用小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源…

Java spring 01 (图灵)

01.依赖注入 这里两个方法用到了datasource方法&#xff0c;不是bean这样的使用&#xff0c;没有autowird 会创建两个datasource configuration 会运行代理模式 会产生一个AppConfig的代理对象 这个代理对象会在spring的容器先找bean&#xff0c;datasource此时已经创建了be…

Linux-进程概念

1. 进程基本概念 书面概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核概念&#xff1a;担当分配系统资源&#xff08;CPU时间&#xff0c;内存&#xff09;的实体。 2. 描述和组织进程-PCB PCB&#xff08;process contral block&#xff09;&#xff0…

RisingWave 在品高股份 Bingo IAM 中的应用

背景介绍 公司背景 品高股份&#xff0c;是国内专业的云计算及行业信息化服务提供商。公司成立于 2003 年&#xff0c;总部位于广州&#xff0c;下设多家子公司和分公司&#xff0c;目前员工总数近 900 人&#xff0c;其中 80 %以上是专业技术人员。 品高股份在 2008 年便开…

Linux集群部署项目

目录 一&#xff0c;环境准备 1.1.安装MySQL 1.2.安装JDK 1.3.安装TomCat 1.4.安装Nginx 二&#xff0c;部署 2.1.后台服务部署 2.2.Nginx配置负载均衡及静态资源部署 一&#xff0c;环境准备 1.1.安装MySQL 将MySQL的安装包上传至服务器 查看系统中是否存在mariadb&…