主要内容

在时域全局调整接收机组件

本示例展示了如何在时域(GetWave)仿真期间对一组接收机组件作为一个系统进行优化。您将看到如何设置CTLE和DFECDR块,以便它们的设置在模拟期间全局适应。这是示例“使用脉冲响应度量对接收机组件进行全局调整以提高SerDes性能”的后续。

接收组件全局适配概述:

CTLE和DFECDR接收机组件可以协同工作进行时域仿真的自适应。正常情况下,它们独立运作如下:

  • CTLE在统计(初始)中适应,然后在时域模拟开始时设置为此值

  • DFECDR在统计(Init)中适应,然后将这些tap值设置为时域,块继续连续训练tap值

您可以按照以下步骤定制CTLE和DFECDR,以便在RX系统内共享信号,以便在时域仿真期间在全局范围内共同适应:

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

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

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

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

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

  • 一个HF字在3个符号UI(例如101或010)期间发生变化,以表示一个字内位到位值的变化。

注意:CTLE块优化内眼(HF含量)。

第2部分:自定义接收机部分中的Simulink块

  • 通过将输出连接到终止器,禁用CTLE内部自适应

  • 改变CTLE输入,使用来自DFECDR的信号(允许全球共同适应)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

第2部分:自定义接收机系统中的Simulink块

将系统导出到Simulink。

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

修改CTLE

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

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

在DFECDR中添加CTLE适配

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

•模式

•ConfigIn

•symbolRecovered

•voltageSample

接下来,您将看到如何更改DFECDR以添加此MATLAB函数。

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

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

将MATLAB函数添加到Simulink画布中。你可以让Simulink自动生成端口通过定义函数语句代码行如下所示:

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

注意:您可以使用本例中解释的连接的代码片段,也可以使用附带的MATLAB函数“ctleTimeDomainAdapt”。M”作为参考。

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

输入:

  • 模式

  • configIn

  • voltageSample

  • symbolRecovered

  • 请注意symbolRecovered而且voltageSample是DFECDR块的可选输出,如上面的总线选择器所示。

输出(与函数名相同):

  • 配置

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

接下来,创建一个数据存储读块,并将元素赋值配置为CTLESignal.ConfigSelect。然后连接到功能输入端口进行配置。

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

请注意:可以添加一个Scope来观察的自适应值CTLESignal。ConfigSelect在模拟。

当您完成信号连接后,DFECDR将显示如下:

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

您可以编辑“ctleTimeDomainAdapt. zip”文件。M”附加到这个示例中,作为自适应算法的起点。本例使用持久变量在每次调用MATLAB函数时跟踪值。作为起点,你将评估变量是否为非零(例如使用function isempty()),这样在第一次调用函数时,就可以初始化它们。在这之后,它们的值将由CTLE和DFECDR块一起配置。

持续的sps sampleCounter符号计数器持续的internalConfig 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/+1Toggling = false;%切换检测标志结束

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

实现诸如Toggle Detector之类的看门狗

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

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

如果Mode == 2 && ~切换

理解数据切片器

你可以使用信号symbolRecovered而且voltageSample来处理RX波形。但首先,重要的是要理解数据切片器的操作:

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

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

3.数据切片器稍后在+0.5 UI处触发,

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

数据切片器输出一个符号和一个电压。例如,如果数据切片器在0.5 UI位置操作,则切片器输出一个符号为+0.5或-0.5以及符号已达到的电压值。

从数据切片器找到UI边界

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

多久更新一次CTLE配置updateFrequencySymbols = 1000;% CTLE配置范围minctlecconfig = 0;maxctlecconfig = 15;设置一个样品和符号计数器来跟踪整体进度。sampleCounter = sampleCounter+1;对该函数的每次调用都是一个示例当样本数能被每比特的样本数整除时,有一个符号边界如果mod(sampleCounter,sps) == 0 symbolCounter = symbolCounter+1;updateConfig = true;%在更新部分中防止循环的标志维护比特/电压历史记录符号=[符号(2:3)符号恢复];% -0.5或0.5电压=[电压(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-符号组合排序HF vs. LF信号内容

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

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

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

  • 如果信号是010或101,增量计数变量HF

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

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

更新CTLE

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

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

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

图:时域模拟时的眼图。

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

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

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

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

为了找到接收方的Ignore Bits的值,您可以计算CTLE需要多少个UI来解决。在这种情况下,它将等于可用的CTLE配置的数量。

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

当模拟完成时,如果模拟为接收器使用了足够的忽略位,则可以看到时域眼具有有效的浴盆曲线。

图:具有足够忽略位的统计和时域结果。

您可以通过将值设置为零并重新运行模拟来测试忽略位的效果:

图:您可以将“忽略位”的值从16设置为0,以测试其对时域结果的影响。

图:统计和时域结果忽略位不足。

另请参阅

||

相关的话题

Baidu
map