前文讲解了GTX的时钟及发送通道相关内容,本文讲解GTX接收通道的一些功能及其IP配置,接收往往比发送设计更难,与调制解调,加密解密其实相差不大,后者难度都比前者高出很多。GTX的接收通道的功能相比发送通道更加重要,需要从接收的串行数据中恢复数据,并且解码,字节对齐等等。
GTX接收部分的框图如下所示,也包括PCS和PMA两部分,PMA部分主要处理模拟信号,内部有均衡器、并串转换模块等,而PCS则是对接收的并行数据进行处理,包括极性翻转、8B/10B解码、弹性Buffer、字节对齐等等模块。
下面从接收通道输入数据到输出数据的方向,依次对各个模块做简要讲解:
1、模拟前端
从手册中可以获知,接收通道的开始部分有一个模拟前端,结构如下图所示,模拟前端一般就是对信号进行放大、滤波等等,消除信号传输过程中的一些干扰,并且然后端能够正常采集输入信号,该电路也是类似作用。
由于GTX的差分信号线速率很高,可以达到10.312Gb/S,并且传输距离可能会很长,导致接收数据的幅值可能很小,甚至达不到检测要求,比如输入端发送时幅值有1.5V,经过几十米的光纤传输,到接收端时,幅值可能只有600mv了。
解决方式就是在发送时,通过预加重、后加重把幅值增大一点,同时在接收时把门限降低一点,比如接收时检测幅值大于500mv就认为是高电平了,还是正确检测到衰减后的信号。
至于预加重、后加重、检测门限设置多少合适,这与实际的信号传输路径和线速率有关。一般做法是当硬件条件确定后,通过眼图对所有参数进行扫描,确定一个最合适的参数,用作后续开发的值就行了。
眼图内容在后续眼图测试时进行讲解。
2、RX OOB
GTX接收器支持解码串行ATA(SATA)和串行连接SCSI(SAS)规范中描述的带外(OOB)序列,并支持PCI Express规范中描述的信标。这个与SATA、PCIE这些协议有关,如果不使用这些协议,可以忽略,具体使用时在查阅手册即可。
3、DFE
根据功率和性能之间的系统级权衡,GTX接收通道有两种类型的自适应滤波器可以使用。其中的适用于,如果传输过程中损耗比较小,可以使用低功耗模式(LPM)的节能自适应滤波器,对应结构如下图所示。
如果传输过程中损耗比较大,传输距离远,此时应该使用DFE自适应滤波器,对应结构如下图所示。DFE通过提供更接近的滤波器参数调整来更好地补偿传输信道损耗,DFE模式是一种离散时间自适应高通滤波器,抽头值是由自适应算法设置的该滤波器的系数。
在调用IP时,如下图所示,在1处可以设置滤波器类型,短距离、低损耗首选LPM模式,节省功耗。
在2处把接收数据的幅值检测设置为可编程,之后可以通过IP端口信号gt0_txdiffctrl_in的值调节输入检测幅值。
4、RX Clock Divider
这部分与发送通道的时钟部分一致,直接去查看发送通道的原理即可。对应框图如下所示,与发送通道一摸一样,不再赘述。
注意接收端只有一对差分数据线,并没有时钟线,接收端如何采集数据线的数据呢?
接收端可以得知数据传输的频率,从而确定时钟频率,但是如何得知时钟的相位呢,发送的时候在时钟双沿完成的并串转换。由上图知,串并转换也应该是在时钟双沿进行的,此时就需要保证时钟与数据的相位关系。
因此上图中QPLL或CPLL输出时钟进入PMA之后,需要先经过CDR调整时钟相位,然后再经过分频作为串并转换模块的串行时钟和并行时钟,保证时钟与数据的相位关系正确。
时钟数据恢复(CDR)技术是从接收的串行数据中提取恢复的时钟和数据的相位关系,CDR的结构框图如下所示。
CDR原理手册中是这么说的:CDR状态机使用来自边沿和数据采样器的数据确定输入数据流的相位并控制相位插值器(PI)。边缘采样器的相位被锁定到数据流的过渡区域,而数据采样器的相位位于数据眼的中间。
具体实现方式可能就是CDR FSM能够精确控制相位,根据两个输入去调整相位偏移量,猜测是这样。
5、SIPO
串并转换模块,将接收的串行数据转换为并行数据,然后输出到PCS侧进行解析。
6、Polarity
如果PCB的RXP和RXN差分走线被意外交换,GTX接收的差分数据就会反转。GTX接收通道可以在串并转换之后对PCS中的并行字节进行反转,以抵消差分对上的反转极性。
在配置IP时勾选RXPOLARITY选项,可启用接收极性控制引脚,当gt0_rxpolarity_in信号为高电平时,接收数据极性翻转。
便于阅读,将接收通道的图在贴一遍,如下所示。
7、PRBS Checker
GTX收发器接收器包括一个内置的PRBS检查器,如下图所示,能够检测四种函数对应的PRBS序列,与前文发送端生成的四种PRBS序列保持一致。
要使用内置PRBS检查器,检测序列类似必须为与发送通道发送的PRBS序列匹配。
如果输入数据被发送器反转或RXP/RXN反转,则接收数据也应通过控制RXPOLARITY反转,否则,PRBS检查器不会锁定。
当PRBS检查器运行时,会在传入数据中查找选定的PRBS序列。当它找到该模式时,它可以通过将输入数据与预期数据进行比较来检测PRBS错误。
8、Comma Detect and Align
字节对齐,低速串口UART这种通信会有一个起始位,来判断一次传输的开始,但是GTX这类高速串行接口在传输数据时,并没有起始位、停止位这类标志,那接收端如何确定每个字节的开始位置呢?
下图是发送端发送一段数据,接收机可能因为上电等各种原因,并不是从第一位数据开始接收的,可能是从红色框开始接收第一个并行数据,也可能是从蓝色框位置接收第一个数据,也可能是紫红色框处开始接收,该如何确定哪个位置开始接收数据才能正确解析出并行数据?
这里的功能与ISERDESE的功能其实一致,需要在合适的位置接收数据,对齐方式就是通过检测规定的K码数据来调整串并转换的起始位置。
如上图所示,首先将蓝色框中的10位数据通过8B/10B解码,如果解码结果是设定的K码,则从蓝色框开始,每10位数据转换为并行数据去解码输出。
如果蓝色框中的解码结果不是K码,则将起始位置后移一位,把紫红色框中10位数据拿去解码,之后再进行比对,循环往复,直到检测到K码为止。
为了使对齐成为可能,发射机发送一个可识别的序列,即Comma,通常称为逗号。接收方在传入数据中搜索逗号,当发现逗号时,将该逗号移动到一个字节边界,以便接收的并行字与发送的并行字匹配。
如下图中1所示,字节对齐常用K码为K28.5,2处可以设置在数据的什么位置进行字节对齐检测,一般可以设置为全程检测。
2处还有个comma Mask信号,检测器支持检测部分K码的数值。如下图所示,Mask高三位设置为0,则检测K码时,不需要检测高三位,只需要低5位满足要求即可,从而实现部分检测。但一般不会这么使用,了解即可。
图13的3处Decode valid comma only勾选后,检测器就只会检测默认的K28.5和K28.1的K码。勾选Combine plus/minus commas使用双字节对齐检测,要求比较严格时才会使用。
查看图13中1处可知,当K码设为K28.5后,由于8B/10B编码的极性问题,下面会出现两种编码结果Plus Comma和Minus Comma,两种编码的各位数据相反。检测器怎么知道检测哪种编码的K码呢?通过使能图中4的ENPCOMMALIGN和ENMCOMMALIGN两个选项进行选择,与其中一种模式对齐即可。
为实现字节,GTX有两种方式,一种是自动对齐,IP默认使用自动对齐。另一种是手动对齐,勾选图13的RXSLIDE来启用手动对齐,该功能与ISERDESE一致,通过拉高一个信号来对串并转换的起始位置进行调整,如果不是需要字符,则继续调整,会比较麻烦。
RXBYTELSALIGN信号为高电平时,表示已经完成字节对齐,输出给用户的数据正确。RXBYTEREALIGN信号为高电平时,表示IP正在进行字节对齐。RXCOMMADET为高电平表示检测到K码,该信号有效几个周期。
在线路速率大于5 Gb/s且系统噪声过大的应用中,字节对齐模块可能会错误地对齐错误的字节边界,并在没有有效数据时错误地拉高RXBYTEISALIGNED信号。在此类应用中,应进行系统级检查,以检查RXBYTEISALIGNED是否符和数据的有效性。
9、8B/10B Decoder
8B/10B解码模块,将接收的10位并行数据解码位8位并行数据,具体的在8B/10B相关文章进行讲解,本文不过多叙述。
10、RX Elastic Buffer
弹性buffer主要用于解决PMA并行时钟域(XCLK)和PCS内部并行时钟域RXUSRCLK的跨时钟域问题。
XCLK是串并转换后,并行数据的时钟信号,由图7可知,QPLL或者CPLL的时钟经过CDR相位调整后作为串并转换模块的时钟。
而RXUSRCLK一般是由TXOUTCLK或者RXOUTCLK经过MMCM生成的,而TXOUTCLK或者RXOUTCLK的来源有几种,可能并不是CDR输出时钟,因此XCLK和RXUSRCLK的相位不相同,即两者是异步时钟。
需要解决两个时钟域的相位差,最简单的方法就是使用buffer,如下图所示。
与发送通道一样,接收通道提供了两种解决方式,一种是通过buffer同步数据,优点是用户不需要进行控制,硬核内部即可完成同步,缺点在于延迟比较大,如果对延迟没有要求,首选buffer,IP设置如下所示。
注意如果发送通道和接收通道的协议和速率一致,可以使用TXOUTCLK生成RXUSRCLK,原因在于同一个高速收发器的发送和接收通道共用同一个QPLL和CPLL,那么TXOUTCLK和RXOUTCLK其实可以是同一QPLL或者CPLL的参考时钟信号。
当然如果对延迟比较敏感,则可以将弹性buffer旁路,使用相位对准电路调整SIPO并行时钟域和XCLK之间的相位差,实现从SIPO到PCS可靠数据传输。还可以通过调整RXUSCLK来补偿温度、电压变化,从而执行RX延迟对齐。接收相位和延迟组合对准可以由GTX收发器自动执行或由用户手动控制。
当RX恢复时钟用于提供RXUSRCLK和RXUSRCLK2时,可以旁路RX弹性buffer以减少延迟。当RX弹性buffer被旁路时,通过RX数据路径的延迟很低且具有确定性,但时钟校正和通道绑定不可用。
相位对准电路整体还是比较复杂的,并且支持多个通道对齐,手册中也花费了大量篇幅进行讲解,如果需要该模式,还是推荐阅读手册,毕竟目前我也没有使用该模式,不好讲解。
11、RX PIPE Control与RX Geartox
这个与发送通道的 PIPE Control应该功能是一样的,与PCIE协议有关,不使用该协议时可以忽略。
RX Geartox与TX Gearbox类似,只有在使用64B/66B或者64B/67B编码的时候,才会被使用,其余时间忽略。
12、RX Status Control及时钟校正
RX Status Control对弹性buffer的一些状态进行检测,包括溢出等等,然后去做一个时钟纠正的处理。
RX弹性buffer用于同步两个不同的时钟域RXUSRCLK和XCLK的数据,XCLK是从CDR恢复的时钟。即使RXUSRCLK和XCLK以相同的时钟频率运行,频率差异也始终很小,日积月累,也会导致读写数据的速率不一致,可能造成数据溢出。
这是因为RXUSRCLK和XCLK差异决定的,并不能消除,因此提供了一种时钟纠正的方式来防止数据出现错误。为了允许校正,发送数据时需要在有效数据中周期性的插入一个或多个特殊字符,GTX接收通道可以根据需要在弹性buffer中删除或者复制这些字符。
当弹性buffer快要装满数据时,可以删除buffer中的一些特殊字符使得buffer不被溢出。当弹性buffer快要被读空时,可以复制一些特殊字符存入buffer,防止弹性buffer被读空,最终使得弹性buffer始终保持在半满的状态。
由于XCLK和RXSUCLK频率只有微小差异,所以可以通过上述方式进行纠正,防止buffer上溢或者下溢。
上述所说的特殊字符一般为K码,IP设置如下所示,勾选1处启用时钟校正功能,在2处选择每次插入特殊字符的个数,3处设置需要插入特殊字符的数值,4处确定插入的字符是不是K码。下图插入2个特殊字符,一个是K28.5对应的8’hBC,另一个是普通字符8’h50。
13、通道绑定
XAUI和PCI Express等协议结合了多个串行收发器连接,以创建一个更高吞吐量的通道。每个串行收发器连接称为一个通道,除非每个串行连接的长度完全相同,否则通道之间的偏斜会导致数据同时传输,但到达时间不同。
RX buffer可以用作可变延迟模块,信道绑定消除了GTX收发器各个通道之间的偏斜。用于绑定信道的发送通道在发送数据都同时发送信道绑定字符(或字符序列)。
当接收到序列时,GTX接收通道可以确定每个通道之间的偏斜,并调整RX buffer的延迟,以便在RX fabric用户界面上呈现无偏斜的数据。
后续在使用PCIE这种多通道协议时,在进行详细了解,本质上发送端向每个通道同时发送一组数据,接收端检测这组数据,确定每条线路延迟,进而调整弹性buffer输出数据的延迟,来达到多个通道输出给用户的数据对齐的目的。
14、用户接收端口
经过前文这么久的讲述,终于来到最后GTX接收数据的用户接口了,毫无疑问该接口的主要作用就是将接收的数据输出给用户。
该接口的所有信号与RXUSRCLK2的上升沿对齐,读取数据RXDATA的位宽可以配置为2、4或8字节,实际位宽与RX_DATA_WIDTH和RX_INT_DATAWIDTH的取值有关,与发送通道的设置一样,如下图所示。
接口宽度配置7系列GTX收发器包含2字节和4字节内部数据路径,可通过设置RX_INT_DATAWIDTH属性进行配置。FPGA接口宽度可通过设置RX_DATA_WIDTH属性进行配置。
当8B/10B解码器使能时,RX_DATA_WIDTH必须配置为20位、40位或80位,这种情况下,FPGA RX接口仅使用RXDATA端口。
当8B/10B解码器被旁路且RX_DATA_WIDTH为20、40或80时,RXDISPERR和RXCHARISK端口用于将RXDATA端口从16位扩展至20位、32位扩展至40位或64位至80位,如下图所示。
IP相关配置如下图所示,因为细节与发送通道的用户接口其实是一致的,所以这里就不再赘述。
最后手册还讲解了RXUSCLK和RXUSCLK2,这部分内容与TXUSCLK其实一致的,区别在于RXUSCLK和RXUSCLK2可以通过TXOUTCLK生成,也可以通过RXOUTCLK生成。而TXUSCLK和TXUSCLK2一般只推荐使用TXOUTCLK通过MMCM生成。如下IP配置所示。
本文到此结束,手册中这部分内容有一百二十多页,此处用五千多字进行简要概括,像通道绑定很多与PCIE、SATA协议有关内容并没有进行讲解,需要使用推荐查看手册详解。
如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!
如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!