В этом примере показано, как выполнить оптимизацию набора компонентов получателя как система с помощью функционального optPulseMetric
чтобы вычислить метрики, такие как высота глаза, ширина и маржа операционной прибыли канала (COM) оценивают от импульсного ответа с целевой частотой ошибок по битам (BER), чтобы оценить оптимальную производительность особой настройки. Адаптация выполняется как статистический анализ (Init), затем оптимизированный результат передается временному интервалу (GetWave).
Этот пример использует модель SerDes Designer rx_ctle_adapt_dfe_train
как начальная точка. Введите следующую команду в командном окне MATLAB®, чтобы открыть модель:
>> serdesDesigner('rx_ctle_adapt_dfe_train.mat')
Этот проект содержит раздел получателя с двумя блоками CTLE, сопровождаемыми блоком DFECDR. В их настройке по умолчанию эти блоки оптимизируют индивидуально. Цель этого примера состоит в том, чтобы оптимизировать блоки как систему.
Для CTLE_LowFreq
блокируйтесь, Худая частота (GHz) установлена в [10 11 12 13 14 15 16]
, усиление DC (дБ) установлено в [0 0 0 0 0 0 0]
, и Худое усиление (дБ) установлено в 0
. Все другие параметры сохранены в их значениях по умолчанию.
Для CTLE_HighFreq
блокируйтесь, Спецификация установлена в DC Gain and AC Gain
, Худая частота (GHz) установлена в 14
, усиление DC (дБ) установлено в 0
, и усиление AC (дБ) установлено в [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
. Все другие параметры сохранены в их значениях по умолчанию.
Для блока DFECDR Начальные веса касания (V) установлены в [0 0 0 0 0 0 0 0 0 0]
. Все другие параметры сохранены в их значениях по умолчанию.
Экспортируйте систему SerDes в модель Simulink®.
Дважды щелкните по подсистеме Init в блоке Rx и нажмите на кнопку Show Init. Скопируйте полный код, перечисленный в конце этого примера в Пользовательской пользовательской области кода. Сохраните модель. Код сломан ниже в нескольких подразделах для легкого понимания.
Примечание: Чтобы завершить пример, необходимо поместить следующие секции кода вместе в Пользовательскую пользовательскую область кода в подсистеме Init. Полный набор кода обеспечивается в конце этого примера. Для получения дополнительной информации о подсистеме Init, смотрите Статистический анализ в Системах SerDes.
Первый раздел Пользовательской пользовательской области кода проверяет, находятся ли и CTLEs в, адаптируют режим и переменные инстанцирования, чтобы содержать временные ценности и лучшие метрики настройки.
%% BEGIN: Custom user code area (retained when 'Refresh Init' button is pressed) % If both CTLEs are in Adapt mode, use global adaptation if CTLE_LowFreqParameter.Mode == 2 && CTLE_HighFreqParameter.Mode == 2 CTLE_LowFreqInitBestConfig = 0; CTLE_HighFreqInitBestConfig = 0; bestMetric = 0; SPB = SymbolTime/SampleInterval;
Пример кода устанавливает параметр CTLE.Mode от adapt
к fixed
позволить алгоритмическое управление значений для каждого блока. В этом случае значения непосредственно развертываются, и блоки называются, чтобы обработать импульсную характеристику.
CTLE_LowFreqInit.Mode = 1; CTLE_HighFreqInit.Mode = 1; for CTLE_LowFreqInitSweep = 0:1:6 for CTLE_HighFreqInitSweep = 0:1:15 % Set current sweep configs on each CTLE CTLE_LowFreqInit.ConfigSelect = CTLE_LowFreqInitSweep; CTLE_HighFreqInit.ConfigSelect = CTLE_HighFreqInitSweep; % Call CTLEs and DFE [sweepImpulse, ~] = CTLE_LowFreqInit(LocalImpulse); [sweepImpulse, ~] = CTLE_HighFreqInit(sweepImpulse); [sweepImpulse, ~, ~, ~, ~] = DFECDRInit(sweepImpulse);
Преобразуйте импульсную характеристику в импульсный ответ для оценки функциональным optPulseMetric
. Импульсный ответ предоставляет себя основанной на метриках оценке с большей готовностью, чем импульсная характеристика. optPulseMetric
функция используется, чтобы оптимизировать систему SerDes в целом. О многих метриках сообщает эта функция, и можно использовать алгоритм, чтобы оценить несколько компонентов получателя вместе как систему.
% Convert impulse after DFE to pulse then calculate eye metrics sweepPulse = impulse2pulse(sweepImpulse,SPB,SampleInterval); eyeMetric = optPulseMetric(sweepPulse,SPB,SampleInterval,1e-6); % Select eye metric to evaluate results sweepMetric = eyeMetric.maxMeanEyeHeight; % sweepMetric = eyeMetric.eyeHeightMax; % sweepMetric = eyeMetric.COMMax; % sweepMetric = eyeMetric.meanHeightCenter; % sweepMetric = eyeMetric.eyeHeightCenter; % sweepMetric = eyeMetric.COMCenter;
Сохраните настройки CTLE на основе сравнения с предыдущими результатами. Итоговые лучшие настройки сохранены на блоках для итогового статистического анализа (Init) и затем передали временному интервалу (GetWave) симуляцию.
% If current sweep metric is better than previous, save the CTLE configs if sweepMetric > bestMetric bestMetric = sweepMetric; CTLE_LowFreqInitBestConfig = CTLE_LowFreqInitSweep; CTLE_HighFreqInitBestConfig = CTLE_HighFreqInitSweep; end end end % Set CTLEs to best configs from sweep CTLE_LowFreqInit.ConfigSelect = CTLE_LowFreqInitBestConfig; CTLE_HighFreqInit.ConfigSelect = CTLE_HighFreqInitBestConfig; end % END: Custom user code area (retained when 'Refresh Init' button is pressed)
Запустите систему SerDes и наблюдайте поведение оптимизации. Можно попытаться измениться, какая метрика оценена, чтобы выполнить различную оптимизацию.
Вставка копии следующий код в Пользовательской пользовательской области кода в подсистеме Init получателя.
%% BEGIN: Custom user code area (retained when 'Refresh Init' button is pressed) % If both CTLEs are in Adapt mode, use global adaptation if CTLE_LowFreqParameter.Mode == 2 && CTLE_HighFreqParameter.Mode == 2 CTLE_LowFreqInitBestConfig = 0; CTLE_HighFreqInitBestConfig = 0; bestMetric = 0; SPB = SymbolTime/SampleInterval; CTLE_LowFreqInit.Mode = 1; CTLE_HighFreqInit.Mode = 1; for CTLE_LowFreqInitSweep = 0:1:6 for CTLE_HighFreqInitSweep = 0:1:15 % Set current sweep configs on each CTLE CTLE_LowFreqInit.ConfigSelect = CTLE_LowFreqInitSweep; CTLE_HighFreqInit.ConfigSelect = CTLE_HighFreqInitSweep; % Call CTLEs and DFE [sweepImpulse, ~] = CTLE_LowFreqInit(LocalImpulse); [sweepImpulse, ~] = CTLE_HighFreqInit(sweepImpulse); [sweepImpulse, ~, ~, ~, ~] = DFECDRInit(sweepImpulse); % Convert impulse after DFE to pulse then calculate eye metrics sweepPulse = impulse2pulse(sweepImpulse,SPB,SampleInterval); eyeMetric = optPulseMetric(sweepPulse,SPB,SampleInterval,1e-6); % Select eye metric to evaluate results sweepMetric = eyeMetric.maxMeanEyeHeight; % sweepMetric = eyeMetric.eyeHeightMax; % sweepMetric = eyeMetric.COMMax; % sweepMetric = eyeMetric.meanHeightCenter; % sweepMetric = eyeMetric.eyeHeightCenter; % sweepMetric = eyeMetric.COMCenter; % If current sweep metric is better than previous, save the CTLE configs if sweepMetric > bestMetric bestMetric = sweepMetric; CTLE_LowFreqInitBestConfig = CTLE_LowFreqInitSweep; CTLE_HighFreqInitBestConfig = CTLE_HighFreqInitSweep; end end end % Set CTLEs to best configs from sweep CTLE_LowFreqInit.ConfigSelect = CTLE_LowFreqInitBestConfig; CTLE_HighFreqInit.ConfigSelect = CTLE_HighFreqInitBestConfig; end % END: Custom user code area (retained when 'Refresh Init' button is pressed)
CTLE | DFECDR | optPulseMetric