赞
踩
Gigabit Transceiver 吉比特收发器,通常也叫高速收发器、GT收发器、serdes(串化解串器,串化/解串、ser/des,serializer and deserializer),它是嵌入在FPGA内部的硬核,一般线速率可达Gbps。不同厂商会有自己的GT收发器,虽然设计的结构有所差异,但其内部的编码以及电平标准都是相同的,所以不同厂商间的器件也可以进行超高速的数据互传。通常听说的GTX、GTH、GTZ、GTY都属于Xilinx的GT收发器,它们的区别主要是线速率不同,本篇文章主要以Xilinx的官方手册ug476为基础,介绍了GTX和GTH两种收发器,GTX收发器的支持线路速率从500 Mb/s到12.5 Gb/s,GTH收发器为13.1 Gb/s。
GT收发器其实就是我们osi模型中的phy层(物理层),一边跟我们的FPGA相连,一边与信号传输接口相连,它就相当于一个通道,把我们FPGA上层封装好的数据,在这个通道里面进行编码处理,并串转换,然后转化为模拟信号从传输接口发送出去,同时也可以把接收到的模拟信号转化为数字信号,然后进行串并转换与解码之后送回给FPGA。
因为高速通信不同于我们的同步通信与异步通信,比如在同步通信中我们的主机和从机在发送数据的同时会有一根同步的时钟线,用作我们数据采集的时钟,但是在高速通信中,时钟频率很高,对于PCB布线的要求也很高,如果时钟线和数据线的长度有差异或者出现时钟抖动时,那么随着数据源源不断的传输就有可能产生数据无法满足建立时间与保持时间的要求从而发生数据错误。因此就用到了一种时钟数据恢复技术CDR(Clock Data Recovery),这种传输只有数据线,没有时钟线,接收端会根据在GT收发器里面编码后的数据恢复出时钟,并通过PLL对时钟相位进行调整,使调整后的时钟相位处于数据的最佳采样点,以保证数据采集的准确性与稳定性。
GT收发器位于FPGA芯片的边缘位置,以Xilinx的官方手册ug476给出的Kintex-7 XC7K325T FPGA为例,它有4个GTX Quad,通常我们也称为GT BANK,每个GT BANK有4个GT收发器通道(GT Channel),每个通道就是一个GT收发器,如下图:
GT收发器内部主要由两部分组成,PMA(Physical Medium Attachment 物理媒介适配层)和PCS(Physical Coding Sublayer 物理编码子层),PMA主要负责模拟信号处理,PCS主要负责数字信号处理。
PCS的主要作用是:
PMA的主要作用是:
每个GT BANK有两个参考时钟,如下图,每个参考时钟进来之前都会先经过一个IBUFDS_GTE2的原语,这个原语的作用就是把输入的差分时钟转为单端时钟,IBUFDS_GTE2原语跟我们用的IBUFDS原语的区别在于IBUFDS_GTE2用于高速传输的参考时钟输入,IBUFDS用于低速传输的参考时钟输入。
每个参考时钟进来之后有两条路径,一条路径给到GTXE2_COMMON里面的Quad PLL,一条路径给到每个通道专属的Channel PLL,使用的时候QPLL和CPLL两个锁相环生成的时钟都可以使用,区别在于线速率不同时选择的时钟不同,一般线速率小于6Gb/s时首选CPLL,大于6Gb/s时选择QPLL。官方手册也给出了线速率的计算方法,如下图:
有的人会问这个GT COMMON是干嘛用的,怎么会多出来一个GT COMMON,你可以把它理解为就是为了放QPLL的,而CPLL是放在了每个GT通道里面。
我们在使用GT收发器的时候有6个输入时钟可以选择,分别是两个它自己的专用参考时钟和两对南北参考时钟。也就是一个GT BANK还可以被其它相邻两个BANK的时钟驱动(南北时钟),如下图:
上面那张图中的GTREFCLK0~1是当前GT BANK自己的输入参考时钟,南北参考时钟GTNORTHREFCLK0~1和GTSOUTHREFCLK0~1是相邻两个GT BANK的输入参考时钟,那为什么要分南北呢,其实就是一个叫法,根据GT BANK的分布来的,官方手册上说呢对于当前GT BANK来说,它上面那个GT BANK的输入时钟就叫做南时钟,下面那个GT BANK的输入时钟叫做北时钟,这跟我们传统理解的上北下南刚好相反。图中还有一个时钟是GTGREFCLK,这个时钟是由内部FPGA逻辑生成的参考时钟,保留这个时钟输入仅用于内部的测试,具体什么测试官方手册上也没看到,反正咱们实际中也没用到。
从下面那张图中还可以看出一个输入的差分时钟最多能驱动12个GT收发器(当前GT BANK,南北GT BANK),那为什么一个时钟还要能驱动相邻的两个GT BANK呢,其实就是因为一些接口的设计中一个GT BANK里面四个GT通道不够用,比如PCIE x8需要用到两个GT BANK,他们的时钟需要同步,所以需要来自同一时钟源。
弹性buffer就是用于时钟同步的,由于接受端从数据中恢复出来的时钟XCLK与PCS中的时钟RXUSRCLK并不能完全同步,所以需要弹性buffer来进行调整。
时钟修正是用于XCLK和RXUSRCLK的频率不匹配的情况下,在弹性buffer中进行调整,使其同步的,它的做法也很简单就是通过往数据中插入一个或多个特定的字符,使读取地址和写地址在移动时的指针差异保持相同。当两边时钟读快写慢时,在读数据中插入特殊字符以将指针差重新调整到正常条件,当写快读慢时,在读数据中删除特殊字符,将指针差重新调整到正常状态。如下图:
K28.5是一种K码,这是8B/10B的编码方式,也就是把一个8bit的数拆成高3bit+低5bit的形式,把3bit数编码成4bit,把5bit编码成6bit,组成一个10bit(6bit+4bit)的数。k码是逗号码,也就是comma,只作为控制字符出现,可以作为帧的开始和结束标志或者用于字节对齐,D码是8B/10B编码的数据码。那么K28.5的命名怎么来的呢,就是把高3bit的十进制数做为小数点后面的数,低5bit的十进制数做为小数点前面的数,K28.5的源码就是1011_1100,也就是16进制的0xBC。
通常也叫逗号对齐,由于GT收发器在发送数据的时候是串行连续发送的,那么接收端把数据恢复为并行数据时就很难识别出来哪里是一个数据的起点,哪里是终点,应该从哪里开始去截取数据,有可能截取的数据一半来自上个数据一半来自下个数据,所以这个时候就需要一个特定的字符来把数据的边界给表示出来,为了使数据与边界对齐,发送端发送一个可识别的序列,也就是一段特定的二进制编码,通常称为逗号,这个逗号就可以用K码,比如K28.5,接收端在传入的数据中寻找逗号,当它找到逗号时,就找到了字节的边界,这样接收到的并行数据与发送的并行数据才是匹配的。如下图显示了一个带有10比特逗号的对齐方式,逗号右边的数据是未对齐的数据,中间是逗号,逗号左边以及所有后续数据都对齐到正确的字节边界上。
GT收发器的使用通常会伴随DRP的使用,那什么是DRP呢?
DRP全称是Dynamically Reconfigurable Processer,即动态可重配置处理器,能够动态的调整硬件运算单元的逻辑电路,简单来说就是能够在运行时动态地重新配置部分收发器的设置,而不需要重新编程整个FPGA。这使系统可以灵活地调整收发器的参数以适应不同的通信需求。
以上就是对GT收发器基本概念的简单介绍。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。