主要内容

在时域中全局适应接收机组件

这个例子展示了如何在时域(GetWave)模拟期间,将一组接收机组件作为一个系统进行优化。您将看到如何设置一个CTLE和一个dfdr块,以便它们的设置在模拟期间全局一致。这是示例“使用脉冲响应度量来改进SerDes性能的全局适应接收器组件”的后续内容。

接收机组件全球适应概述:

CTLE和dfdr的接收机组件可以协同工作,实现时域仿真的自适应。一般情况下,它们独立运行如下:

  • CTLE在统计(Init)中进行调整,然后在时域模拟开始时设置为这个值

  • dfdr在统计(Init)中进行调整,然后为时域设置这些tap值,然后Block继续连续训练tap值

您可以按照以下步骤定制CTLE和dfdr,以便在RX系统中共享信号,以便在时域模拟期间共同进行全局适配:

第1部分:确定优化RX波形和均衡的方法

您将看到均衡化如何影响RX波形,使之或过均衡化,或欠均衡化,或临界均衡化(例如,类似于如何将滤波器响应定义为过阻尼、欠阻尼或临界阻尼)。

注意:本例中使用了通信理论中的数据字(每个字3个符号)的概念。

本例定义低频(LF)和高频(HF)数据字如下:

  • 一个LF字在3个符号界面(例如111或000)中保持相同的逻辑值,以表示一个字内不变的位对位值。

  • 一个高频词在3个符号界面(例如101或010)中变化,以表示一个词内的位到位值的变化。

注意:一个CTLE块优化内眼(仅HF内容)。

第2部分:在接收器部分定制Simul金宝appink模块

  • 通过将输出连接到终止符来禁用CTLE内部适配

  • 更改CTLE输入,以使用来自DFECDR的信号(这允许一起全局适应)

  • 通过创建一个MATLAB函数块来定制dfdr,该函数块根据内部总线和CTLE参数评估Eye度量,然后输出一个用于CTLE配置的值。

第3部分:在时域仿真中实现自定义MATLAB函数来适应均衡

  • 在dfdr中,编写MATLAB函数,使其在UI边界期间对输入信号进行操作,而不是在每个样本间隔上

  • 添加条件语句来比较低频(LF)数据词和高频(HF)数据词之间的Eye度量,以确定下一个最佳均衡值。

  • MATLAB函数输出的均衡值是Simulink中的一个Signal。金宝app这意味着CTLE块将使用这个作为它的输入-所以每次它改变时,RX波形将在时域模拟期间用这个新值进行均衡。

注意:RX系统内的块可以共享信号。在TX系统中也是如此。然而,RX和TX系统之间不能共享信号。

第1部分:确定优化接收机波形和均衡的方法

在接收端使用CTLE和dfdr初始化SerDes系统

输入serdesDesigner(' TDadapt.mat ')打开系统。您将看到一个具有基本TX的系统,100欧姆通道,在5GHz时损耗16dB, RX包含一个CTLE和一个dfdr。在本例中,CTLE被定制为使用“固定”模式(因为本例展示了如何通过在MATLAB函数中求固定值以编程方式适应)规范设置“直流增益和峰值增益”,设置“直流增益”的范围为0 ~ - 15dB(增量为-1dB),设置“峰值增益”的范围为0 ~ +15dB(增量为+1dB),如下图所示。还要注意,应该将dfdr设置为“adapt”模式。

您可以点击CTLE并设置模式为“固定”。

然后你可以循环使用不同的值配置选择,观察不同均衡值对接收者眼图的影响:

上图:未均衡RX波形:CTLE配置选择设置为0(最小值)。

上图:过均衡的RX波形:CTLE配置选择设置为15(最大值)。

上图:临界均衡信号:CTLE配置选择设置为7(例如,一个中档值)。

您可以使用均衡的概念开发一个算法来优化接收信号。例如,RX信号可以被认为是过均衡、欠均衡或临界均衡:

第2部分:在接收器系统中定制Simu金宝applink模块

将系统导出到Simulink。金宝app

在Receiver部分中,您可以修改CTLE和dfdr以使用Signals共享值,以便在时域模拟期间实现全局适配。

修改CTLE

您可以查看CTLE掩码(CTRL-U),然后更改ConfigSelect输出到《终结者》而不是DataStoreWrite。通过将一个《终结者》ConfigSelect输出时,CTLE不再处于反馈模式,而RX系统中的任何其他块都可以通过写入它来控制这个CTLEConfigSelect输入信号。

您将更改CTLE。ConfigSelectoutput to connect to a terminator:

在dfdr中添加CTLE适配

您现在可以修改dfdr来控制的值ConfigSelectCTLE在时域仿真时使用的输入。这可以通过添加一个MATLAB函数来实现,该函数使用以下参数来评估CTLE配置,以适应下一个最佳均衡值:

•模式

•ConfigIn

•symbolRecovered

•voltageSample

接下来,您将看到如何更改dfdr以添加这个MATLAB函数。

您将在输出端口看到一个总线选择器室内.双击打开Block Parameters菜单,并进行以下更改:

点击信号symbolRecovered然后点击“选择>>”按钮,重复此操作voltageSample.这些是可选输出,这就是为什么你必须启用这些。此外,您还需要更改and的配置symbolTimesampleInterval从“信号”到“参数”。你可以从“编辑数据”工具条,而在MATLAB的函数编辑器中:

在Simulink canvas中添加一个MATLAB函数金宝app。你可以让Simulink金宝app自动生成端口,定义函数语句行代码如下:

% ctleTimeDomainAdapt -优化CTLE配置的简单自适应算法%为NRZ信号的时域。当前并行转换器。CTLE%只适用于Init/ statistics。目标是监控符号决定和电压水平的决定% serdes.DFECDR。由此,计算出高频和低频电压的平均值%调整CTLE配置,将平均值放在一起。一旦确定,检测切换配置和锁调整配置的%。配置调整操作在%假设CTLE的“boost”随配置从0增加到X而增加%调制仅为NRZ。版权所有2020 The MathWorks, Inc.函数config = ctleTimeDomainAdapt(mode, configIn, symbolRecovered, voltageSample, SampleInterval, SymbolTime)

注意:您可以使用本例中所解释的代码片段,也可以使用附加的MATLAB函数“ctleTimeDomainAdapt”。m”供参考。

您也可以使用Simulink中的画布工具来创建端口。金宝app使用任何一种方法,端口应该如下所示:

输入:

  • 模式

  • configIn

  • voltageSample

  • symbolRecovered

  • 请注意symbolRecoveredvoltageSample是dcdr块的可选输出,如上面的总线选择器所示。

输出(与函数名相同):

  • 配置

创建一个常量块并将其元素赋值配置为CTLESignal.Mode。然后将其连接到功能输入端口进行模式。

接下来,创建一个数据存储读块,并配置元素赋值CTLESignal.ConfigSelect。然后将它连接到configin的函数输入端口。

接下来,创建一个数据存储写块,并配置元素赋值CTLESignal.ConfigSelect。然后将其连接到函数输出端口进行配置。

请注意:可以添加“Scope”,查看对应的适配值CTLESignal。ConfigSelect在模拟。

当连接完信号后,dfdr将显示如下:

第三部分:时域仿真中适应均衡算法的实现

您可以编辑“ctleTimeDomainAdapt”文件。作为自适应算法的起点。这个例子使用Persistent变量来跟踪MATLAB函数每次调用时的值。作为起点,你将评估变量是否为非零(例如使用function isempty()),这样当函数第一次被调用时,它们就可以被初始化。在此之后,它们的值将由CTLE和dfdr块一起配置。

持续的sps sampleCounter symbolCounter持续的updateConfig符号电压持续的lowFreqCount highFreqCount lowFreqVoltage highFreqVoltage持续的preventToggle切换如果isempty(sps) sps = SymbolTime/SampleInterval;sampleCounter = 0;%的总样本symbolCounter = 0;总额%符号internalConfig = configIn;从Init中获取配置并设置初始配置% internalConfig = 0;%使用这个来忽略Init中的值updateConfig = false;符号= [0 0 0];%符号历史(3)电压= [0 0 0];%每个符号(3)的电压lowFreqCount = 0;低频事件计数highFreqCount = 0;%高频事件计数lowFreqVoltage = 0;%低频事件电压总和highFreqVoltage = 0;%高频事件电压总和preventToggle = [0 0 0 0];%切换跟踪;最后4个配置更新-1/+1切换= false;%检测到切换标志结束

注意:当一个变量是Persistent时,该变量保留其值。否则,每次调用MATLAB函数时,它们都被实例化为undefined。

实现看门狗,比如切换检测器

您可以实现许多类型的看门狗测试,但本例实现了一个切换检测器。如果CTLE处于给定值并开始逐字递增或递减1(例如4-5,5-4,4-5),程序将检测3次重复来测试切换条件。如果为真,则退出循环,因此CTLE保持其训练的最优值。

注意:您可以在所附的文件中看到这样一个算法的示例实现。

如果模式== 2 && ~切换

理解数据切片机

你可以利用这些信号symbolRecoveredvoltageSample来处理RX波形。但首先,重要的是理解数据切片机的操作:

1.每当时钟时间出现在UI的开始时,

2.dfdr块应用它的水龙头,

3.数据切片器在+0.5 UI之后被触发,

4.然后对该位进行tap值决定。

数据切片机既输出符号又输出电压。例如,如果数据切片器在0.5 UI位置操作,切片器将输出+0.5或-0.5的符号和该符号所达到的电压值。

从数据切片器找到UI边界

系统在基于样本的时间步长上运行,因此您可以通过设置样本和符号计数器来跟踪UI边界。当样本计数被这个“每位样本”的设置整除时,就定义了一个符号边界。通过这种方式,你可以找到高频(例如010,101)或低频(例如111,000)数据字的组合,以优化临界均衡:

更新CTLE配置的频率updateFrequencySymbols = 1000;% CTLE配置范围minCTLEConfig = 0;maxCTLEConfig = 15;%设置一个样品和符号计数器,以跟踪整体进度sampleCounter = sampleCounter + 1;%对这个函数的每次调用都是一个示例%当样本计数被每位样本数整除时,存在符号边界如果mod(sampleCounter,sps) == 0 symbolCounter = symbolCounter+1;updateConfig = true;%在更新节中避免循环的标志%保持位/电压历史记录symbols = [symbols(2:3) symbolRecovered];% -0.5或0.5[voltage (2:3) voltageSample];%每个符号的电压%保持低/高频率事件的计数和这些事件的电压总和%低频=稳定高或低%高频=快速过渡如果isequal(符号,[0.5 0.5 0.5])| | isequal(符号,(-0.5 -0.5 -0.5))% 1 1 1或0 0 0lowFreqCount = lowFreqCount + 1;lowFreqVoltage = lowFreqVoltage+ abs(voltage (2));保持中压样品elseifisequal(符号,[-0.5 0.5 -0.5])| | isequal(符号,(0.5 -0.5 0.5))% 0 1 0或1 0 1highFreqCount = highFreqCount + 1;highFreqVoltage = highFreqVoltage+ abs(voltage (2));保持中压样品结束结束

找出3个符号组合来对高频和低频信号内容进行排序

您可以使用MATLAB函数Mod来查找样本/秒何时达到Mod 0,它定义了UI边界。一旦符号计数器达到取模0,就可以将这些位置累加为位。然后在积累足够的比特(例如1000)后,计算整个种群的电压平均值,并更新CTLE配置。

创建一个if语句来执行以下测试和决策:

  • 如果信号是111或000,增加LF计数变量

  • 如果信号是010或101,则增加高频计数变量

  • 对于每种情况,取该符号处的电压和电压计数器的增量变量

%当符号数被更新频率整除时,检查是否需要CTLE更新如果mod(symbolCounter,updateFrequencySymbols) == 0 && updateConfig .计算低/高电压平均值lowFreqAvg = lowFreqVoltage / lowFreqCount;highFreqAvg = highFreqVoltage / highFreqCount;

更新CTLE

您可以实现任何算法,但在本例中,CTLE以Init中的configSelect值开始,函数执行递增操作。每次计算dcdr并与Persistent变量进行比较时。根据这个结果,CTLE会增加或减少。

注意:对于您的代码来说,测试CTLE是否设置为无效是很重要的configSelect

如果低频率高于高频率,则增加CTLE配置如果lowFreqAvg > highFreqAvg%防止超过最大的CTLE配置如果internalConfig < maxCTLEConfig%如果检测到切换,请禁用适配如果~isequal(preventToggle,[1 -1 1]) internalConfig = internalConfig + 1;%添加当前动作切换跟踪器preventToggle = [preventToggle(2:4) 1];其他的切换= true;结束结束%如果高频率高于低频率,则降低CTLE配置elseiflowFreqAvg < = highFreqAvg%防止超过最小的CTLE配置如果internalConfig > minCTLEConfig如果~isequal(preventToggle,[-1 1 -1 1]) internalConfig = internalConfig -1;%添加当前动作切换跟踪器preventToggle = [preventToggle(2:4) -1];其他的切换= true;结束结束结束重置与平均每个updateFrequencySymbols相关的变量lowFreqCount = 0;lowFreqVoltage = 0;highFreqCount = 0;highFreqVoltage = 0;updateConfig = false;%锁更新到下一个符号边界结束结束配置= internalConfig;结束

图:时域模拟中的眼图。

您可以在Scope中看到,CTLE以Init中的值开始,并且在几次迭代之后切换检测器代码“锁定”了CTLE配置:

图:当时域模拟开始时,CTLE以Init的值开始。

您可以将代码设置为从CTLE配置0开始,并看到算法会增加配置,直到它切换:

图:示波器输出的信号CTLESignal。ConfigSelect如果函数被编程为从0开始而不是从Init开始。

为了找到接收器的Ignore Bits的值,你可以计算一个CTLE需要多少UI。在本例中,它将等于可用的CTLE配置的数量。

图:您可以将Ignore Bits的值设置为16,这是本例中可用的CTLE配置的数量。

当仿真完成时,您可以看到时域眼有一个有效的浴缸曲线,如果仿真使用了足够的忽略位为接收器。

图:统计和时域结果与充分忽略比特。

你可以通过设置值为零并重新运行模拟来测试Ignore Bits的效果:

图:您可以将Ignore Bits的值从16设置为0,以测试其对时域结果的影响。

图:忽略比特不足的统计和时域结果。

另请参阅

||

相关的话题