FPGA的GT高速收发器

📅 2026/6/29 22:03:00
FPGA的GT高速收发器
在本文中我将首先对GT高速收发器进行概括接着设计IP核并对example文件和信号进行分析。主要参考资料来源于赛灵思官网IP核:UserGuide:ug476_7Series_Transceivers_2.pdf1. 什么是GT高速收发器它是集成在FPGA芯片内部的固定电路因此我们只需要关心该固定电路与FPGA的逻辑部分接口时序即可它是串行收发器发送出去只有1bit数据而接收端也是1bit线。但FPGA与该器件的接口数据是多bit的因此该收发器同时也是一个高速并串转换器。它是高速收发器一般线速率可达Gbps。GT分为不同系列在不同的系列中有不同的速度2. GT高速收发器的结构1整体结构如下图所示GT的基本单位为Quad每个Quad包含四个通道Channel四个对应的CPLL以及一个QPLL。图中我们开启了GTH_X1Y4Q1的通道1那么可以看出对应的CPLL和Channel就建立了连接。CPLL只能给对应的通道提供时钟而QPLL可以同时给一个Quad中的四个Channel同时提供时钟。那CPLL和QPLL的时钟是从哪来的答案是外部时钟REFCLK。具体REFCLK是如何突破重重险阻按照GT要求的复杂规则供给给CPLL和QPLL的将在下一篇有关时钟的文章中讲到。值得注意的是每个Quad都有对应的REFCLK.比如Q1的参考时钟就是REFCLK1_Q1和REFCLK0_Q1Q2的就是REFCLK1_Q2和REFCLK0_Q2。而GT有一个特性就是每个参考时钟可以和自己相邻的两个Q同时提供时钟。例如我们现在有Q1Q2Q3Q4那么Q2的参考时钟REFCLK1_Q2可以同时给Q1Q2Q3提供时钟Q1的参考时钟因为排在第一位而且不存在Q0所以只能给Q1和Q2提供时钟。如下图所示假如现在是Q2QPLL的输入可以是GTREFCLK0/1自身的参考时钟可以是GTNORTHREFCLK0/1自身北方的即Q3的参考时钟可以是GTSOUTHREFCLK0/1自身南方的即Q1的参考时钟也可以是GTGREFCLKFPGA内部逻辑产生的参考时钟。此输入仅用于内部测试目的这样做的好处是1节省了时钟源个数节省了走线2节省了外部引脚个数假如我们使用三个GT收发器Q1Q2Q3则只给中间的Q2下图中的MGTREFCLKP/N是外部参考时钟输入同GTREFCLK1_Q1等。在这里是差分时钟输入经过原语IBUFDS_GTE2之后变成单端时钟对CPLL和QPLL提供参考时钟。2具体每个CHANNEL的结构如下图所示从收发流程来看可以分为四部分FPGA与TX CHANNEL的接口TX CHANNEL与外部管脚RX CHANNEL与外部管脚FPGA与RX CHANNEL的接口而在仿真过程中我们也只需要关心这四部分信号即可接下来创建IP核观察3. GT高速收发器IP核创建第一页第二页第三页第四页有关逗号码首先8B/10B编码是把一个8bit数通过某种编码变成10bit数并且得出的10bit数中的0和1的个数更平衡以此减少直流分量。8B/10B编码是由高3位的3B/4B编码加上5B/6B编码组成的而K28.5就是由5101和2811100组成即10111100十六进制则是BC。经过编码表变成10bit数。那么为什么要使用逗号码如下所示串行收发器接收到一个一个的1bit数据就像汉字一样接收到一个一个的汉字。我们需要逗号把汉字隔开才能明白句子的意思而数据也一样。如下图所示左边为发送端的并行数据右边为接受端的并行数据。当接收到逗号码之后才开始接收Data1有点类似于开始符。发送端和接收端与FPGA的接口除之前定义的32bit数之外还有4个1bit组成的4bit CHARISK数据。TXCHARISK端口用于指示TXDATA上的数据是K个字符还是常规数据。8B/10B编码器检查接收到的TXDATA字节以匹配任何K字符如果对应的TXCHARISK位驱动为高。简单来说当TXCHARISK拉高编码器就把该数据编码为逗号否则编码为普通数据。当接收检测到逗号码的时候对应RXCHARISK会拉高。来辅助接收端把数据进行对齐当勾选了IP核中的RXSLIDE就需要手动产生RXCHARISK。第五页第六页第七页4. IP核产生的example文件在IP核界面右键点击Open IP Example Design生成自带的自发自收例程1FPGA1_GTH_Interface_exdes.v为整体工程的TOP文件输入输出端口分别为Q2_CLK0_GTREFCLK_PAD_N/P_IN外部差分输入参考时钟SYSCLK_IN_P/N系统时钟TXP/N_OUT发送1bit差分输出RXP/N_IN接收1bit差分输入以及GT发送接收CPLL和QPLL的复位2FPGA1_GTH_Interface_support.v该文件主要例化了GT高速收发器的IP核并对时钟进行了配置例如FPGA与GT的接口32bit的待发送数据gt0_txdata_in32bit的接收数据gt0_rxdata_out3FPGA1_GTH_Interface_GT_FRAME_GEN.v该文件用于产生发送数据的来源本质上是从ROM中读取数据。4FPGA1_GTH_Interface_GT_FRAME_CHECK.v该文件用于接收到数据后与文件中的数据源进行比对并且记录下错误的数据个数。5FPGA1_GTH_Interface_TB.v在说此文件之前我想说一声LOOPBACK的问题。从手册中得知收发器有专门的回环模式进行测试即进行自发自收如下图所示有四个通道。那么我们测试的时候怎么看工程中选择哪种路径呢即搜索LOOPBACK变量在TOP文件中我们发现LOOPBACL居然设置的是0即Normal 模式并没有进行回环测试如下图。那么本例是如何实现的呢观察TB文件111行这里是直接在仿真中把发送端和接收端用线连在一起实现回环测试6观察Modelsim仿真结果生成IP Example之后我们不需要进行任何代码的修改直接点击Run Simulation即可开始仿真。已知本例的功能是自发自收因此我们需要关注的信号只有四个FPGA1_GTH_Interface_support.v中的gt0_txdata_ingt0_txcharisk_in gt0_rxcharisk_out gt0_rxdata_out发送端自从gt0_txcharisk_in变为0001开始第一个发送数据为060504bc后续依次为0a090807,0e0d0c0b……接收端可以看出自从gt0_rxcharisk_out变为0001开始接收数据依次为060504bc0a090807,0e0d0c0b……和发送端一致。说明测试成功总结GT高速收发器的IP Example已经具有相当完备的功能。后续操作只需要对该模板进行修改即可若想要发送自己想要的序列只需要改动FPGA1_GTH_Interface_GT_FRAME_GEN.v文件即可。若想要改变接受序列及后续操作只需要改FPGA1_GTH_Interface_GT_FRAME_CHECK.v文件即可。有关时钟相关内容将在下一篇笔记在叙述强烈建议学习过程中阅读完各种各样的博客有了大致概念之后就开始阅读User Guide。