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

news2025/1/16 16:06:24

文章目录

  • 前言
  • 一、设计框图
  • 二、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)
begin
    if(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;
end


always@(posedge i_rx_clk,posedge i_rx_rst)
begin
    if(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;
        endcase
    else 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;
        endcase
    else 
        rm_axis_keep <= 8'b1111_1111;
end


always@(posedge i_rx_clk,posedge i_rx_rst)
begin
    if(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;
end

always@(posedge i_rx_clk,posedge i_rx_rst)
begin
    if(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.coloradmin.cn/o/1569472.html

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

相关文章

什么是redis缓存的雪崩、穿透以及击穿

缓存雪崩 举个例子&#xff0c;例如在双十一中&#xff0c;一点进去。访问量大&#xff0c;所以它很多数据是放在redis区缓存起来&#xff0c;对应redis的100个key。然后假设设置缓存失效时间是三小时。当双十一期间&#xff0c;购物超过这个三小时之后。这个首页的redis缓存会…

Excel、PowerQuery 和 ChatGPT 终极手册(上)

原文&#xff1a;Ultimate ChatGPT Handbook for Enterprises 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 在不断发展的数据管理和分析领域中&#xff0c;掌握 Excel 的查找功能不仅是一种技能&#xff0c;更是高效数据处理的基石。《使用 Power Query 和 Ch…

Red Hat Enterprise Linux release 8.4安装Jenkins

1. 查看安装 1.1 显示 Linux 系统的详细信息&#xff0c;包括内核版本、操作系统版本和其他相关信息 uname -a1.2 查看 Red Hat Linux 系统的版本 cat /etc/redhat-release # 或者 cat /etc/os-release1.3 查看 JDK 是否安装 java -version #查看安装路径 echo $JAVA_HOME1…

Docker 哲学 - docker swarm

Docker Swarm 模式下的集群管理和服务恢复机制 Docker Swarm 是 Docker 的集群管理和编排功能。在 Swarm 模式下&#xff0c;你可以将多个 Docker 主机组合成一个虚拟主机&#xff0c;称为 Swarm 集群。Swarm 集群由一个或多个管理节点&#xff08;manager nodes&#xff09;和…

前端开发基础(HTML5 + CSS3)【第一篇】:HTML标签之文字排版、图片、链接、音频、视频 涵盖了两个综合案例 做到了基础学得会,实战写的出

点击前往前端开发基础专栏&#xff1a; 文章目录 HTML5 CSS3 开发一、开发环境搭建下载 VS Code1. 2 插件的下载1.3 项目和文件的下载 二、 什么是 HTML2.1 标签的语法2.2 代码演示&#xff1a;2.3 小结 三 、HTML基本骨架3.1 快捷键生成HTML骨架3.2 代码展示3.3 小结 四、标…

【游戏逆向】逆向基础之寄存器和内存

寄存器是中央处理器内的组成部分 它们可用来暂存指令、数据和地址。 具有这样功能还有内存 我们这里说的内存都是指虚拟内存。 寄存器和虚拟内存的主要区别在于它的存储和读取速度更快&#xff0c;那么有的同学会说&#xff0c;那我们全用寄存器就好了&#xff0c;但是&…

NOI - OpenJudge - 2.5基本算法之搜索 - 1490:A Knight‘s Journey - 超详解析(含AC代码)

点赞关注吧~ 1490:A Knights Journey 查看提交统计提问 总时间限制: 1000ms 内存限制: 65536kB 描述 Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey around the world. When…

数据仓库面试总结

文章目录 1.什么是数据仓库&#xff1f;2.ETL是什么&#xff1f;3.数据仓库和数据库的区别&#xff08;OLTP和OLAP的区别&#xff09;4.数据仓库和数据集市的区别5.维度分析5.1 什么是维度&#xff1f;5.2什么是指标&#xff1f; 6.什么是数仓建模&#xff1f;7.事实表7.维度表…

StarRocks实战——华米科技埋点分析平台建设

目录 前言 一、原有方案及其痛点 二、引入StarRocks 三、方案改造 3.1 架构设计 3.2 数据流程 3.3 性能指标 3.4 改造收益 前言 华米科技是一家基于云的健康服务提供商&#xff0c;每天都会有海量的埋点数据&#xff0c;以往基于HBase建设的埋点计算分析项目往往效率上…

号卡极团分销管理系统 index.php SQL注入漏洞复现

0x01 产品简介 号卡极团分销管理系统,同步对接多平台,同步订单信息,支持敢探号一键上架,首页多套UI+商品下单页多套模板,订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定,内置敢探号、172平台、号氪云平台第三方接口以及号卡网同系统对接! 0x02 漏洞概述…

在ssh 工具 Linux screen会话中使用鼠标进行上下滚动

经过几次发现 除xshell外&#xff0c; WindTerm finalshell MobaXterm 都是进入会话后&#xff0c;发现其界面无法滚动屏幕向上查看 如果想要在Linux screen会话中使用鼠标进行上下滚动。必须首先进入该screen的回滚(scrollback模式)才能进行上下滚动 第一步&#xff…

RobotFramework测试框架(2)-测试用例

创建测试数据 测试数据语法 这里的测试数据就是指的测试用例。 测试文件组织 测试用例的组织层次结构如下&#xff1a; 在测试用例文件&#xff08; test case file &#xff09;中建立测试用例 一个测试文件自动的建成一个包含了这些测试用例的测试集&#xff08; test s…

TCP/IP协议、HTTP协议和FTP协议等网络协议包简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

A First Course in the Finite Element Method【Daryl L.】|PDF电子书

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

STM32 PWM方式读取AS5600磁编码器数据

HAL STM32 PWM方式读取AS5600磁编码器获取角度例程 &#x1f4cd;相关篇《STM32 软件I2C方式读取AS5600磁编码器获取角度例程》 &#x1f4cc;《HAL STM32 硬件I2C方式读取AS5600磁编码器获取角度例程》 &#x1f341;先通过IIC读取的角度值和逻辑分析仪抓取的AS5600 OUT引脚…

超越聊天机器人:语言模型揭秘

原文&#xff1a;More than a Chatbot 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 致谢 我要感谢激励我写这本书的跨学科项目合作伙伴&#xff0c;特别是“BIAS&#xff1a;减轻劳动力市场 AI 多样性偏见”地平线欧洲项目&#xff0c;以及我的研究小组和其他研究同…

MySQL-逻辑架构:逻辑架构分析、SQL执行流程、数据库缓冲池

逻辑架构 1. 逻辑架构剖析 1.1 第1层&#xff1a;连接层 系统&#xff08;客户端&#xff09;访问MySQL服务器前&#xff0c;做的第一件事就是建立TCP连接。 经过三次握手建立连接成功后&#xff0c;MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。 用户名或密码…

玩转ChatGPT:Kimi测评(图片识别)

一、写在前面 ChatGPT作为一款领先的语言模型&#xff0c;其强大的语言理解和生成能力&#xff0c;让无数用户惊叹不已。然而&#xff0c;使用的高门槛往往让国内普通用户望而却步。 最近&#xff0c;一款由月之暗面科技有限公司开发的智能助手——Kimi&#xff0c;很火爆哦。…

【Latex】参考文献标号未对齐解决方案

Latex写论文时发现最后参考文献标号出现如下没有对齐的情况&#xff1a; 解决方案&#xff1a; 将参考文献开始出的序号1改为99&#xff08;或者其他大点的数字也可以&#xff09; ⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇⬇

非关系型数据库-----------探索Redis支持五种数据类型

目录 一、Redis支持五种数据类型 1.String&#xff08;字符串&#xff09; 2.Hash&#xff08;哈希&#xff09; 3.List&#xff08;列表&#xff09; 4.Set&#xff08;集合&#xff09; 5.sorted set(有序集合) 二、Redis的字符串类型string 1、 SET/GET/APPEND/STRL…