GTX IP配置完了,你不得搞个回环测试一番?


汇总篇:

Xilinx FPGA平台GTX简易使用教程(汇总篇)


目录

前言

一、示例工程Example Design

1.1 gtx_support模块

1.1.1 gt_usrclk_source

1.1.2 gt_common

1.1.3 gt_common_reset

1.2  frame_gen

1.3 frame_check

二、GTX收发测试

2.1 对support模块的整合

2.2发送模块

2.3接收模块

2.4仿真验证

后记


前言

理解一个IP的用法,最好的办法就是打开官方的Example Design。

所以本文首先介绍Example Design,然后再替换成我们自己的收发测试模块,对比印证学习,差不多就能勉强把GTX给玩起来了。

一、示例工程Example Design

接上一讲(四)GTX IP核的配置:

我们配置GTX为:3.125G , 参考时钟156.25Mhz ,然后生成了GTX的IP。

首先,右键IP打开Example Design。

打开示例工程后,看到如下图所示的工程结构:

先简单概括下,示例工程的组成结构,如下图所示的拓扑图:

OK,接下来我们对每个子模块进行分别介绍。

1.1 gtx_support模块

support子模块为GTX主要模块。包含GTX的时钟、复位以及对原语/IP的例化使用。

Xilinx为了IP核的通用性,将每个IP的端口设置非常完善也意味着非常复杂。端口信号众多,导致我们一阵头大,不知从何下手,所以这里直接上干货,简要解析各个端口信号,哪些是使用的,哪些是不用的。

PS:很多端口都没有使用,要么置0,要么置1 。

所以,引用B站名言:“消除恐惧的最好办法就是面对恐惧,奥利给!”

直接上代码: 详见后面注释内容!

注:很多功能我们没有用上,所以给的0,实际使用根据具体需求而定。

ip_gtx ip_gtx_init_i(.sysclk_in                      (sysclk_in_i),                      //系统时钟.soft_reset_tx_in               (soft_reset_tx_in),                   //0.soft_reset_rx_in               (soft_reset_rx_in),                  //0 .dont_reset_on_data_error_in    (dont_reset_on_data_error_in),      //0.gt0_tx_fsm_reset_done_out      (gt0_tx_fsm_reset_done_out),     //output.gt0_rx_fsm_reset_done_out      (gt0_rx_fsm_reset_done_out),        //output.gt0_data_valid_in              (gt0_data_valid_in),                //1//GT0  (X1Y0)//------------------------------- CPLL Ports -------------------------------.gt0_cpllfbclklost_out          (gt0_cpllfbclklost_out), .gt0_cplllock_out               (gt0_cplllock_out), .gt0_cplllockdetclk_in          (sysclk_in_i),                         //系统时钟.gt0_cpllreset_in               (gt0_cpllreset_in),               //0//------------------------ Channel - Clocking Ports ------------------------.gt0_gtrefclk0_in               (tied_to_ground_i),              //0.gt0_gtrefclk1_in               (q0_clk1_refclk_i),              //参考时钟//-------------------------- Channel - DRP Ports  --------------------------.gt0_drpaddr_in                 (gt0_drpaddr_in),                     //0.gt0_drpclk_in                  (sysclk_in_i),                       //系统时钟.gt0_drpdi_in                   (gt0_drpdi_in),                   //0.gt0_drpdo_out                  (gt0_drpdo_out),                     //0.gt0_drpen_in                   (gt0_drpen_in),                  //0.gt0_drprdy_out                 (gt0_drprdy_out),                    //0.gt0_drpwe_in                   (gt0_drpwe_in),                  //0//------------------------- Digital Monitor Ports --------------------------.gt0_dmonitorout_out            (gt0_dmonitorout_out),               // output //----------------------------- Loopback Ports -----------------------------.gt0_loopback_in                (gt0_loopback_in),                    //0//---------------------------- Power-Down Ports ----------------------------.gt0_rxpd_in                    (gt0_rxpd_in),                       //0.gt0_txpd_in                    (gt0_txpd_in),                       //0//------------------- RX Initialization and Reset Ports --------------------.gt0_eyescanreset_in            (gt0_eyescanreset_in),               //0.gt0_rxuserrdy_in               (gt0_rxuserrdy_in),              //1//------------------------ RX Margin Analysis Ports ------------------------.gt0_eyescandataerror_out       (gt0_eyescandataerror_out),      // output .gt0_eyescantrigger_in          (gt0_eyescantrigger_in),          //0//----------------------- Receive Ports - CDR Ports ------------------------.gt0_rxcdrhold_in               (gt0_rxcdrhold_in),              //0//----------------- Receive Ports - Clock Correction Ports -----------------.gt0_rxclkcorcnt_out            (gt0_rxclkcorcnt_out),               // output//---------------- Receive Ports - FPGA RX Interface Ports -----------------.gt0_rxusrclk_in                (gt0_rxusrclk_i),                  // rxusrclk.gt0_rxusrclk2_in               (gt0_rxusrclk2_i),                   // rxusrclk2//---------------- Receive Ports - FPGA RX interface Ports -----------------.gt0_rxdata_out                 (gt0_rxdata_out),                   // 接收数据//----------------- Receive Ports - Pattern Checker Ports ------------------.gt0_rxprbserr_out              (gt0_rxprbserr_out),                 // output .gt0_rxprbssel_in               (gt0_rxprbssel_in),               // 0//----------------- Receive Ports - Pattern Checker ports ------------------.gt0_rxprbscntreset_in          (gt0_rxprbscntreset_in),            // 0//---------------- Receive Ports - RX 8B/10B Decoder Ports -----------------.gt0_rxdisperr_out              (gt0_rxdisperr_out),                // output.gt0_rxnotintable_out           (gt0_rxnotintable_out),            // output //------------------------- Receive Ports - RX AFE -------------------------.gt0_gtxrxp_in                  (gt0_gtxrxp_in),                  // 管脚RXP//---------------------- Receive Ports - RX AFE Ports ----------------------.gt0_gtxrxn_in                  (gt0_gtxrxn_in),                    // 管脚RXN//------------------- Receive Ports - RX Equalizer Ports -------------------.gt0_rxdfelpmreset_in           (gt0_rxdfelpmreset_in),             // 0.gt0_rxmonitorout_out           (gt0_rxmonitorout_out),             // 0.gt0_rxmonitorsel_in            (gt0_rxmonitorsel_in),              // 0//------------- Receive Ports - RX Fabric Output Control Ports -------------.gt0_rxoutclkfabric_out         (gt0_rxoutclkfabric_out),           // output //----------- Receive Ports - RX Initialization and Reset Ports ------------.gt0_gtrxreset_in               (gt0_gtrxreset_in),               // 0.gt0_rxpmareset_in              (gt0_rxpmareset_in),                // 0//----------------- Receive Ports - RX8B/10B Decoder Ports -----------------.gt0_rxchariscomma_out          (gt0_rxchariscomma_out),            // output .gt0_rxcharisk_out              (gt0_rxcharisk_out),              // rxcharisk //------------ Receive Ports -RX Initialization and Reset Ports ------------.gt0_rxresetdone_out            (gt0_rxresetdone_out),                 // output //------------------- TX Initialization and Reset Ports --------------------.gt0_gttxreset_in               (gt0_gttxreset_in),               // 0.gt0_txuserrdy_in               (gt0_txuserrdy_in),                 // 1//-------------- Transmit Ports - 8b10b Encoder Control Ports --------------.gt0_txchardispmode_in          (gt0_txchardispmode_in),            // 0.gt0_txchardispval_in           (gt0_txchardispval_in),             // 0//---------------- Transmit Ports - FPGA TX Interface Ports ----------------.gt0_txusrclk_in                (gt0_txusrclk_i),                   // txusrclk.gt0_txusrclk2_in               (gt0_txusrclk2_i),                   // txusrclk2//---------------- Transmit Ports - Pattern Generator Ports ----------------.gt0_txprbsforceerr_in          (gt0_txprbsforceerr_in),            // 0//-------------------- Transmit Ports - TX Buffer Ports --------------------.gt0_txbufstatus_out            (gt0_txbufstatus_out),              // output //---------------- Transmit Ports - TX Data Path interface -----------------.gt0_txdata_in                  (gt0_txdata_in),                  // 发生数据//-------------- Transmit Ports - TX Driver and OOB signaling --------------.gt0_gtxtxn_out                 (gt0_gtxtxn_out),                    // 管脚TXN.gt0_gtxtxp_out                 (gt0_gtxtxp_out),                   // 管脚TXP//--------- Transmit Ports - TX Fabric Clock Output Control Ports ----------.gt0_txoutclk_out               (gt0_txoutclk_i),                   // output .gt0_txoutclkfabric_out         (gt0_txoutclkfabric_out),         // output .gt0_txoutclkpcs_out            (gt0_txoutclkpcs_out),                // output //------------------- Transmit Ports - TX Gearbox Ports --------------------.gt0_txcharisk_in               (gt0_txcharisk_in),               // txcharisk//----------- Transmit Ports - TX Initialization and Reset Ports -----------.gt0_txresetdone_out            (gt0_txresetdone_out),              // output //---------------- Transmit Ports - pattern Generator Ports ----------------.gt0_txprbssel_in               (gt0_txprbssel_in),               // 0.gt0_qplloutclk_in              (gt0_qplloutclk_i),             // from  common.gt0_qplloutrefclk_in            (gt0_qplloutrefclk_i)           // from  common);

​​​​​​​1.1.1 gt_usrclk_source

GTX的时钟子模块。

学习官方例程除了学习IP的用法外,另外一点就是学习官方大佬的代码,学习优秀的代码!包括代码规范、实现方式以及模块划分。

我们自己做项目的时候也要注意这一点,时钟最好单独设计为一个时钟子模块,提供整个工程所需的全部逻辑内部时钟。

用个框图来表示这个模块的功能:

至于具体实现方式,也很简单,用了两个原语:IBUFDS 、BUFG。

后面空了会详细出一个系列专讲Xilinx原语。

想要更多了解GTX的时钟,欢迎翻阅本系列第二篇(二)GTX时钟篇。

Xilinx FPGA平台GTX简易使用教程(二)GTX时钟篇

​​​​​​​1.1.2 gt_common

这个模块主要是对GTXE2_COMMON原语的例化。

原语内容较多,这里不进行介绍。保持默认就好。

​​​​​​​1.1.3 gt_common_reset

顾名思义,这个模块是对common的复位,也就是对QPLL的复位。保持默认就好。

实际上,我们进一步研究示例就会发现,该复位根本没有使用!为什么呢?不复位也能正常工作?对复位有兴趣的欢迎翻阅系列第三篇(三)GTX复位与初始化。

Xilinx FPGA平台GTX简易使用教程(三)GTX复位与初始化

​​​​​​​1.2  frame_gen

开门见山的说,这就是一个数据产生模块。只用于仿真测试,仔细研究你就发现它数据产生的方式比较有意思:从文件中读取!我们再回到工程结构目录,会看到有两个Data Files:

gt_rom_init_rx.dat、gt_rom_init_tx.dat

一个发送数据的文件,一个接收数据的文件。

再打开发送这个文件,如下图所示:

至于具体怎么实现文件数据读取,后面空了笔者也会出一篇文章,介绍在仿真中,对文件的读和写。

​​​​​​​1.3 frame_check

数据检查模块,将接收到的数据和发送的数据进行比对,如果有误,就给error信号。可以学习这种设计思路,保障数据收发的准确性。

二、GTX收发测试

GTX的示例工程基本介绍完毕,但是那毕竟是别人的。如果我们自己想把GTX跑起来呢?很简单,把示例工程的frame_gen数据产生模块删掉,换上我们自己的发送数据模块packet_send;将frame_check数据检查模块删掉,换上我们自己的接收数据模块packet_recv。最后加个TOP顶层,将packet_send、packet_recv、gt_support三个模块连起来就好。

注:测试工程为回环,发送端口直接怼到接收端口。

2.1 对support模块的整合

support模块前面已经介绍过,是使用GTX的核心。所以我们对GTX的使用也是基于该模块。

直接上干货吧,需要做以下改动:

  1. 将发送/接收数据端口开放到外层,TOP才能模块连接;包含数据总线tx/rx_data和控制总线tx/rx_charisk;
  2. 将gt0_data_valid_in信号直接置1;

2.2发送模块

添加我们需要发送的数据,可以加上帧头(sof)、帧尾(eof)信号便于接收模块判断。

发送模块需要输出两个信号(这里的位宽由GTX IP配置决定):

tx_data[31:0] :需要发送的数据

tx_char[3:0]  :K码指示,每1bit对应1个字节的数据;0:表示发送的是数据;1:表示发送的是K码。

需要注意的是,在发送数据之前要先发一个K码,以便接收数据对齐。

2.3接收模块

对GTX接收到的数据进一步处理,可通过检测帧头(sof)、帧尾(eof)信号,来接收一个完整的帧数据。也可以对接收的数据与发送数据比对,检查是否有误。

没什么好讲的,略过吧。

2.4仿真验证

仿真tb文件主要产生时钟激励,和产生需要发送的数据。

因为我们是回环,所以记得tb里面将TX / RX进行短接,注意_N对_N,_P对_P。

另外值得一提的是,我们参考时候为差分输入,这里简单提供一种差分时钟的testbench写法:

wire     Q0_CLK1_GTREFCLK_PAD_N_IN;
reg      Q0_CLK1_GTREFCLK_PAD_P_IN;
wire     DRP_CLK_IN_N;
reg      DRP_CLK_IN_P;initial beginQ0_CLK1_GTREFCLK_PAD_P_IN = 0;DRP_CLK_IN_P = 0;
endalways #3.2 Q0_CLK1_GTREFCLK_PAD_P_IN = ~Q0_CLK1_GTREFCLK_PAD_P_IN;
always #5 DRP_CLK_IN_P = ~DRP_CLK_IN_P;assign Q0_CLK1_GTREFCLK_PAD_N_IN = ~Q0_CLK1_GTREFCLK_PAD_P_IN;
assign DRP_CLK_IN_N = ~DRP_CLK_IN_P;

最后,我们来看一下仿真结果:

输入: 0-100的累加数(只截取了0-7)

输出:0-100的累加数(只截取了0-7)

OK,回环完成。

后记

整个GTX的介绍到这里暂告一段落,待笔者对齐有进一步更深的理解时再做补充。补充内容可能包括具体项目应用、GT高速接口的底层原理等。

按照笔者的习惯,基本以原理介绍、系统组成、方案设计为主,而对于具体的代码,笔者是不会在文章中具体写出来的。所以,这些测试工程我后面会以文件的形式放上来。

下一个系列,我们将开始SRIO

随笔者一起,将接口撸个遍吧!

Xilinx FPGA平台GTX简易使用教程(五)GTX收发测试及示例工程介绍相关推荐

  1. Xilinx FPGA平台GTX简易使用教程(汇总篇)

    GTX简易使用教程,先"知其然",慢慢再研究"所以然". 目录 一.GTX必备基础知识 二.时钟篇 三.复位与初始化 四.GTX   IP核配置介绍 五.GTX ...

  2. Xilinx FPGA平台GTX简易使用教程(一)GTX基础知识

    理解GTX的必备姿势,学起来! 汇总篇: Xilinx FPGA平台GTX简易使用教程(汇总篇) 目录 一.什么是GTX? 二.Quad/Channel 三.PMA与PCS 四.GTX收发处理流程 五 ...

  3. Xilinx FPGA平台GTX简易使用教程(三)GTX复位与初始化

    所有IP核没有正确工作,原因一半是时钟,一半是复位. 汇总篇: Xilinx FPGA平台GTX简易使用教程(汇总篇) 目录 前言 一.复位与初始化 二.复位模式 三.CPLL复位 四.QPLL复位 ...

  4. Xilinx FPGA平台GTX简易使用教程(四)GTX IP核配置教程

    干货来了,GTX核配置,搬砖全靠它~~ 汇总篇: Xilinx FPGA平台GTX简易使用教程(汇总篇) 目录 前言 一.GTX  IP核配置界面 1.1第一页配置 1.2第二页配置 1.3第三页配置 ...

  5. Xilinx FPGA平台GTX简易使用教程(二)GTX时钟篇

    时钟就是脉搏,能否工作全靠它! 汇总篇: Xilinx FPGA平台GTX简易使用教程(汇总篇) 目录 一.参考时钟 1.1 收发测试能跑起来的基本参考时钟设置 1.2 继续了解时钟,走着 1.3 单 ...

  6. Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序

    干货来了,用DDR搬砖,只需要会用IP就好,Xilinx官方YYDS! ---------------------------------------------------------------- ...

  7. Xilinx FPGA平台DDR3设计保姆式教程(1)DDR3基础简介

    如果我们只是拿来用ddr搬砖,那么它就简单,知道IP怎么使用就好,但是要想知其所以然,理论知识是必备的,这也是我们初学者所欠缺的东西,慢慢修炼吧! 汇总篇: Xilinx平台DDR3设计保姆式教程(汇 ...

  8. Xilinx ISE系列教程(2):LED点灯工程、仿真、bit下载和mcs固化

    文章目录 @[toc] 1. 创建工程目录 2. 新建ISE工程 3. 新建verilog源文件 4. 新建testbench仿真文件 5. ISim功能仿真 6. 管脚分配和时钟约束 7. bit文 ...

  9. FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇一

    前言 DDR3 如何测试?可以使用FPGA仿真测试,这里使用MicroBlaze + MIG IP 测试 DDR3,直接通过读写DDR3来验证,因为使用IP,会很快的搭建测试环境,并且不需要了解DDR ...

最新文章

  1. ubuntu 恢复apt_apt-clone:备份已安装的软件包并在新的 Ubuntu 系统上恢复它们
  2. java mysql in_MySQL中Exists和In的使用
  3. Spring.NET学习笔记9——打造简易的依赖注入框架(练习篇) Level 100
  4. VTK:绘制Arrow箭头用法实战
  5. 【渝粤题库】陕西师范大学600001物理化学(上) 作业(专升本)
  6. 单实例oracle ha,Oracle单实例启动多个实例
  7. Python基础知识笔记(二)
  8. 自创RTSP 服务器 用多款客户端软件测试接入可以,唯独VLC接入不了
  9. vb.net的socket编程
  10. 为何天搜科技这些互联网企业对杭州情有独钟?
  11. android自定义大转盘,Android使用surfaceView自定义抽奖大转盘
  12. 【物联网方案】智慧鸡舍功能及特点
  13. 移动vue大转盘抽奖
  14. Python(贪心算法)问题 D: 删数问题_输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数。
  15. 2022最新u盘升级重装win10方法
  16. 11月YouTube全球视频点赞Top10 :碧梨、比伯、萌德、A妹神仙打架
  17. 大数据编程语言 Scala 进阶篇
  18. YML是一种数据存储格式
  19. 岁月如水-指间流逝-难觅难留
  20. 常见的HTTP状态码及HTTP状态码大全

热门文章

  1. 智能名片有哪些功能才是适合企业销售的?
  2. 暴力破解攻击工具汇总——字典很关键,肉鸡也关键
  3. CAD一个命令快速绘制箭头,真的是敲极快!
  4. 【Vue】仿小米商城系统(一)
  5. 汽车导航系统背景介绍(zz)
  6. 智能仪器及智能仪表设计的新突破--将实时安卓操作系统(RTAndroid)引入到智能仪器及智能仪表设计
  7. 权限不足 不允许访问
  8. bugku ctf decrypt
  9. AR9331出现connect-debounce failed,port 1 disabled解决方法备忘
  10. 读取中文时'utf-8' codec can't decode byte 0xa1 in position 0: invalid start byte