基于GTX 8B10B编码的自定义PHY上板测试(高速收发器十四)

  前文整理了GTX IP,完成了自定义PHY协议的收发模块设计,本文将通过光纤回环,对这些模块上板测试,首先需要编写一个用于生成测试数据的用户模块。

1、测试数据生成模块

  本模块用于生成自定义PHY协议的测试数据,通过axi_stream接口向PHY发送模块生成测试数据。

  对应代码如下所示,通过计数器发送每字节递增的数据,代码比较简单。

    always@(posedge clk)beginif(rst)begin//初始值为0;cnt <= 6'd0;endelse if(axi_s_ready)begincnt <= cnt + 1;endend//生成输出数据;always@(posedge clk)beginif(rst)begin//初始值为0;axi_s_data <= 0;endelse beginaxi_s_data <= {{cnt[5:0],2'd0},{cnt[5:0],2'd1},{cnt[5:0],2'd2},{cnt[5:0],2'd3}};endend//生成数据掩码信号,高电平表示对应数据有效;always@(posedge clk)beginif(rst)begin//初始值为0;axi_s_keep <= 4'hf;endelse if(cnt == DATA_NUM - 1)beginaxi_s_keep <= KEEP;endelse beginaxi_s_keep <= 4'b1111;endend//生成一帧数据最后一个数据的指示信号;always@(posedge clk)beginif(rst)begin//初始值为0;axi_s_last <= 1'b0;endelse if((cnt == DATA_NUM - 1) && axi_s_ready)beginaxi_s_last <= 1'b1;endelse beginaxi_s_last <= 1'b0;endend//生成数据有效指示信号,高电平有效。always@(posedge clk)beginif(rst)begin//初始值为0;axi_s_valid <= 1'b0;endelse if(axi_s_last)beginaxi_s_valid <= 1'b0;endelse if((cnt == 0) && axi_s_ready)beginaxi_s_valid <= 1'b1;endendendmodule

  该模块对应的RTL结构如下所示,输出数据直接与自定义的PHY芯片连接。

在这里插入图片描述

图1 测试数据生成模块与自定义PHY芯片连接

2、顶层模块生成

  本次自定义PHY包含两个高手收发器通道,因此需要将前文的GT收发器模块和PHY顶层模块,测试数据模块例化。

  最后顶层模块的RTL结构如下所示,包含两个自定义的PHY模块、测试数据生成模块。

在这里插入图片描述

图2 顶层模块RTL

  在例化的时候需要设置收发器的加重参数和幅度参数,具体参数可以通过眼图扫描获取,前文讲解眼图时已经讲解过具体扫描方法。

  此处直接使用眼图扫描的参数设置两个收发器通道的gt0_txpostcursor_in、gt0_txprecursor_in、gt0_txdiffctrl_in参数。

  仿真激励文件如下所示,但是由于前文已经对各个模块仿真过了,此处就不再留仿真细节了,直接进行上板测试,读者可自行仿真。

//--###############################################################################################
//--#
//--# File Name		: tb_top
//--# Designer		: 数字站
//--# Tool			: Vivado 2021.1
//--# Design Date	: 20
//--# Description	: top的testbench文件
//--# Version		: 0.0
//--# Coding scheme	: GBK(If the Chinese comment of the file is garbled, please do not save it and check whether the file is opened in GBK encoding mode)
//--#
//--###############################################################################################
`timescale 1ns / 1ps
module tp_top ();parameter	CYCLE		= 	10		;//系统时钟周期,单位ns,默认10ns;parameter	RST_TIME	= 	10		;//系统复位持续时间,默认10个系统时钟周期;parameter	STOP_TIME	= 	1000	;//仿真运行时间,复位完成后运行1000个系统时钟后停止;reg			        clk             ;//系统时钟,默认100MHz;reg			        rst_n           ;//系统复位,默认低电平有效;reg                 gt_refclk_p     ;//GT差分参考时钟信号;wire                gt_refclk_n     ;//GT差分参考时钟信号;wire    [1 : 0]     gt_tx_p         ;//gt发送差分信号;wire    [1 : 0]     gt_tx_n         ;//gt发送差分信号;wire    [1 : 0]     gt_rx_p         ;//GT接收差分信号;wire    [1 : 0]     gt_rx_n         ;//GT接收差分信号;wire    [1 : 0]     sfp_disable     ;//光纤失能信号,高电平有效;assign gt_rx_p = gt_tx_p;assign gt_rx_n = gt_tx_n;top u_top(.clk            ( clk		    ),//系统时钟信号;.rst_n	        ( rst_n	        ),//系统复位信号,低电平有效;.gt_refclk_p    ( gt_refclk_p   ),//GT差分参考时钟信号;.gt_refclk_n    ( gt_refclk_n   ),//GT差分参考时钟信号;.gt_tx_p        ( gt_tx_p       ),//gt发送差分信号;.gt_tx_n        ( gt_tx_n       ),//gt发送差分信号;.gt_rx_p        ( gt_rx_p       ),//GT接收差分信号;.gt_rx_n        ( gt_rx_n       ),//GT接收差分信号;.sfp_disable    ( sfp_disable   ) //光纤失能信号,高电平有效;);//生成周期为CYCLE数值的系统时钟;initial beginclk = 0;forever #(CYCLE/2) clk = ~clk;end//生成差分时钟信号;initial begingt_refclk_p = 1;forever #3.2 gt_refclk_p = ~gt_refclk_p;endassign gt_refclk_n = ~gt_refclk_p;//生成复位信号;initial beginrst_n = 1;#2;rst_n = 0;//开始时复位10个时钟;#(RST_TIME*CYCLE);rst_n = 1;#(STOP_TIME*CYCLE);$stop;//停止仿真;endendmodule

3、上板测试

  对上述工程进行综合,然后光纤的引脚,本次使用双通道,可以直接使用光纤将数据回环,通过ILA抓取回环前后的数据,确定自定义PHY协议的设计是否正确。

在这里插入图片描述

图3 引脚分配

  注意差分引脚只需要分配引脚P就行了,因为差分对是绑定关系,分配一个引脚之后,另一个引脚的位置就已经确定了。

  至于vivado怎么知道这两个信号就是差分信号?

  这是因为差分信号输入FPGA后,都需要经过IBUFDS或者IBUFGDS这种差分转单端器件,这个器件的两个输入信号当然是差分信号,猜测vivado就是通过IBUFDS的输入或者OBUFDS的输出确定差分信号的。

  可以直接在需要通过ILA观测的信号前面加上下面的约束,之后可以在vivaodo中将这些信号添加到ILA进行观测。

在这里插入图片描述

图4 加上debug约束

  当工程综合完毕之后,进行如下操作,点击“SYNTHE SIS”下的“Open Synthesized Design”,然后点击“Set Up Debug”,进入界面后点击下一步即可。

在这里插入图片描述

图5 set up debug

  然后进入信号添加界面,如下所示,这种方式添加的信号只能是变化的信号,如果该信号位固定电平,则该界面会报错。如下图所示,数据掩码的最高位始终为高电平,此时就会报错,需要删除这一位信号,后面再分析时,默认其为高电平即可。

在这里插入图片描述

图6 添加带观测信号到ILA中

  然后需要设置ILA的数据深度,深度可以尽量设置大一点,方便一次抓取更多数据,另外2处可以启用其余的模式,如果需要对某个条件的信号需要特别关注,则可以勾选,本文随机抓取发送和接收数据即可,因此可以不勾选这两个选项。

在这里插入图片描述

图7 ILA深度设置

  最后时汇总界面,如下图所示,点击完成即可。

在这里插入图片描述

图8 ILA设置汇总界面

  之后生成比特流文件,然后下载到开发板中进行测试,用光纤连接FPGA的两个光口,如下所示。

在这里插入图片描述

图9 光纤连接光口

  注意这种方式连接,高速收发器0的发送通道与高速收发器1的接收通道连接,高速收发器0的接收通道连接高速收发器1的发送通道,在后续波形查看时需要注意。

  为加快测试速度,模块0与模块1发送数据时,一帧数据的最后一个数据掩码设置成不同数值,如下图所示。

在这里插入图片描述

图10 数据掩码设置

  将比特流下载到FPGA中,然后抓取高速收发器0的发送时序。如下图所示,用户发送一帧数据的开始位置。注意用户数据w_axi_s0_data是大端对齐,先发高字节数据,而GTX IP的输入数据gt_0_tx_data是小端对齐,先发低字节数据。

  在一帧数据开始前会先发送逗号和起始位,之后跟数据。

在这里插入图片描述

图11 高速收发器0发送一帧数据的开始时序

  下图是一帧数据的结尾部分,用户发送最后一个数据只有高三字节有效,及最后一个有效数据为8’hc6。组帧完成的信号在发送停止位前,最后一个数据为8’hc6,由此证明自定义PHY发送模块功能正常。

在这里插入图片描述

图12 高速收发器0发送一帧数据的结束时序

  下图时高速收发器1接收通道,接收一帧数据的开始时序,首先检测到逗号和起始位组成的帧头,然后向用户输出第一个数据为32’h00010203,与图11用户发送的第一个数据一致。

在这里插入图片描述

图13 高速收发器1接收一帧数据的开始时序

  下图是接收一帧数据末尾时序,停止位8’hfd之前最后一个数据为8’hc6,与图12发送的数据一致,证明GTX IP的发送和接收均正确。

  其次,输出给用户的最后一个数据高三位有效(最高位在添加ILA时,表示为高电平,被删除了,没有在下图体现),最后一个数据为8’hc6,与图12用户发送的最后一个数据保持一致,证明PHY收发和GTX收发均没有问题。

在这里插入图片描述

图14 高速收发器1接收一帧数据的结束时序

  前面验证了用户发送最后一个数据高三位有效时,接收和发送的时序正确性,后续还需要对另外三种情况进行验证,发送端的起始位只能在固定位置,因此起始位的位置就不进行验证了,前文也仿真了所有情况,不再赘述了。

  下图是高速收发器1的发送通道,发送一帧数据的开始时序。与图11基本一致。

在这里插入图片描述

图15 高速收发器1发送一帧数据的开始时序

  下图是发送一帧数据的结尾时序,由图可知,用户发送的最后一个数据所有位均有效,最后一个数据为8’hc7。

  然后在组帧结束时,停止位8’hfd之前的最后一个数据是8’hc7,证明这种情况下,自定义PHY的发送模块代码也没有问题。

在这里插入图片描述

图16 高速收发器1发送一帧数据的结束时序

  下图是高速收发器0接收通道,开始接收数据的起始时序,发送给用户的第一个数据为32’h00010203,与图15用户发送的数据一致。

在这里插入图片描述

图17 高速收发器0接收一帧数据的开始时序

  下图是接收一帧数据的结束时序,接收数据的停止位8’hfd之前的最后一个数据为8’hc7,发送给用户的最后一个数据为8’hc7,与图16用户发送的最后一个数据保持一致。由此证明这种情况下,自定义PH收发模块和GTX IP收发功能均正常。

在这里插入图片描述

图18 高速收发器0接收一帧数据的结束时序

  由两个收发器测试完两种结尾格式,之后更改顶层模块生成一帧测试数据,最后一个数据的有效字节,分别设置为一个字节和两个字节有效,如下图所示。

在这里插入图片描述

图19 帧结尾数据有效字节设置

  下图是高速收发器1的发送通道,发送一帧数据的结束时序(因为开始时序与图11和图15基本一致,后续不再抓取)。用户发送最后一个的高两字节有效,最后一个数据为8’hc5。

  组帧完成之后,在停止位8’hfd之前,最后一个数据为8’hc5。

在这里插入图片描述

图20 高速收发器1发送一帧数据的结束时序

  下图是高速收发器0接收一帧数据的开始时序,检测到帧头数据之后,向用户数据第一个数据为32’h00010203,与发送数据一致。

在这里插入图片描述

图21 高速收发器0接收一帧数据的开始时序

  下图是接收一帧数据的结束位置,接收停止位8’hfd之前最后一字节数据为8’hc5,之后向用户输出的最后一个数据也为8’hc5。证明在这种情况下自定义PHY收发模块、GTX收发均正确。

在这里插入图片描述

图22 高速收发器0接收一帧数据的结束时序

  下图开始验证最后一种情况,首先是高速收发器0的发送通道,发送一帧数据的结束时序,用户最后一个数据只有最高字节有效,最后一字节数据为8’hc4。

  组帧后停止位8’hfd前的最后一个数据也是8’hc4,因此证明发送数据没有问题。

在这里插入图片描述

图23 高速收发器0发送一帧数据的结束时序

  下图是高速收发器1的接收通道,接收一帧数据的起始时序,由于起始位的位置一致,所以每次抓取接收通道的起始时序基本也是一致的,不再赘述含义。

在这里插入图片描述

图24 高速收发器1接收一帧数据的开始时序

  下图是接收一帧数据结尾时序,检测到停止位8’hfd前的最后一个字节为8’hc4,最终输出给用户的最后一个字节数据为8’hc4。

  注意下图中框中输出给用户的掩码信号低3位为0,但是最高位固定为高电平,没有被添加到ILA中,因此最后一个字节数据是8’hc4,与图23发送的最后一个数据保持一致。

在这里插入图片描述

图25 高速收发器1接收一帧数据的结束时序

4、总结

  本文算是对整理的GTX IP、自定义的PHY收发模块进行了验证,结合前文的接收数据仿真,可以认为收发数据模块没有问题了。

  当自己写过这种自定义PHY协议,并且在板子上验证之后,会对GTX IP的认识清晰很多。


  如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!

  如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!

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

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

相关文章

什么是网站页面组件,有什么用处

1.组件是页面的组成部分 网站的每个页面都是由每个小组件拼接而成的&#xff0c;当然了&#xff0c;有一些网站并不是用小组件拼接的&#xff0c;但是像这些网站它是固定住标签&#xff0c;然后用js直接调用数据显示&#xff0c;这个就是定制化的体现。像那些用小组件组…

Elastic 索引结构-倒排索引

前言 Elastic 在数据库分类中一般被分为全文检索的数据库&#xff0c;那为什么这么区分呢&#xff1f;主要是因为其独特的索引结构 即倒排索引。 倒排索引 倒排索引先将文档中包含的关键字全部提取出来&#xff0c;然后再将关键字与文档的对应关系保存起来&#xff0c;最后再…

多模态大模型:识别和处理图片与视频的技术详解

多模态大模型&#xff1a;识别和处理图片与视频的技术详解 多模态大模型&#xff1a;识别和处理图片与视频的技术详解1. 什么是多模态大模型&#xff1f;2. 多模态大模型的基本架构3. 识别和处理图片3.1 图像特征提取3.2 图像分类与识别3.3 图像生成与增强 4. 识别和处理视频4.…

WebSocket 快速入门 与 应用

WebSocket 是一种在 Web 应用程序中实现实时、双向通信的技术。它允许客户端和服务器之间建立持久性的连接&#xff0c;以便可以在两者之间双向传输数据。 以下是 WebSocket 的一些关键特点和工作原理&#xff1a; 0.特点&#xff1a; 双向通信&#xff1a;WebSocket 允许服务…

什么是端口转发?路由器如何正确的设置端口转发和范围转发?(外网访问必备设置)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 端口转发 📒🚀 端口转发的应用场景💡 路由器如何设置端口转发(示例)💡 端口范围转发(示例)🎯 范围转发的应用场景🛠️ 设置范围转发📝 范围转发实操示例🎈 注意事项 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 …

遗传算法求解车间调度问题(附python代码)

背景介绍 车间调度问题&#xff08;Job Shop Scheduling Problem, JSSP&#xff09;是一类经典的组合优化问题&#xff0c;它在制造业和生产管理中有着广泛的应用。JSSP 的目标是对车间中的一系列作业进行排程&#xff0c;以使得作业在不同机器上的加工顺序是最优的&#xff0…

什么是场外期权?场外期权有几种做法?

今天带你了解什么是场外期权&#xff1f;场外期权有几种做法&#xff1f;期权分为场内期权&#xff0c;场外期权。场内期权我们都知道&#xff0c;是在期货盘里购买的期权&#xff0c;但场外期权呢&#xff1f; 什么是场外期权&#xff1f; 场外期权是一种在交易所之外进行交易…

WinForm之TCP服务端

目录 一 原型 二 源码 一 原型 二 源码 using System.Net; using System.Net.Sockets; using System.Text;namespace TCP网络服务端通讯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}TcpListener listener null;TcpClient handler null;Ne…

【Linux】从零开始配置新的服务器的机器学习环境

终端远程登录 ssh -p [端口号] [服务器用户名][服务器IP]或者 ssh [用户名][主机地址]第二种的前提是在.ssh\config中配置了host 安装文本编辑器vim 主要用于后续的文本编辑&#xff0c;个人比较习惯用vim&#xff0c;根据自己喜好选择 更新apt sudo apt update安装文本编辑…

陪诊小程序开发,陪诊师在线接单

近几年&#xff0c;陪诊师成为了一个新兴行业&#xff0c;在科技时代中&#xff0c;陪诊小程序作为互联网下的产物&#xff0c;为陪诊市场带来了更多的便利。 当下生活压力大&#xff0c;老龄化逐渐严重&#xff0c;年轻人很难做到陪同家属看病。此外&#xff0c;就诊中出现了…

【npm】安装报错(大多是版本冲突)

1.eslint版本太高&#xff0c;Vuex报错 我使用的是vue2.x&#xff0c;npm 安装Vuex3版本&#xff0c;控制台报错说eslint版本太高 解决办法&#xff1a;Vue2项目安装 vuex3 出现版本报错解决方法_安装 vuex3版本 eslint 报错-CSDN博客

在Lua解释器中注册自定义函数库

本文目录 1、引言2、注册原理3、实例4、程序验证 文章对应视频教程&#xff1a; 暂无&#xff0c;可以关注我的B站账号等待更新。 点击图片或链接访问我的B站主页~~~ 1、引言 在现代软件开发中&#xff0c;Lua因其轻量级、高效和可嵌入性而被广泛使用。作为一种灵活的脚本语言…

MyBatis使用 PageHelper 分页查询插件的详细配置

1. MyBatis使用 PageHelper 分页查询插件的详细配置 文章目录 1. MyBatis使用 PageHelper 分页查询插件的详细配置2. 准备工作3. 使用传统的 limit 关键字进行分页4. PageHelper 插件&#xff08;配置步骤&#xff09;4.1 第一步&#xff1a;引入依赖4.2 第二步&#xff1a;在m…

【SpringBoot整合系列】SpringBoot整合kinfe4j

目录 kinfe4j与Swagger的区别 SpringBoot2.x整合kinfe4j1.添加依赖2.启动类注解3.创建Knife4J配置类4.实体类5.接口admin访问 api访问 常用注解汇总SpringBoot3.x整合Kinfe4j启动报错解决1.更换依赖2.启动类3.配置4.配置类5.参数实体类6.接口admin访问 api访问 各版本注解参照 …

视频美颜工具技术探秘:直播美颜SDK的应用与发展

今天&#xff0c;笔者将深入探讨直播美颜SDK的应用场景和发展趋势&#xff0c;揭示其背后的技术奥秘和潜力。 一、直播美颜SDK的基本原理 直播美颜SDK其基本原理包括以下几个方面&#xff1a; 人脸检测与特征定位 肤色分析与调整 瑕疵修复与细节增强 滤镜和特效应用 二、…

【算法】Graham 凸包扫描算法 ( 凸包概念 | 常用的凸包算法 | 角排序 | 叉积 | Python 代码示例 )

文章目录 一、Graham 凸包扫描算法1、凸包概念2、常用的凸包算法3、Graham 凸包扫描算法 二、Graham 算法前置知识点1、角排序2、叉积3、算法过程分析 三、代码示例1、完整代码示例2、执行结果 使用 Graham 算法绘制的凸包效果 : 博客代码下载 : https://download.csdn.net/d…

算法刷题【二分法】

题目&#xff1a; 注意题目中说明了数据时非递减的&#xff0c;那么这样就存在二分性&#xff0c;能够实现logn的复杂度。二分法每次只能取寻找特定的某一个值&#xff0c;所以我们要分别求左端点和有端点。 分析第一组用例得到结果如下: 成功找到左端点8 由此可知&#xff0…

Spring Boot集成 Spring Retry 实现容错重试机制并附源码

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

verilog阻塞和非阻塞语法

阻塞和非阻塞是FPGA硬件编程中需要了解的一个概念,绝大部分时候,因为非阻塞的方式更加符合时序逻辑设计的思想,有利于时钟和信号的同步,更加有利于时序收敛,所以除非特殊情况,尽量采用非阻塞方式。 1,非阻塞代码 非阻塞赋值,A和B是同时被赋值的,具体是说在时钟的上升…

论文阅读:H-ViT,一种用于医学图像配准的层级化ViT

来自CVPR的一篇文章&#xff0c;https://openaccess.thecvf.com/content/CVPR2024/papers/Ghahremani_H-ViT_A_Hierarchical_Vision_Transformer_for_Deformable_Image_Registration_CVPR_2024_paper.pdf 用CNNTransformer混合模型做图像配准。可变形图像配准是一种在相同视场…