SerDes 信号是如何恢复出来的

搞了快两年的信号处理,知识碎片零零散散,趁这个机会总结提炼一下。

SerDes 信号与系统

所谓 SerDes,就是 Serializer-Deserializer 的简写,指代发射端并行信号先通过串化器转成串行信号,通常以差分信号的形式传输,并在接收端解串还原成并行信号的系统。

因此发射端输出的信号是一串速率极高的振荡波形,从一G到百G量级的电磁信号。如果信号是以光载波的形式传输,整个系统可以看成强度调制-直接探测(IM-DD)系统,不同的幅值对应不同的比特序列。最常见的 NRZ 信号一个符号对应一个比特,也就是 PAM2 信号,有两个电平 level。PAM4 信号有四个电平 level,一个符号对应俩比特,因为俩比特的状态有四种。

我们真正想要的,是发射端输出的比特能尽可能正确的在接收端拿到。即便拿到的比特序列误码率很高,也要想办法尽可能恢复出最真实的结果。这个过程中主要存在三个主体:

  1. 发射端 Tx
  2. 信道 Channel
  3. 接收端 Rx

我们的目的是保证 Tx 送到 Rx 的信息尽可能正确传达,Rx 的波形形貌还是不是 Tx 送出的样子,并不重要,重要的是我们能否从中正确恢复出来比特序列。

我们知道信道之中存在各种乱七八糟的影响,会使信号劣化。例如信道对于不同频率的电磁波衰减能力不同,低频信号衰减弱,高频信号衰减强。还存在噪声,例如共模噪声,差模噪声,有源器件对信号不同频谱放大倍率不同,噪声同样被放大且随频率变化。这些效应共同导致 Tx 发射的原始波形逐渐形变失真,Rx 这边一来不知道什么时候对波形做判决(无时钟信号),二来即便判决了也可能由于噪声或失真导致判错,造成误码。

出于上述原因,我们能做的无非就三件事:

  1. 改造发射端
  2. 改造信道
  3. 改造接收端

先说信道,通常用物理手段去改造,例如降低信道损耗,减少信道引入的噪声,如果是光纤,就用零色散光纤,保证单个信号脉冲不要展宽。

改造发射端和接收端,通常用数据处理的手段。

发射端这一块通常有两种方法,一是合理的编码方式,例如自然二进制码、格雷码、BCD码。还有一种编码方式,作用是直流均衡,例如8B/10B,64B/66B这种,这类编码的核心思想是将输出的原始码流打乱,从而避免长0长1或周期性重复导致的直流偏移、时钟丢失、EMI干扰等问题。最原始的8B/10B编码方案靠的是查表,将原始码流对应为一个接近随机的码流,但后面64B/66B及更高位编码需要巨大的映射表,硬件实现不了,于是采用了加扰器(Scramber),这也就是扰码的由来!

因此,在 Tx 采用一些特定的编码方式以及加扰的目的,是把原本可能有规律的数据"打乱",让它看起来像随机噪声,从而实现直流均衡和辅助时钟恢复

在各种仿真软件中,都有一个模块叫做 PRBS 伪随机序列生成器,该生成器会根据公式产生的伪随机序列作为波形生成的参考码流。在仿真或测试中,它是主菜,直接作为原始信号被发射出去了,Rx 那边选择同样的码型,例如 PRBS13,就能立刻算出误码率是多少。

当传输真实业务数据的时候,PRBS 伪随机码是作为加扰器而存在的,相当于调料,与原数据做异或生成扰码数据。

发送:AB=C,数据伪随机序列=扰码接收:CB=A,扰码伪随机序列=数据发送:A\oplus B=C,\quad 数据\oplus伪随机序列=扰码\\ 接收:C\oplus B=A,\quad 扰码\oplus伪随机序列=数据

发射端这一块儿除了编码,也可以再加预加重和去加重。所谓的预加重,就是增强信号的高频分量,去加重就是减少信号的低频分量,核心思想就是:既然信道会让高频衰减更厉害,那我一开始就让高频分量的相对比重更大,这样到接收端低频与高频强度就不会失衡了。

接收端这一块儿的处理就多了,而且往往更复杂。常见的流程是

DSP 流程图

这一块儿东西太多,后面分章节慢慢讲。


接收端 DSP 流程

现在我们从信道输出端得到了一串乱七八糟的波形,相比输入端,数据已经几乎不可辨认了。为了从烂波形中恢复出码流数据,我们需要采取一系列工程措施:

  1. 首先用 CTLE 连续时间线性均衡来对模拟信号的高频分量进行放大。这种放大是一种线性频率选择性放大,它的本质是一个线性时不变系统 LTI + 频率选择性滤波器。用系统函数表达,它的函数大致是

    H(s)=Adc1+s/z(1+s/p1)(1+s/p2)H(s)=A_{dc}\frac{1+s/z}{(1+s/p_1)(1+s/p_2)}

    零点 z 在低频,极点 p1 p2 在高频。低频时 H1|H|\approx 1,且随频率 ss 提高,H|H| 先在 p1p_1 增大后在 p2p_2 减小。在时域上看,CTLE 让边沿更陡,具体表现是让上升沿更快,拖尾减少,ISI 减轻。但也正因为它是线性的,它对高频信号和噪声同时放大。它可不管你是什么信号,都一视同仁。信道的本质是低通系统,CTLE 则是高通系统,以此让目标信号更加均衡。

  2. 接下来是 VGA,它和 CTLE 一样,也是作用在模拟信号之上的,叫做可变增益放大器。它可以自动/可调地放大信号幅度,用于将信号幅度调整到"刚好适合判决"的范围。CTLE 做了高频 boost,但整体幅度可能变小,或者局部过大。此时就需要一个模块统一把信号scale到合适范围

  3. 然后是模拟 FFE,即前馈均衡。它通过对信号分多路时延,并在不同时延支路设置抽头值控制支路幅度,最后合并所有支路信号来实现均衡滤波。这种方法本质就是个自相关运算,依靠信号自身来调节自己,从而消除 ISI。

  4. 再然后就直接判决了,大家肯定很奇怪为什么就直接判决了,很反直觉。先不慌,我们后面再慢慢说。

  5. DFE,即判决反馈均衡,本质是根据已经判决好了的信号来裁剪输入信号,从而实现非线性均衡降噪的目的。

  6. CDR 时钟恢复居然在判决之后,也很反常识,但如果不先做判决,你也没法找到时钟在哪儿。

  7. 从 CDR 恢复的时钟信号反馈回 Slicer,更新判决时间。

CDR 是如何工作的

CDR 的核心思想:

CDR(Clock and Data Recovery)通过比较"采样时刻"和"数据跳变位置"的相对关系,不断调整本地时钟的相位,使采样点收敛到眼图最佳位置。

CDR 本质在解决一个优化问题:找一个采样相位 φ,使判决最可靠(BER最低 / 眼最开)

CDR 并不能直接看到"眼图中心",它只能看到数据什么时候跳变。CDR 控制 Slicer 判决的逻辑是:

假如有三个采样点 Early、Data、Late,如果 Early 与 Data 两个采样点判决的结果发生了跳变(例如 NRZ 判决结果从0变为1),说明采样时间太早,需要往后移;如果 Data 与 Late 两个采样点判决的结果发生了跳变,说明采样时间太晚,需要往前移。这种反馈模式之下,CDR 给出的采样时间会不断趋于最佳采样相位,也就是找到远离跳变点的采样位置

CDR 内部结构主要是一个环路滤波器:

CDR 环路结构

CDR 本质上可以看作一个类似 PLL 的反馈系统,其中输入数据的跳变信息替代了传统 PLL 中的参考时钟。CDR 中存在一个本地采样时钟,其频率由参考源提供并基本固定,而相位由 CDR 动态调节。相位检测器(PD)基于采样时钟下的判决结果(Early、Data、Late)推断采样时刻相对于数据跳变的位置:若 Early 与 Data 判决结果不同,说明采样时刻偏早,应延后时钟相位;若 Data 与 Late 判决结果不同,说明采样时刻偏晚,应提前时钟相位。该 bang-bang 反馈机制通过不断调整时钟相位,使采样时刻逐渐收敛到数据眼图中心附近,从而实现最优判决。

这就是为什么 Slicer 判决器要放在前面的原因了。

DFE 是如何工作的

前面说了 DFE 是根据已经判决的历史信号裁剪输入信号,这到底是什么意思呢?

信道是低通的,就会导致信号边沿跳变存在拖尾(变化不够快),这个拖尾就是 ISI,会影响后面的符号。DFE 的核心思想是:

既然当前采样 = 当前符号 + 历史符号的 ISI,那么就根据已经判决好了的历史符号,将当前符号上历史符号的 ISI 给直接减掉。

信道的离散信号模型

y[n]=h0x[n]+h1x[n1]+h2x[n2]+...y[n]=h_0x[n]+h_1x[n-1]+h_2x[n-2]+...

DFE 的作用是:

x^[n]=y[n]k=1Kbkx^[nk]\hat{x}[n] = y[n] - \sum_{k=1}^{K} b_k \hat{x}[n-k]

其中:

  • y[n]y[n]:当前采样
  • x^[nk]\hat{x}[n-k]:已经判决的历史符号
  • bkb_k:DFE权重(估计 ISI)

用历史判决来预测并消除 ISI

DFE 结构

值得注意的是,FFE 是根据当前符号做处理,DFE 是根据历史符号对当前符号做处理。FFE通过对接收信号进行多抽头前向延迟加权,实现线性滤波以补偿信道失真;而DFE利用已判决的历史符号,通过多抽头反馈减法来消除后向符号间干扰(post-cursor ISI)。