主要内容

在时域内对接收机组件进行全局适应

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

接收器组件全局适配概述:

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

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

  • DFECDR适应于统计(Init),然后设置为这些时间域的tap值,Block继续不断地训练tap值

您可以按照以下步骤自定义CTLE和DFECDR以共享RX系统内的信号,在时域模拟期间共同适应全局:

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

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

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

在本例中,Low Frequency (LF)和High Frequency (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边界期间对输入信号进行操作,而不是对每个样本区间进行操作

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

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

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

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

用接收器中的CTLE和DFECDR初始化SerDes系统

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

单击CTLE,可将模式设置为“fixed”。

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

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

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

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

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

第二部分:在接收机系统中定制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并点击标有“选择>>”的按钮,重复此操作voltageSample.这些是可选输出,这就是为什么你必须启用这些。另外,您需要更改和的配置symbolTime而且sampleInterval从“信号”到“参数”。你可以在MATLAB的函数编辑器中通过“编辑数据”工具条来完成:

向Simulink画布中添加一个MATLAB函数。你可以让Simulink自动生成端口,定义函数语句的代码行如下:

ctleTimeDomainAdapt -优化CTLE配置的简单自适应算法%在时域的NRZ信号。当前并行转换器。CTLE%只适用于Init/ statistics。目标是监视符号的决策和电压水平的决策从% 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。然后连接到功能输入口进行configin。

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

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

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

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

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

持续的sps sampleCounter symbolCounter持续的internalConfig updateConfig符号电压持续的lowFreqCount highFreqCount lowFreqVoltage highFreqVoltage持续的preventToggle切换如果isempty(sps) sps = SymbolTime/SampleInterval;sampleCounter = 0;%的总样本symbolCounter = 0;总额%符号internalConfig = configIn;%从初始化中获取配置并设置为初始配置% 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函数时,它们都被实例化为未定义。

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

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

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

如果Mode == 2 && ~切换

理解数据切片机

你可以使用信号symbolRecovered而且voltageSample处理RX波形。但首先,了解Data Slicer的操作是很重要的:

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

2.DFECDR块应用它的丝锥,

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

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

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

从数据切片器找到UI边界

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

更新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.5voltage = [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或10 0 1highFreqCount = highFreqCount + 1;highFreqVoltage = highFreqVoltage+ abs(voltage (2));%保持中电压样品结束结束

寻找3符号组合来排序高频和低频信号内容

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

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

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

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

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

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

更新CTLE

您可以实现您想要的任何算法,但是在本例中,CTLE以configSelect value from Init开始,并且函数执行一个递增。每次计算DFECDR并将其与Persistent变量进行比较时。根据这个结果,CTLE会递增或递减。

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

如果低频高于高频,则增加CTLE配置如果lowFreqAvg > highFreqAvg%防止超过最大CTLE配置如果internalConfig < maxCTLEConfig%如果检测到切换,禁用适配如果~isequal(preventToggle,[1 -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,以测试其对Time Domain结果的影响。

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

另请参阅

||

相关的话题

Baidu
map