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

news2024/11/26 23:35:54

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

1、测试数据生成模块

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

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

    always@(posedge clk)begin
        if(rst)begin//初始值为0;
            cnt <= 6'd0;
        end
        else if(axi_s_ready)begin
            cnt <= cnt + 1;
        end
    end

    //生成输出数据;
    always@(posedge clk)begin
        if(rst)begin//初始值为0;
            axi_s_data <= 0;
        end
        else begin
            axi_s_data <= {{cnt[5:0],2'd0},{cnt[5:0],2'd1},{cnt[5:0],2'd2},{cnt[5:0],2'd3}};
        end
    end

    //生成数据掩码信号,高电平表示对应数据有效;
    always@(posedge clk)begin
        if(rst)begin//初始值为0;
            axi_s_keep <= 4'hf;
        end
        else if(cnt == DATA_NUM - 1)begin
            axi_s_keep <= KEEP;
        end
        else begin
            axi_s_keep <= 4'b1111;
        end
    end

    //生成一帧数据最后一个数据的指示信号;
    always@(posedge clk)begin
        if(rst)begin//初始值为0;
            axi_s_last <= 1'b0;
        end
        else if((cnt == DATA_NUM - 1) && axi_s_ready)begin
            axi_s_last <= 1'b1;
        end
        else begin
            axi_s_last <= 1'b0;
        end
    end

    //生成数据有效指示信号,高电平有效。
    always@(posedge clk)begin
        if(rst)begin//初始值为0;
            axi_s_valid <= 1'b0;
        end
        else if(axi_s_last)begin
            axi_s_valid <= 1'b0;
        end
        else if((cnt == 0) && axi_s_ready)begin
            axi_s_valid <= 1'b1;
        end
    end

endmodule

  该模块对应的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 begin
        clk = 0;
        forever #(CYCLE/2) clk = ~clk;
    end

    //生成差分时钟信号;
    initial begin
        gt_refclk_p = 1;
        forever #3.2 gt_refclk_p = ~gt_refclk_p;
    end

    assign gt_refclk_n = ~gt_refclk_p;

    //生成复位信号;
    initial begin
        rst_n = 1;
        #2;
        rst_n = 0;//开始时复位10个时钟;
        #(RST_TIME*CYCLE);
        rst_n = 1;
        #(STOP_TIME*CYCLE);
        $stop;//停止仿真;
    end

endmodule

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.coloradmin.cn/o/1805426.html

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

相关文章

XUbuntu24.04之ch9344(usb转串口芯片)安装驱动(二百四十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

DVB-S系统发射端Matlab仿真及FPGA实现

DVB标准 Digital Video Broadcasting&#xff08;数字视频广播&#xff09;是一个完整的数字电视解决方案&#xff0c;其中包括DVB-C&#xff08;数字电视有线传输标准&#xff09;&#xff0c; DVB-T&#xff08;数字电视地面传输标准&#xff09;&#xff0c;DVB-S&#xff…

什么是突发性耳聋?

72小时内突然发生、原因不明的感音神经性听力损失&#xff0c;至少在相邻的两个频率听力下降≥20dBHL。 特点&#xff1a; 1发生在数分钟、数小时或3天以内的听力下降&#xff1b; 2原因不明&#xff1b; 3多发生于单侧&#xff0c;可伴有耳鸣、耳堵塞感及耳周麻木感&#…

C#操作MySQL从入门到精通(21)——删除数据

前言: 谈到数据库,大家最容易脱口而出的就是增删改查,本文就是来详细介绍如何删除数据。 本文测试使用的数据库如下: 1、删除部分数据 使用delete 关键字,并且搭配where条件使用,否则会导致表中数据全部被删除 string sql = string.Empty;if (radioButton_DeletePart…

vivado HW_ILA

HW_ILA 描述 集成逻辑分析器&#xff08;ILA&#xff09;调试核心允许您执行系统内监控 通过对内核上的调试探针&#xff0c;在实现的设计中对信号进行处理。您可以配置 ILA核心实时触发特定硬件事件&#xff0c;并在 以系统速度探测。 ILA调试核心可以通过从IP目录实例化ILA核…

MyBatisPlus总结二

MybatisPlus总结一在这&#xff1a; MybatisPlus总结1/2-CSDN博客 六、分页查询&#xff1a; 6.1.介绍&#xff1a; MybatisPlus内置了分页插件&#xff0c;所以我们只需要配置一个分页拦截器就可以了&#xff0c;由于不同的数据库的分页的方式不一样&#xff0c;例如mysql和…

问题汇总:MPU6050(软件iic)

以下为个人问题汇总&#xff0c;排查点汇总可能大有缺陷&#xff0c;如有错误&#xff0c;欢迎指正。 排查点汇总 检查软件iic的时序操作用示波器或逻辑分析仪检查波形 无法使用逻辑分析仪进行I/O引脚波形分析 充当SDA、SCL的引脚要配置为推挽输出; 另外&#xff0c;逻辑分…

【全开源】安心护送非急救救护车转运平台小程序(FastAdmin+ThinkPHP+Uniap

&#x1f691;安心护送非急救救护车转运平台小程序——您的健康守护者&#x1f496; 安心护送转运平台小程序是一款基于FastAdminThinkPHPUniapp开发的非急救救护车租用转运平台小程序系统&#xff0c;可以根据运营者的业务提供类似短途接送救护服务&#xff0c;重症病人转运服…

一文学会Spring 实现事务,事务的隔离级别以及事务的传播机制

目录 一.Spring (Spring Boot) 实现事务 1.通过代码的方式手动实现事务 (手动档的车) 2.通过注解的方式实现声明式事务 (自动挡的车) 二.事务的4大特性(ACID) 三.事务的隔离级别 ①Mysql的事务隔离级别: ②Spring的事务隔离级别: 四.事务的传播机制 ①事务传播机制的概…

Git配置 安装及使用

团队开发的神 找工作必备 环境变量 配置好环境后 打开终端环境 winr cmd 我习惯在桌面打开&#xff0c;然后进入相应的文件夹 &#xff08;文件夹结构&#xff09; &#xff08;个人感觉能用cmd不用git&#xff0c;cmd更好用一些&#xff09; 进入对应的文件夹 填写自己对…

Valgo,类型安全,表达能⼒强的go验证器

valgo 是一个为 Go 语言设计的类型安全、表达性强且可扩展的验证库。该库的特点包括&#xff1a; github.com/cohesivestack/valgo 类型安全&#xff1a;利用 Go 语言的泛型特性&#xff08;从 Go 1.18 版本开始支持&#xff09;&#xff0c;确保验证逻辑的类型安全。表达性&a…

Docker高级篇之Docker微服务实战

文章目录 1. 构建一个简单的微服务项目2. 编写Dockerfile发布微服务部署到docker容器 1. 构建一个简单的微服务项目 创建一个SpringBoot项目 创建一个Controller RestController public class OrderController {Value("${server.port")private String port;Reques…

深入分析 Android BroadcastReceiver (二)

文章目录 深入分析 Android BroadcastReceiver (二)1. 深入理解 BroadcastReceiver 的高级使用和优化2. 有序广播&#xff08;Ordered Broadcasts&#xff09;2.1 实现有序广播 3. 粘性广播&#xff08;Sticky Broadcasts&#xff09;3.1 使用粘性广播 4. 本地广播&#xff08;…

阿里云 MQTT 服务器搭建与测试(上传和下发数据finish)

一、 MQTT 概念 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于 TCP/IP协议上,由 IBM 在 1999 年发布。MQTT 最大优点在于,可以以极少的代码和有限的带宽,…

CNCF项目全景图介绍

本文首发在个人博客上&#xff0c;欢迎来踩&#xff01; 云原生计算基金会&#xff08;CNCF&#xff09;介绍 CNCF(Cloud Native Computing Foundation)官网链接&#xff1a;https://www.cncf.io/ 官方的介绍如下&#xff1a; 云原生技术有利于各组织在公有云、私有云和混合…

Mysql(一):深入理解Mysql索引底层数据结构与算法

众所众知&#xff0c;MySql的查询效率以及查询方式&#xff0c;基本上和索引息息相关&#xff0c;所以&#xff0c;我们一定要对MySql的索引有一个具体到数据底层上的认知。 这一次也是借着整理的机会&#xff0c;和大家一起重新复习一下MySql的索引底层。 本节也主要有一下的…

【马琴绿绮】马维衡古琴之马氏汉风 明代杉木制;周身髹朱红色漆

【马琴绿绮式】马维衡古琴之马氏汉风 明代杉木制&#xff1b;琴体周身髹朱红色漆&#xff0c;鹿角霜灰胎&#xff1b;形体壮硕、风格高古&#xff1b;音色松透、浑厚&#xff0c;音质纯净&#xff0c;按弹舒适&#xff0c;手感丝滑。

【vue实战项目】通用管理系统:图表功能

目录 前言 1.概述 2.数据概览页 2.1.柱状图 2.2.折线图 2.3.地图 前言 本文是博主前端Vue实战系列中的一篇文章&#xff0c;本系列将会带大家一起从0开始一步步完整的做完一个小项目&#xff0c;让你找到Vue实战的技巧和感觉。 专栏地址&#xff1a; https://blog.csd…

Vue3【十三】watch监视

Vue3【十三】watch监视 Vue3 中的watch祝你能监视以下四种数据 ref 定义的数据reactive定义的数据函数返回一个值一个包含上述内容的数组 案例截图 目录结构 案例代码 Person.vue <template><div class"person"><!-- <h1>Watch情况1&#xff…

遗址博物馆ar互动展示软件提供丰富的趣味化体验

在自然博物馆的每一个角落&#xff0c;都隐藏着大自然的奥秘与魅力。为了让每一位参观者都能深入体验、探索这些奥秘&#xff0c;我们引入了前沿的AR技术&#xff0c;为您带来一场前所未有的沉浸式自然之旅。 步入博物馆&#xff0c;您手中的AR相机将成为您的更佳向导。自然博物…