从波形恢复眼图

前言

这次讲 ADS 的一个非常实用的工具——Tx Wav AMI,以及 matlab 里的 sndr 函数。

之所以讲这个工具,是因为实际工程实验中,每天都会拿到一堆乱七八糟的波形。这个时候你能获取到的信息,只有 AWG 里设定的码型和示波器中导出来的波形。

不出意外的话,手头上拿到的数据都是很烂的数据,烂到什么程度呢?别说看到眼,连哪块地方凹下去的痕迹你都找不到!

但你不确定眼的消失,究竟是 ISI,还是噪声,或者其他非线性原因导致的。

这个时候我们就希望有一条工具链,能帮我们分析噪声(SNDR),分析 DSP 究竟能对这坨烂波形恢复到什么样的程度。

波形分析

假如我们刚做完实验,从示波器上将波形导出来了。如果是我,第一时间会选择以前我自制的 WaveformEye 软件,导入波形看看能不能画出眼图。但 ADS 里本就提供了一个非常实用的工具——Tx Wav AMI,能够画出波形并提供给 Rx AMI 进行时钟恢复、均衡、判决等操作。

首先用 Tx Wav AMI 查看波形:

用AMI与FlexDCA查看波形

波形生成

如果没有实验测到的烂波形,可以自己生成个玩玩儿。这里用的波形是我用 IQtool 工具产生的。这个工具可以直接从是德官网下载,打开该工具需要 MATLAB runtime,具体操作和参数如下

生成测试波形

很明显,这里我通过提高噪声与 ISI,将眼图关闭了。此时的波形很烂,无法拿来直接做判决,需要通过 DSP 处理。

接下来,需要将波形下载并转成 csv 格式,还需要将 Pattern 保存下来(如果你知道码型是 PRBS13 或者别的,也可以不用保存直接用现成的)

保存波形与码型

由于保存下载的波形是 mat 格式的,因此还需要转成 txt 或者 csv。这里我直接在 MATLAB 里转

1
2
3
X = XStart+XDelta.*(1:length(Y))';
wav = [X,Y];
writematrix(wav, 'wav.csv');

最终,我们得到两个文件,一个 wave.csv,一个 pattern.txt

波形载入

回到 ADS,对 TX Wav AMI 进行设置(Rx 就随便找个直通的 AMI 用来看波形即可)

设置 Tx Wav AMI

可以看到原波形眼图不忍直视

原波形眼图

SNDR分析

这一步很关键,AMI 能不能恢复出眼图,全看波形能不能通过码型将通道响应拟合出来!

因为咱们 AMI 是脉冲自适应 / pulse based,CTLE/VGA/FFE/DFE 的系数全部在 AMI_Init 里计算,所以必须要找到确定的脉冲响应作为输入才行。

利用 MATLAB 刚出没多久的 sndr 函数,该函数在 Signal Integrity Toolbox 里。

波形相关参数,IQtools 导出的 mat 文件里都有,因此只需要额外导入一个 pattern.txt 文件

导入 pattern

MATLAB 分析代码

1
2
3
4
5
6
7
8
sndrObj = sndr('Wave',Y,...
'InputSampleInterval',XDelta,...
'DataPattern',pattern(1:end-1),...
'SymbolTime',1/10e9,...
'Standard','Custom',...
'MinimumRunLength', 6);

report(sndrObj)

注意这里由于同一个符号最多出现 6 次,因此设置 MinimumRunLength=6,否则按照 PCIe 的标准是跑不了的。

得到 SNDR 的分析结果

SNDR分析结果

在这个工具里,SNDR 可以粗略理解成:

SNDR=20log10(Pmaxσn2+σe2)SNDR = 20\log_{10}\left(\frac{P_{max}}{\sqrt{\sigma_n^2+\sigma_e^2}}\right)

其中:

  • Pmax 是有效信号幅度,或者说有效脉冲响应峰值,单位是 V;
  • SigmaNoise 是随机噪声标准差,单位是 V;
  • SigmaError 是拟合误差标准差,也就是非理想失真项;
  • 分母整体代表噪声 + 失真。

详细解释一下 report 里每个参数的意思:

Pmax 不是简单的最大电压 - 最小电压,也不是眼图里的最大 swing,它更接近于工具根据你的码型和波形,反推出一个等效脉冲响应,然后取这个脉冲响应中代表主游标强度的有效峰值。

SigmaNoise 是随机噪声标准差,它通常来自同一个 pattern 重复多次时,同一个 symbol 位置采样点的随机波动。

SigmaError 是 pulse response 拟合误差的标准差。通俗说,工具会尝试用一个线性或多脉冲拟合模型去重构输入波形:

YPXY \approx P X

其中:

  • Y 是真实输入波形;
  • X 是由码型构造出来的矩阵;
  • P 是拟合出来的 pulse response;
  • 误差就是:

Error=PXYError = P X - Y

SigmaError 就是这个误差的标准差。它反映的是:你的真实波形,有多少部分不能被理想的 pulse response 模型解释。

RLM 是 Ratio of Level Mismatch,电平失配比。这里三个电平间隔是:

1
2
3
V1 - V0 = 269.123 mV
V2 - V1 = 294.341 mV
V3 - V2 = 269.476 mV

中间眼比上下眼略大,所以不是完全等间隔。这里的 RLM 计算公式是从 802.3bs 中来的

RLM=min(3ES1, 3ES2, 23ES1, 23ES2)RLM = \min(3ES_1,\ 3ES_2,\ 2-3ES_1,\ 2-3ES_2)

这类定义的核心不是只看最小眼高,而是看两个内电平相对理想 ±1/3\pm 1/3 偏了多少。

代入数值:

ES1=V1V3=0.3538ES2=V2V3=0.3529ES_1 = \frac{|V_1|}{V_3} = 0.3538\qquad ES_2=\frac{V_2}{V_3}=0.3529

于是:

3ES1=1.06143ES2=1.058723ES1=0.938623ES2=0.9413\begin{matrix} 3ES_1=1.0614 & 3ES_2 = 1.0587\\ 2-3ES_1=0.9386 & 2-3ES_2=0.9413 \end{matrix}

取最小值:

RLM=0.9386RLM = 0.9386

这就和 report 里的 RLM = 0.938602 完全对上了。RLM 越接近 1,说明三个眼的高度越均匀。

用绘图函数 plotLPFR(sndrObj) 画图

拟合脉冲响应绘图

能拟合出脉冲响应,AMI 就能做均衡了!

波形均衡

确保脉冲响应能找到了,这时候就需要一个厉害的 Rx AMI 来对这一坨烂波形进行 DPS 处理了。我们将直通的 AMI 换成能对波形做均衡的 AMI(确保 AMI_Getwave 能用)

更换为DSP厂家的AMI

重新再跑一次

AMI 恢复后的眼图

如果还需要对发射机的 TDECQ 进行测量,可以使用 FlexDCA

利用 FlexDCA 测量 TDECQ

结语

这里用的是生成出来的烂波形,实际波形数据可能比这还要差!需要注意一点的是,AMI 能做到的极限是补偿 ISI 和很小一部分的非线性或者噪声。如果噪声太大,AMI 也无能为力,所以得看 SNDR 的水平来判断信号是否能恢复出来。

最后再强调一遍,不是所有波形数据都能将眼图恢复出来的,甚至脉冲响应都不一定能拟合出来!