GTY高速收发器(一):基本架构和时钟架构
最近在学习高速收发器相关内容,本系列将结合Xilinx官方手册UG578及个人理解,对于GT收发器的一些主要内容进行整理和记录。本文主要介绍GTY的基本架构和时钟架构。
1. GTY简介
通过DS890手册可以查询到我们手头的芯片,拥有76个GTY收发器,无GTM收发器,这个需要更高级别的芯片才会有,如下图所示:
/image-2.png)
UltraScale 架构中的 GTY 收发器是高能效的收发器,在 UltraScale FPGA 中支持 500 Mb/s 到 30.5 Gb/s 的线速率,在 UltraScale+ FPGA 中则支持到 32.75 Gb/s 的线速率。
4个GTYE3/4_CHANNEL
和 1个GTYE3/4_COMMON
形成一个 Quad,如下图所示。GTY 收发器原语在 UltraScale FPGA
中称为 GTYE3_COMMON 和 GTYE3_CHANNEL,在 UltraScale+ FPGA 中称为
GTYE4_COMMON 和 GTYE4_CHANNEL。
/image.png)
GTYE3/4_COMMON 原语包含两个LC谐振回路PLL(QPLL0和QPLL1)。仅当应用中需要使用该PLL时,才需要实例化 GTYE3/4_COMMON 原语。QPLL 中的 Q 表示 Quad,表示这个 PLL 是为 Quad 中的 4 个通道共享的。QPLL 用于为 Quad 中的所有通道提供时钟。
GTYE3/4_CHANNEL 原语由 Channel PLL(CPLL)、发射端和接收端组成。之所以叫做 Channel PLL,是因为它是一个独立的 PLL,用于为每个通道提供时钟。每个 GTYE3/4_CHANNEL 原语都有一个独立的 CPLL。
一个 GTYE4_CHANNEL 就是我们常说的一个 GT Transceiver,一个 Quad 就是四个 GT Transceiver。在一个 Quad 中,四个 GT Transceiver 共享一个 GTY_COMMON,也就是共享时钟。
GT收发器的TX发送端和RX接收端功能独立,且均由
PMA(Physical Media Attachment,物理媒介适配层)
和
PCS(Physical Coding Sublayer,物理编码子层)
两个子层组成,如下图所示:
/image-1.png)
PMA子层内部集成了高速串并转换、预加重、接收均衡、时钟发生器及时钟恢复等电路(模拟电路部分)。 SERDES是一个串并转换器,负责FPGA内部的并行数据与GTY接口串行数据之间的转换。 预加重技术是针对典型物理连接系统中高频部分的补偿,在发送端加一个高通滤波器,放大高频成分,提高信号质量。预加重只在必要情况下使用,因为预加重会导致功耗和EMC辐射的增加。 接收均衡主要用于补偿由频率不同而引起的阻抗/衰减差异。 时钟发生器及时钟恢复电路在发送端将时钟与数据绑定发送,在接收端对接收到的数据流恢复时钟,从而避免了在高速传输条件下时钟与数据分开传输所带来的时钟抖动等问题。
PCS子层内部集成了8b/10b编/解码、弹性缓冲区、通道绑定和时钟修正等专用电路模块。 8b/10b编码可以避免数据流中出现连续的‘0'或‘1'的情况,避免数据传输的不平衡。 利用通道绑定通过在发送数据流中加入K码字符,将多个物理上独立的GTY通道绑定成一个时序逻辑上同步的并行通道,通过增加GTY通道数可以提高接口传输的吞吐率。 弹性缓冲区解决恢复时钟与本地时钟的不一致问题,并通过对缓存区中的K码匹配对齐实现通道绑定功能。
Transmitter的数据流大致为:FPGA用户逻辑的数据,进入FPGA TX接口,进入PCS,再经过PMA,转换为高速串行数据输出。Receiver的数据流大致为:数据由PMA部分接收,转换为并行数据进入PCS,再经过RX接口输出给FPGA用户逻辑处理。
关于 PMA 和 PCS 内部的细节,在后续的文章会逐步深入。
2. GTY的时钟架构
如下图所示,差分时钟进入FPGA之后,先经过 IBUFDS_GTE3/4 转换为单端时钟,然后作为 QPLL 或者 CPLL 的时钟输入,QPLL 或者 CPLL 的输出时钟作为发送和接收部分的时钟信号。
/image-3.png)
当参考时钟来自 GTYE3/4_COMMON 的 QPLL 时,必须实例化 GTYE3/4_COMMON 原语。又每个通道包含一个通道锁相环( Channel PLL,CPLL ),因此,参考时钟可以直接连接到 GTYE3/4_CHANNEL 原语,此时不需要实例化 GTYE3/4_COMMON 原语。
2.1 参考时钟输入/输出结构
GTY 收发器中的参考时钟结构支持两种操作模式:输入模式和输出模式。在输入工作模式下,在专用参考时钟 I/O 引脚上提供时钟,用于驱动 Quad 或 Channel PLLs。在输出工作模式下,来自于同一 Quad 内四个通道中任意一个恢复时钟 (RXRECCLKOUT) 都可以路由到专用参考时钟 I/O 引脚。 然后,此输出时钟可用作不同位置的参考时钟输入。运行过程中无法改变操作模式。
2.1.1 参考时钟输入结构
/image-4.png)
2.1.2 参考时钟输出结构
参考时钟输出模式可通过两个软件原语之一实现:OBUFDS_GTE3/4_ADV 和 OBUFDS_GTE3/4。原语的选择取决于具体的应用。当 RXRECCLKOUT 始终来自同一通道时,请使用 OBUFDS_GTE3/4。如果提供 RXRECCLKOUT 的通道在运行时可能会发生变化,请使用 OBUFDS_GTE3/4_ADV。使用 OBUFDS_GTE3/4_ADV 原语时,必须实例 GTHE3/4_COMMON 原语。使用 OBUFDS_GTE3/4 原语时,不需要实例化 GTHE3/4_COMMON。
/image-5.png)
/image-6.png)
GTHE3/4_COMMON 上的端口 RXRECCLK0_SEL 和 RXRECCLK1_SEL 控制多路复用器,该多路复用器从 Quad 中的四个不同通道中选择 RXRECCLKOUT。
参考时钟有输入输出两种模式,区别在于输入模式参考的时钟源来自于外部的专用参考时钟引脚,输出模式下参考时钟通过从 Quad 中的 Channel 中恢复出来的 RXRECCLKOUT 路由而来。
2.2 参考时钟方案选择
从架构上看,Quad(Q)包含四个 GTHE3/4_CHANNEL 原语、一个 GTHE3/4_COMMON 原语、两个专用外部参考时钟引脚对和专用参考时钟路由。每个收发器使用中必须实例化 GTHE3/4_CHANNEL 原语。如果需要高性能 QPLL,还必须实例化 GTHE3/4_COMMON 原语。通常,Quad(Q(n))的参考时钟可以通过 GTNORTHREFCLK 从最多下方两个位置的 Quad(Q(n–1) 或 Q(n-2))获取,或通过 GTSOUTHREFCLK 从最多上方两个的 Quad(Q(n+1) 或 Q(n+2))获取。(即当前 Quad 的参考时钟可以通过南北不超过2个 Quad 区域的参考时钟路由而来)。
Quad 中的每个 GTY 收发器通道都有六个可用的时钟输入:
(1)两个本地参考时钟引脚对:GTREFCLK0 或 GTREFCLK1
(2)上方 Quad 的两个参考时钟引脚对:GTSOUTHREFCLK0 或 GTSOUTHREFCLK1
(3)下方 Quad 的两个参考时钟引脚对:GTNORTHREFCLK0 或 GTNORTHREFCLK1
单个 GTHE3/4_COMMON 原语内的参考时钟多路复用器结构如下图所示:
/image-7.png)
单个 GTHE3/4_CHANNEL 原语内的参考时钟多路复用器结构如下图所示:
/image-8.png)
2.2.1 单个外部参考钟使用模型
下图显示了单个外部参考时钟连接到单个 Quad 内的多个收发器。
/image-9.png)
下图展示了单个外部参考时钟连接到多个 Quad 内的多个收发器。
/image-10.png)
共享参考时钟时必须遵守以下规则,以确保满足高速设计的抖动裕度:
源 Quad 上方的 Quad 数量不得超过两个。
源 Quad 下方的 Quad 数量不得超过两个。
外部时钟引脚对 (MGTREFCLKN/MGTREFCLKP) 作为源的 Quad 总数不得超过五个 (或者说作为源的收发器不能超过20个)。
2.2.2 多个外部参考时钟使用模型
下图展示了同一 Quad 中多个 GTY 收发器使用多个参考时钟。
/image-11.png)
图13和图14给出了属于一个 Quad 的收发器如何使用 GTNORTHREFCLK 和 GTSOUTHREFCLK 端口从另一个 Quad 访问专用参考时钟的例子。在每个 GTY 收发器 PLL 有多个参考时钟选项的情况下,用户设计需要根据设计需求设置 QPLL0/1REFCLKSEL[2:0] 和 CPLLREFCLKSEL[2:0]。
/image-12.png)
/image-13.png)
上面的 Quad 位于下面 Quad 的北面,那么下面的 Quad 可以将北面 Quad 的差分时钟通过 GTSOUTHREFCLK0、GTSOUTHREFCLK1 端口作为自己的 QPLL 的时钟输入。
同样的道理下面的 Quad 位于上面 Quad 的南面,上面 Quad 可以通过 GTNORTHREFCLK0、GTNORTHREFCLK1 把下面 Quad 的差分时钟作为自己的 QPLL 的输入时钟。
注意这里的 NORTH 和 SOUTH 不是表示时钟来自 NORTH 还是 SOUTH,而是表示自己 Quad 所在的位置。举个例子,Quad0、Quad1 和 Quad2 从北到南依次排布,Quad1 位于正中,那么从 Quad0 也就是北边来的时钟就要接到 GTSOUTHREFCLK0 和 GTSOUTHREFCLK1 这两个端口,因为 Quad1 相对于 Quad0 它处于南边;同样的从 Quad2 也就是南边来的时钟就要接到 GTNORTHREFCLK0 和 GTNORTHREFCLK1 这两个端口,因为 Quad1 相对于 Quad2 它处于北边。