一、前言
接下来我们将随着接收部分的信号流,来看看接收通道中依次进行了一些什么处理。笔者从用户手册摘录出了一些主要的处理模块,包括FPGA接收接口模块(FPGA RXInterface)、8B10B解码模块(8B10B Decoder)、接收变速箱模块(RX Gearbox)、码型检测器模块(PRBS Generator)、接收弹性缓冲器模块(Rx Elastic Buffer)、逗点检测及对齐模块(Comma Detect And Align)、极性模块(Polarity)等,如下图所示,这些模块是接收链路中最常用的模块,如果读者对其他模块感兴趣可以查阅用户手册。
二、极性反转功能
同发送链路一样,接收链路也包含一个极性反转功能,如果PCB上的RXP和RXN差分走线不小心弄反,GTX/GTH收发器RX接收到的差分数据就会颠倒。 GTX/GTH 收发器 RX 允许在 SIPO 之后对 PCS 中的并行字节进行反转,以抵消差分对上的反向极性。
与极性反转相关的端口如下表所示。
三、PRBS检查器
与发送通道码型发生器相反,GTX/GTH 接收器包括一个内置 PRBS 检查器,可以检查发送端发送过来的四种PRBS码型,用于测试通道的信号完整性,包含一个错误计数器,用于误码统计。功能框图如下图所示。
与PRBS检查器相关的端口如下表所示。
注意,无法通过端口来获取PRBS错误计数器RX_PRBS_ERR_CNT,只能通过DRP接口来获取。
四、字节和字对齐
1、字节对齐
如果接收串行数据进行了8B10B编码,串行数据必须与符号边界对齐才能用作并行数据。为了使对齐成为可能,发射器发送可识别的序列,通常称为逗点(comma)。接收器在传入数据中搜索逗点。当它找到逗点时,它将逗点移动到字节边界,以便接收到的并行字与发送的并行字匹配。
例如很多协议都是使用K28.5作为逗点字节,由于8B10B编码的特性,在滑动的串行数据中不会存在其他数据被误认为是K28.5的情况。K28.5的编码前的字节是8’hbc,编码后负极性(K28.5-)时为0011111010,正极性(K28.5+)时为1100000101。因此只需要在串行序列中滑动过程中找到了K28.5-或者K28.5+序列时,即可认为是找到了字边界。如下图所示,当找到了逗点符号K28.5之后,也就确认了数据边界,则接下来的数据也就能正常的识别出来了。
2、字边界对齐
尽管解决了字节对齐的问题,但用户数据输出端口并不是单字节的,只可能是2字节、4字节或者8字节的。字边界对齐功能可以将逗点符号放置于用户数据的首位以及中间可预见性的位置上,简化用户设计。
ALIGN_COMMA_WORD属性用于定义字对齐边界,同时也与RX_DATA_WIDTH属性和RX_INT_DATAWIDTH属性有关,具体配置以及对应的字边界对齐情况如下表所示。
3、对齐控制
在进行字节对齐和字对齐操作之前,需要设置好相关的属性,主要相关属性如下表所示
设定好字节对齐和字对齐属性后,通过相关端口来进行控制,主要端口如下表所示。
我们假设某个协议需要检测一个单字节逗点,且无论是检测到了该逗点正负极性都认为是对齐。则对齐操作流程如下:
(1)、启用逗点对齐模块,例化GTXE2_CHANNEL原语时,RXCOMMADETEN端口可以恒定为1。
(2)、将RXPCOMMAALIGNEN和RXMCOMMAALIGNEN端口同时置为1,激活对PCOMMA和MCOMMA的检测,任何匹配的comma模式与最近的边界重新对齐,comma对齐后,RXBYTEISALIGNED信号置为高。
(3)、此时可以将RXENMCOMMAALIGN和RXENPCOMMAALIGN置为0,关闭comma对齐功能,使comma对齐模块保持当前对齐位置。
(4)、后续始终保持字节位置不变,直到重新将RXPCOMMAALIGNEN和RXMCOMMAALIGNEN端口置为1,才会再次开启逗点检测。