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

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

1、测试数据生成模块

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

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

//--###############################################################################################
//--#
//--# File Name		: axi_s_gen
//--# Designer		: 数字站
//--# Tool			: Vivado 2021.1
//--# Design Date	: 2024.3.18
//--# Description	: 生成测试数据;
//--# 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)
//--#
//--###############################################################################################
module axi_s_gen #(parameter			KEEP		=		4'b1111      //一帧数据的最后一个数据的有效位,高电平有效;
)(input									clk		    ,//系统时钟信号;input									rst  	    ,//系统复位信号,高电平有效;input                                   axi_s_ready ,//AXI总线的数据应答信号;output  reg [31 : 0]                    axi_s_data  ,//AXI总线的数据信号,先发送高字节数据;output  reg [3 : 0]                     axi_s_keep  ,//AXI总线的数据掩码信号;output  reg                             axi_s_last  ,//AXI总线的最后一个数据指示信号;output  reg                             axi_s_valid  //AXI总线的数据有效指示信号;
);localparam          DATA_NUM    =       6'd50       ;//一帧数据发送的个数;reg         [5 : 0]                     cnt         ;//wire        [7 : 0]                     cnt_r       ;always@(posedge clk)beginif(rst)begin//初始值为0;cnt <= 6'd0;endelse if(axi_s_ready)begincnt <= cnt + 1;endendassign cnt_r = {cnt,2'd0};//生成输出数据;always@(posedge clk)beginif(rst)begin//初始值为0;axi_s_data <= 0;endelse beginaxi_s_data <= {cnt_r[7:0],(cnt_r[7:0]+8'd1),(cnt_r[7:0]+8'd2),(cnt_r[7:0]+8'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.mzph.cn/news/848509.shtml

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

相关文章

期望18K,4年前端Cvte 视源股份一面挂

一面 1、自我介绍&#xff1f;毕业的时候一直在 xx 公司&#xff0c;你基本都在做什么项目&#xff1f; 2、你讲一下你主要负责哪一块的&#xff1f;balabala 3、你们的 json 是怎么定义组件间的联动的&#xff1f; 4、怎么确定区分两个 input&#xff1f; 5、你们是怎么触…

软件三班20240605

文章目录 1.创建工程和模块2.添加 web支持3.创建前端代码4.添加servlet 依赖5. 代码6.案例2 1.创建工程和模块 2.添加 web支持 方法1 方法2 3.创建前端代码 4.添加servlet 依赖 5. 代码 <!DOCTYPE html> <html lang"en"> <head><meta c…

Spring Boot中的JDK 线程池以及Tomcat线程池使用与配置

Spring Boot中的线程池使用与配置 一、引言 在Java开发中&#xff0c;特别是在高并发场景下&#xff0c;线程池是一个非常重要的概念。合理地使用线程池可以优化系统性能&#xff0c;避免线程频繁创建和销毁带来的性能开销。Spring Boot作为当前最流行的Java框架之一&#xf…

VBA模拟题库生成器

VBA模拟题库生成器 Option ExplicitDim intXZ As Integer 选择题数 Dim intPD As Integer 判断题数 Dim intTK As Integer 填空题数 Dim intWD As Integer 问答题数 Dim intNon As Integer 未知题数 Dim intCount As Integer 题库行数 Dim intCol As Integer …

【Nacos源码分析02-服务配置】

文章目录 服务配置Nacos Config入门Nacos服务端配置发布源码Nacos 服务端监控源码 服务配置 服务配置中心介绍 首先我们来看一下,微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个微服务架构下&#xff0c;配置文件会随着微服务的增多变的越来越多&…

8.22 PowerBI系列之DAX函数专题-盈亏平衡分析

需求 实现 一、用参数设置固定成本&#xff0c;单位变动成本&#xff0c;与毛利率 1 单位变动成本 generateseries(0,100,1) 2 固定成本 generateseries(0,50000,1) 3 毛利率 generateseries(0,0.4,0.01) 二、度量值 1 总变动成本 [单位变动成本 值]*[销量 值] 2 总成本…

各类电机数学模型相关公式总结 —— 集成芯片驱动

0、背景技术概述 永磁直流电机&#xff08;PMDC&#xff09;、永磁同步电机&#xff08;PMSM&#xff09;、无刷直流电机&#xff08;BLDC&#xff09;以及混合式两相步进电机在小功率应用场景中多采用集成芯片驱动&#xff08;如二合一、三合一驱动芯片&#xff09;的原因主要…

深度学习之非极大值抑制NMS介绍

1. 基本介绍 非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;NMS&#xff09;是深度学习中一种常用的目标检测算法&#xff0c;用于在检测结果中去除冗余的边界框。 在目标检测任务中&#xff0c;通常会使用候选框&#xff08;bounding boxes&#xff09;来表示可…

王道408数据结构CH2_线性表

概述 2 线性表 2.1 基本操作 2.2 顺序表示 线性表的元素从1开始&#xff0c;数组元素下标从0开始 2.2.1 结构体定义 #define Maxsize 50typedef struct{ElemType data[Maxsize];int length; }SqList;#define Initsize 100typedef struct{ElemType *data;int Maxsize ,length;…

Ansible部署 之 zookeeper集群

简介 Ansible是近年来越来越火的一款轻量级运维自动化工具&#xff0c;主要功能为帮助运维实现运维工作的自动化、降低手动操作的失误、提升运维工作效率。常用于自动化部署软件、自动化配置、自动化管理&#xff0c;支持playbook编排。配置简单&#xff0c;无需安装客户端&am…

Github 2024-06-06 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…

js中的事件循环机制(宏任务和微任务)

JavaScript的事件循环机制是其非阻塞I/O模型的核心&#xff0c;它使得JavaScript能够在单线程环境中高效地处理异步操作。事件循环机制主要由以下几个部分组成&#xff1a; 调用栈&#xff08;Call Stack&#xff09;&#xff1a; 这是JavaScript执行同步代码的地方&#xff0c…

Android状态栏适配问题

Android状态栏适配是一个老生常谈的问题&#xff0c;那么我又拿出来讲了&#xff0c;因为这个东西确实太重要了&#xff0c;基本上每个项目都用得到。状态栏总共有几种形态。第一&#xff0c;让状态栏颜色跟应用主色调一致&#xff0c;布局内容不占有状态栏的位置。第二&#x…

c++学习笔记“类和对象”;友元函数

目录 4.4 友元 4.4.1 全局函数做友元 4.4.1 类做友元 4.4.1 成员函数做友元 4.4 友元 生活中你的家有客厅(Public)&#xff0c;有你的卧室(Private) 客厅所有来的客人都可以进去&#xff0c;但是你的卧室是私有的&#xff0c;也就是说只有你能进去但是呢&#xff0c;你也可…

PSOPT在Ubuntu22.04下的安装

求解器pospt的原链接如下&#xff1a; PSOPT/psopt: PSOPT Optimal Control Software (github.com) 在该文件夹下提供了安装的指导文件&#xff0c;文件内容如下&#xff1a; 在 Ubuntu 22.04 中&#xff0c;如果按照适用于 Ubuntu 20.04 的说明执行 PSOPT 代码&#xff0c;目…

详细分析Mysql中的SQL_MODE基本知识(附Demo讲解)

目录 前言1. 基本知识2. Demo讲解2.1 ONLY_FULL_GROUP_BY2.2 STRICT_TRANS_TABLES2.3 NO_ZERO_IN_DATE2.4 NO_ENGINE_SUBSTITUTION2.5 ANSI_QUOTES 前言 了解Mysql内部的机制有助于辅助开发以及形成整体的架构思维 对于基本的命令行以及优化推荐阅读&#xff1a; 数据库中增…

完美解决 mysql 报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded

文章目录 错误描述错误原因解决步骤 跟着我下面的步骤走&#xff0c;解决你的问题&#xff0c;如果解决不了 私信我来给你解决 错误描述 执行ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;报错ERROR 1524 (HY000): Plugin mysql_native_password is not …

596. 超过5名学生的课

596. 超过5名学生的课 题目链接&#xff1a;596. 超过5名学生的课 代码如下&#xff1a; # Write your MySQL query statement below selectclass from (select class,count(student) as num from Courses group by class) as t where num > 5

AI炒股:获取个股的历史成交价格并画出K线图

任务&#xff1a;获取贵州茅台的近几个月的价格数据&#xff0c;绘制k线图&#xff1b; 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 用AKShare库获取股票贵州茅台&#xf…

PID算法在电机速度控制上的应用

目录 概述 1 系统硬件框架 1.1 框架介绍 1.2 硬件实物图 2 STM32Cub生成工程 2.1 软件版本信息 2.2 配置参数 ​编辑2.3 生成项目 3 PID算法实现 3.1 概念 3.2 代码实现 4 其他功能实现 4.1 设置电机速度 4.2 PID算法控制电机 4.3 功能函数的调用 5 测试 5.1 …