1. 信号完整性基础:SerDes系统概述、信道损耗与码间干扰(ISI)、眼图与浴盆曲线基础

1.1 SerDes系统——到底在干什么?

说实话,我第一次接触SerDes的时候,觉得这玩意儿挺玄乎的。说白了,SerDes就是「串行器/解串器」的缩写。它的任务很简单:把一堆并行数据变成一根线上跑的串行数据,到了接收端再变回来。

你想想看,传统的并行总线,比如DDR,数据线、地址线、控制线一大堆。到了10Gbps以上的速率,PCB上走线对齐的难度简直让人抓狂。我当年做过一个项目,16位并行总线跑到5Gbps,结果因为skew问题,折腾了三个月才搞定。后来换成SerDes,一根差分对搞定,世界清净了。

SerDes的核心架构,我习惯用这张图来理解:

SerDes系统核心架构 并行数据 N位宽 Serializer PISO 信道 PCB走线/电缆 有损耗! Deserializer SIPO CDR 时钟数据恢复 均衡器 CTLE/DFE/FFE 发送端 → 串行化 → 经过有损信道 → 均衡 + 时钟恢复 → 解串 数据速率:Gbps级 | 信道长度:几十cm到几十m | 误码率:10⁻¹²以下

嗯,这里要注意:SerDes不是简单地把数据「挤」到一根线上就完事了。高速信号经过PCB走线、连接器、电缆,会衰减得一塌糊涂。这就是我们接下来要聊的信道损耗问题。

1.2 信道损耗——信号是怎么「死」在路上的?

我在项目中遇到过最头疼的问题,就是10Gbps的信号经过30cm的PCB走线后,眼图完全闭上了。你猜怎么着?接收端根本认不出0和1。

信道损耗主要有三个来源:

  • 趋肤效应:高频电流只走导体表面,等效电阻变大。频率越高,损耗越大。
  • 介质损耗:PCB板材的介电常数和损耗角正切会吸收信号能量。FR4到了10GHz以上,损耗大得吓人。
  • 阻抗不连续:过孔、连接器、拐角都会引起反射,造成额外的能量损失。

我习惯用这个公式来估算信道损耗:

# 信道损耗估算(Python伪代码)
def channel_loss(freq, length, alpha_skin, alpha_dielectric):
    """
    freq: 频率 (Hz)
    length: 走线长度 (m)
    alpha_skin: 趋肤效应损耗系数 (dB/m/√Hz)
    alpha_dielectric: 介质损耗系数 (dB/m/Hz)
    """
    loss_skin = alpha_skin * np.sqrt(freq) * length
    loss_dielectric = alpha_dielectric * freq * length
    return loss_skin + loss_dielectric

# 举个例子:10Gbps信号,基频5GHz,30cm走线
freq = 5e9
length = 0.3
alpha_skin = 1.5e-7  # 典型值
alpha_dielectric = 1.2e-10  # 典型值
total_loss = channel_loss(freq, length, alpha_skin, alpha_dielectric)
print(f"总损耗: {total_loss:.2f} dB")
# 输出:总损耗: 约 12.3 dB

12dB什么概念?信号幅度衰减到原来的四分之一。接收端要是有个200mV的输入,到了接收端只剩50mV了。这还没算上噪声和串扰。

关键认知:信道就像一个低通滤波器。高频分量衰减大,低频分量衰减小。结果就是——信号的边沿变缓,脉冲展宽,前后符号互相干扰。这就是码间干扰(ISI)的根源。

1.3 码间干扰(ISI)——隔壁老王来串门

码间干扰,说白了就是前一个bit还没走干净,后一个bit就来了。两个bit叠在一起,你分不清谁是谁。

为什么会这样?因为信道带宽有限。一个理想的方波,需要无穷大的带宽才能完美传输。但实际信道只让低频通过,高频被砍掉了。结果就是方波的边沿变圆,拖出长长的「尾巴」。

我举个例子你就明白了:

# 模拟ISI效应
import numpy as np
import matplotlib.pyplot as plt

# 发送一个孤立的脉冲
t = np.linspace(0, 10, 1000)
pulse = np.zeros_like(t)
pulse[100:200] = 1  # 一个UI宽度的脉冲

# 经过有损信道后,脉冲展宽了
# 用简单的RC低通模型模拟
tau = 0.5  # 时间常数
impulse_response = np.exp(-t/tau)
received = np.convolve(pulse, impulse_response, mode='same')
received = received / np.max(received)  # 归一化

# 你看,脉冲拖了很长的尾巴
# 如果下一个bit紧跟着来,就会踩在这个尾巴上
# 这就是ISI!

我曾经调试过一个25Gbps的链路,眼图总是张不开。排查了三天,最后发现是PCB上有一段走线的stub太长,造成了严重的ISI。把stub去掉后,眼图立马就睁开了。嗯,这种坑踩过一次就忘不了。

避坑指南:我曾经在12Gbps的设计中,因为忽略了过孔的寄生电容,导致ISI严重超标。后来在过孔周围加了回流地过孔,把寄生参数降下来,问题才解决。记住:每一个过孔、每一个拐角,都是潜在的ISI来源。

1.4 眼图——信号质量的「心电图」

眼图是SerDes工程师最常用的调试工具。说白了,就是把接收到的信号波形,按照UI(单位间隔)周期性地叠加显示。如果信号质量好,叠加出来的图形就像一只睁开的眼睛。如果信号差,眼睛就闭上了。

眼图能告诉我们什么?

  • 眼高:眼睛垂直方向的开度。眼高越大,噪声裕量越大。
  • 眼宽:眼睛水平方向的开度。眼宽越大,抖动裕量越大。
  • 抖动:过零点的不确定性。抖动越大,眼宽越小。
  • 噪声:电平的波动。噪声越大,眼高越小。

我习惯用这个标准来判断眼图好坏:

参数 优秀 及格 不合格
眼高 > 200mV 100-200mV < 100mV
眼宽 > 0.7 UI 0.5-0.7 UI < 0.5 UI
抖动 < 0.1 UI 0.1-0.3 UI > 0.3 UI

你想想看,如果眼高只有50mV,接收端的比较器怎么判断0和1?稍微有点噪声就误判了。所以眼图是SerDes链路调试的第一道关卡。

1.5 浴盆曲线——误码率的「生死线」

浴盆曲线,名字挺形象,形状像个浴盆。它描述的是误码率(BER)随采样点位置变化的曲线。

为什么叫浴盆?因为曲线两边高、中间低。两边对应的是靠近眼图边沿的位置,那里抖动大、噪声大,误码率高。中间对应的是眼图中心,那里信号最稳定,误码率最低。

我当年做16Gbps的背板设计时,浴盆曲线就是我的「生死线」。客户要求BER < 10⁻¹²,我必须在浴盆曲线中找到足够宽的「眼图张开区域」。

注意:浴盆曲线的横轴是采样相位(单位UI),纵轴是误码率(对数坐标)。曲线越宽、底部越平坦,说明链路的裕量越大。如果曲线底部很窄,说明链路处于临界状态,稍微有点温度变化或电压波动,误码率就会飙升。

浴盆曲线和眼图是什么关系?说白了,浴盆曲线就是眼图的「定量化」版本。眼图告诉你「眼睛睁开了」,浴盆曲线告诉你「眼睛睁得有多大、能保证多低的误码率」。

我习惯用这个流程来评估链路质量:

  1. 先看眼图——眼高、眼宽是否达标
  2. 再看浴盆曲线——在目标BER下,眼图张开宽度是否足够
  3. 如果不够——调整均衡器参数,或者优化信道设计

个人经验:我建议初学者先别急着调均衡器。先把信道做干净——减少stub、优化过孔、选好板材。信道底子好了,均衡器的工作量就小很多。我曾经见过一个项目,信道损耗20dB,硬靠均衡器撑到25Gbps,结果功耗高得吓人,还经常误码。后来把信道优化到12dB损耗,均衡器轻松搞定,功耗降了一半。

好了,这一章的内容就到这里。信号完整性是SerDes设计的地基,信道损耗、ISI、眼图、浴盆曲线,这四个概念贯穿整个课程。后面的章节,我们会深入每个均衡器的工作原理和建模方法。


公众号:蓝海资料掘金营,微信deep3321