Проект DDR5 Модели IBIS-AMI, чтобы поддержать обучение ссылки обходной канала информации

В этом примере показано, как создать передатчик и получатель модели AMI, которые поддерживают коммуникацию обучения ссылки (обходной канал информации), как задано в спецификации IBIS 7.0 путем добавления к библиотечным блокам в SerDes Toolbox™. Этот пример использует передачу записи DDR5 (Контроллер к SDRAM), чтобы продемонстрировать настройку.

Setup Модели DDR5 Tx/Rx IBIS-AMI в Приложении SerDes Designer

Первая часть этого примера запускает с модели передатчика контроллера DDR5 от Диспетчера DDR5 Модель Transmitter/Receiver IBIS-AMI и получатель SDRAM модель AMI из Модели DDR5 SDRAM Transmitter/Receiver IBIS-AMI. Добавьте несколько дополнительных блоков передачи, чтобы поддержать коммуникацию обходной канала информации и экспортировать модель в Simulink® для дальнейшей индивидуальной настройки.

Откройте модель DDR5_Write_txrx_ami путем ввода следующей команды в командном окне MATLAB®:

>> serdesDesigner('DDR5_Write_txrx_ami')

Для транзакции записи передатчик (Tx) является контроллером DDR5, использующим канал прямую эквализацию (FFE) с 3 касаниями, в то время как получатель (Rx) использует переменный усилитель усиления (VGA) с 7 предопределенными настройками и эквалайзер обратной связи решения (DFE) с 4 касаниями со встроенным восстановлением данных часов. Чтобы поддержать эту настройку, Система SerDes настраивается можно следующим образом:

Setup настройки

  • Время символа установлено в 208.3 PS, начиная с цели операционным уровнем является 4.8Гбит/с для DDR5-4800.

  • Целевой BER установлен в 100e-18.

  • Сигнализация установлена в Single-ended.

  • Выборки на Символ и Модуляция сохранены в значениях по умолчанию, которые являются 16 и NRZ (не возвратитесь к нулю), соответственно.

Setup модели передатчика

  • Блок Pass-Through Tx_BCI является блоком, раньше поддерживал эту реализацию обходной канала информации. Операция этого блока будет описана позже в этом примере.

  • Блок Tx FFE настраивается для одного предварительного касания, одного основного касания и одного посткасания включением трех весов касания. Это сделано с массивом [0 1 0], где основное касание задано самым большим значением в массиве. Коснитесь области значений будут добавлены позже в примере, когда модель будет экспортирована в Simulink.

  • Модель Tx AnalogOut настраивается так, чтобы Напряжением был 1.1 V, Временем нарастания является 100 PS, R (выходное сопротивление) является 50 oHMS и C (емкость) является 0.65 pF. Фактические аналоговые модели, используемые в итоговой модели, будут сгенерированы позже в этом примере.

Setup модели канала

  • Потеря канала установлена в 5 дБ, который типичен для каналов DDR.

  • Несимметричный импеданс установлен в 40 Омы.

  • Целевая Частота установлена в 2.4 GHz, который является частотой Найквиста для 4,8 ГГц

Setup модели получателя

  • Блок Pass-Through Rx_BCI_Read является блоком, раньше поддерживал эту реализацию обходной канала информации. Операция этого блока будет описана позже в этом примере.

  • Модель Rx AnalogIn настраивается так, чтобы R (входное сопротивление) был 40 Омами и C (емкость) является 0.65pF. Фактические аналоговые модели, используемые в итоговой модели, будут сгенерированы позже в этом примере.

  • Блок VGA настраивается с Усилением 1 и набор Режима к на. Определенные предварительные установки VGA будут добавлены позже в этом примере после того, как модель будет экспортироваться в Simulink.

  • Блок DFECDR настраивается для четырех касаний DFE включением четырех Начальных наборов весов касания к 0. Минимальное значение касания установлено к [-0.2 -0.075 -0.06 -0.045] V, и Максимальное значение касания установлен в [0.05 0.075 0.06 0.045] V.

  • Блок Pass-Through Rx_BCI_Write является блоком, раньше поддерживал эту реализацию обходной канала информации. Операция этого блока будет описана позже в этом примере.

Экспортируйте систему SerDes в Simulink

Нажмите на кнопку Export, чтобы экспортировать настройку в Simulink для дальнейшей индивидуальной настройки и генерации исполняемых файлов модели AMI.

Setup Модели DDR5 Tx/Rx IBIS-AMI в Simulink

Эта часть примера берет систему SerDes, экспортируемую приложением SerDes Designer, и настраивает его как требуется для работы обходной канала информации DDR5 в Simulink.

Рассмотрите Setup модели Simulink

Система SerDes, импортированная в Simulink, состоит из Настройки, Стимула, Tx, Analog Channel и блоков Rx. Все настройки из приложения SerDes Designer передаются модели Simulink. Сохраните модель и рассмотрите каждую настройку блока.

  • В подсистеме Tx, дважды щелкают по блоку FFE, чтобы открыть диалоговое окно FFE Block Parameters. Расширьте параметры IBIS-AMI и отмените выбор параметра Режима, эффективно жесткое кодирование текущее значение Режима в итоговой модели AMI к Fixed.

  • В подсистеме Rx, дважды щелкают по блоку VGA, чтобы открыть диалоговое окно VGA Block Parameters. Настройки Mode и Gain перенесены из приложения SerDes Designer.

  • В подсистеме Rx, дважды щелкают по блоку DFECDR, чтобы открыть диалоговое окно DFECDR Block Parameters. Начальные веса касания, Минимальное значение касания DFE и Максимальные настройки RMS значения касания перенесены из приложения SerDes Designer. Адаптивное усиление и Адаптивный размер шага установлены в 3e-06 и 1e-06, соответственно, которые являются рыночной стоимостью на основе ожиданий DDR5 SDRAM. Расширьте параметры IBIS-AMI и отмените выбор смещения Фазы и Ссылочных параметров смещения, эффективно жесткое кодирование эти параметры к их текущим значениям.

Обновите передатчик (Tx) параметры AMI

Откройте вкладку AMI-Tx в менеджере SerDes IBIS-AMI диалоговое окно. Зарезервированные параметры перечислены сначала сопровождаемые параметрами модели специфичными, придерживающимися формата типичного файла AMI.

  • Установите касание перед акцентом: Отредактируйте TapWeights-1 и установите Формат на Range, Typ к 0, Min к -0.2, и Max к 0.2.

  • Установите основное касание: Отредактируйте TapWeights 0 и установите Формат на Range, Typ к 1, Min к 0.6, и Max к 1.

  • Установите касание постакцента: Отредактируйте TapWeights 1 и установите Формат на Range, Typ к 0, Min к -0.2, и Max к 0.2.

Создайте новый обходной канал информации Tx параметры AMI

Чтобы поддержать работу обходной канала информации, дополнительные параметры управления необходимы. Во вкладке AMI-Tx в менеджере SerDes IBIS-AMI диалоговое окно подсветите Tx_BCI и добавьте следующие 6 новых параметров:

  • FFE_Tapm1: Этот параметр создает Хранилище данных, которое используется, чтобы передать FFE пред значение касания между блоками Tx во время обучения. Нажмите Add Parameter … кнопка. Установите Название параметра к FFE_Tapm1, Текущее значение к 0, Использование к InOut, Введите к Float, и формат к Value. Установите описание как: Tx FFE Tap -1 for back-channel training. Сохраните изменения.

  • FFE_Tap0: Этот параметр создает Хранилище данных, которое используется, чтобы передать основное значение касания FFE между блоками Tx во время обучения. Нажмите Add Parameter … кнопка. Установите Название параметра к FFE_Tap0, Текущее значение к 0, Использование к InOut, Введите к Float, и формат к Value. Установите описание как: Tx FFE Tap 0 for back-channel training. Сохраните изменения.

  • FFE_Tap1: Этот параметр создает Хранилище данных, которое используется, чтобы передать значение касания сообщения FFE между блоками Tx во время обучения. Нажмите Add Parameter … кнопка. Установите Название параметра к FFE_Tap1, Текущее значение к 0, Использование к InOut, Введите к Float, и формат к Value. Установите описание как: Tx FFE Tap 1 for back-channel training. Сохраните изменения.

  • BCI_Protocol: Этот параметр только используется, чтобы сгенерировать параметр под названием "BCI_Protocol" в .ami файле для податливости к спецификации IBIS-AMI. Этот параметр не используется этой моделью. Нажмите Add Parameter … кнопка. Установите Название параметра к BCI_Protocol, Текущее значение к "DDRx_Write", Использование к Info, Введите к String, и формат к Value. Установите описание как: This model supports the DDRx Write Example back-channel protocol. NOTE: This model does not currently support BCI_Protocol as an input to the model. Сохраните изменения.

  • BCI_ID: Этот параметр только используется, чтобы сгенерировать параметр под названием "BCI_ID" в .ami файле для податливости к спецификации IBIS-AMI. Этот параметр не используется этой моделью. Нажмите Add Parameter … кнопка. Установите Название параметра к BCI_ID, Текущее значение к "bci_comm", Использование к Info, Введите к String, и формат к Value. Установите описание как: This model creates files with names beginning with 'bci_comm' for back-channel communication. NOTE: This model does not currently support BCI_ID as an input to the model. Сохраните изменения.

  • BCI_State: Этот параметр создает Хранилище данных, которое используется, чтобы передать состояние обучения обходной канала информации: 1=Off, 2=Training, 3=Converged, 4=Failed, 5=Error. Нажмите Add Parameter … кнопка. Установите Название параметра к BCI_State, Использование к InOut, Введите к Integer, и формат к List. Установите описание как: Back channel training status. Установите значение по умолчанию на 2, Перечислите значения к [1 2 3 4 5], и значения List_Tip к ["Off" "Training" "Converged" "Failed" "Error"], затем установите Текущее значение к "Training". Сохраните изменения.

Обновите получатель (Rx) параметры AMI

На вкладке AMI-Rx в менеджере SerDes IBIS-AMI диалоговое окно зарезервированные параметры перечислены сначала сопровождаемые параметрами модели специфичными, придерживающимися формата типичного файла AMI.

  • Установите усиление VGA: Отредактируйте Усиление. Установите Описание как: Rx Amplifier Gain. Убедитесь, что Формат установлен в List и Значение по умолчанию набора к 1. Значения Сетлиста как [0.5 0.631 0.794 1 1.259 1.585 2] и значения List_Tip как ["-6 dB" "-4 dB" "-2 dB" "0 dB" "2 dB" "4 dB" "6 dB"], затем установите Текущее значение к 0dB. Сохраните изменения.

  • Установите первый вес касания DFE: Отредактируйте TapWeights 1. Убедитесь, что Формат установлен в Range и набор Typ = 0, Min = -0.2, и Max = 0.05. Сохраните изменения.

  • Установите второй вес касания DFE: Отредактируйте TapWeights 2. Убедитесь, что Формат установлен в Range и набор Typ = 0, Min = -0.075, и Max = 0.075. Сохраните изменения.

  • Установите третий вес касания DFE: Отредактируйте TapWeights 3. Убедитесь, что Формат установлен в Range и набор Typ = 0, Min = -0.06, и Max = 0.06. Сохраните изменения.

  • Установите четвертый вес касания DFE: Отредактируйте TapWeights 4. Убедитесь, что Формат установлен в Range и набор Typ = 0, Min = -0.045, и Max = 0.045. Сохраните изменения.

Создайте новый обходной канал информации Rx параметры AMI

Чтобы поддержать работу обходной канала информации, дополнительные параметры управления необходимы. Во вкладке AMI-Rx в менеджере SerDes IBIS-AMI диалоговое окно подсветите Rx_BCI_Write и добавьте следующие новые параметры (Примечание: Rx_BCI_Read не требует никаких дополнительных параметров):

  • sampleVoltage: Этот параметр создает Хранилище данных, которое будет использоваться, чтобы передать демонстрационное напряжение CDR другим блокам Rx во время обучения. Нажмите Add Parameter … кнопка. Установите Название параметра к sampleVoltage, Текущее значение к 0, Использование к InOut, Введите к Float, и формат к Value. Установите описание как: Sample Voltage for back-channel training. Сохраните изменения.

  • BCI_Protocol: Этот параметр только генерирует параметр под названием "BCI_Protocol" в .ami файле для податливости к спецификации IBIS-AMI. Этот параметр не использоваться этой моделью. Нажмите Add Parameter … кнопка. Установите Название параметра к BCI_Protocol, Текущее значение к "DDRx_Write", Использование к Info, Введите к String, и формат к Value. Установите описание как: This model supports the DDRx Write Example back-channel protocol. NOTE: This model does not currently support BCI_Protocol as an input to the model. Сохраните изменения.

  • BCI_ID: Этот параметр только генерирует параметр под названием "BCI_ID" в .ami файле для податливости к спецификации IBIS-AMI. Этот параметр не использоваться этой моделью. Нажмите Add Parameter … кнопка. Установите Название параметра к BCI_ID, Текущее значение к "bci_comm", использование к Info, Введите к String, и формат к Value. Установите описание как: This model creates files with names beginning with 'bci_comm' for back-channel communication. NOTE: This model does not currently support BCI_ID as an input to the model. Сохраните изменения.

  • BCI_State: Этот параметр создает Хранилище данных, которое используется, чтобы передать состояние обучения обходной канала информации: 1=Off, 2=Training, 3=Converged, 4=Failed, 5=Error. Нажмите Add Parameter … кнопка. Установите Название параметра к BCI_State, Использование к InOut, Введите к Integer, и формат к List. Установите описание как: Back channel training status. Установите значение по умолчанию на 2, Перечислите значения к [1 2 3 4 5], и значения List_Tip к ["Off" "Training" "Converged" "Failed" "Error"], затем установите Текущее значение к "Training". Сохраните изменения.

  • BCI_Message_Interval_UI: Этот параметр только генерирует параметр под названием "BCI_Message_Interval_UI" в .ami файле для податливости к спецификации IBIS-AMI. Этот параметр не использоваться этой моделью. Нажмите Add Parameter … кнопка. Установите Название параметра к BCI_Message_Interval_UI, Текущее значение к 64, Использование к Info, Введите к Integer, и формат к Value. Установите описание как: BCI requires 1024 Samples Per Bit for proper operation. Сохраните изменения.

  • BCI_Training_UI: Этот параметр только генерирует параметр под названием "BCI_Training_UI" в .ami файле для податливости к спецификации IBIS-AMI. Этот параметр не использоваться этой моделью. Нажмите Add Parameter … кнопка. Установите Название параметра к BCI_Training_UI, Текущее значение к 100000, Использование к Info, Введите к Integer, и формат к Value. Установите описание как: BCI training may require 100,000 UI to complete. Сохраните изменения.

Запустите обновление Init

Чтобы распространить новые параметры AMI, запустите Обновление Init и на блоках Tx и на Rx.

  • Дважды щелкните по подсистеме Init в блоке Tx и нажмите кнопку Refresh Init.

  • Дважды щелкните по подсистеме Init в блоке Rx и нажмите кнопку Refresh Init.

Запустите модель

Запустите модель, чтобы симулировать систему SerDes и проверить, что текущая настройка скомпилировала и запустила без ошибок или предупреждений. Сгенерированы два графика. Первым является живой временной интервал (GetWave) глазковая диаграмма, которая обновляется, когда модель запускается. Второй график содержит четыре представления статистического (Init) результаты, как графики, доступные в Приложении SerDes Designer.

Предоставленные файлы

Три набора внешних файлов требуются, чтобы поддерживать обучение обходной канала информации. Генерация этих файлов выходит за рамки этого примера, таким образом, они включены в этот пример. Загрузите эти файлы на каталог модели (местоположение Simulink .slx файл) прежде, чем запустить полную систему SerDes или сгенерировать исполняемые файлы модели AMI.

Запишите в коммуникационные файлы обходной канала информации

Эти три файла используются, чтобы записать текущее состояние параметров обучения обходной канала информации и метрики (метрик) глаза к внешнему файлу для связи между моделями Tx и Rx AMI.

  • Файл функции MATLAB: writeBCIfile.m

  • Файлы C++ потребовали для codegen: writeamidata.cpp и writeamidata.h

Читайте из коммуникационных файлов обходной канала информации

Эти три файла используются, чтобы считать текущее состояние параметров обучения обходной канала информации и метрики (метрик) глаза из внешнего файла для связи между моделями Tx и Rx AMI.

  • Файл функции MATLAB: readBCIfile.m

  • Файлы C++ потребовали для codegen: readamidata.cpp и readamidata.h

Запишите в файлы журнала обходной канала информации

Эти три файла используются, чтобы записать текущее состояние параметров обучения обходной канала информации и метрики (метрик) глаза после каждого учебного шага к файлу журнала для отладки.

  • Файл функции MATLAB: writeBCIhistory.m

  • Файлы C++ потребовали для codegen: writebcihist.cpp и writebcihist.h

Измените Tx FFE, чтобы включить внешнее управление значений Касания

Чтобы управлять весами касания Tx FFE от блока Tx_BCI, когда обучение обходной канала информации будет включено, замените FFEParameter. Блок TapWeights Constant с блоком DataStoreRead. Этот datastore позволяет значениям касания FFE изменяться во время симуляции и передаваться в и из каждого из блоков datapath.

В подсистеме Tx нажмите на блок FFE и введите Ctrl-U, чтобы посмотреть под маской блока FFE.

  1. Удалите блок FFETapWeights Constant.

  2. Добавьте, что блок DataStoreRead пометил BCIFFETapWeightsIn.

  3. Дважды кликните на блоке DataStoreRead и установите Имя хранилища данных на: Tx_BCISignal.

  4. На вкладке Element Selection расширьте Tx_BCISignal сигнала и подсветите FFE_Tapm1, FFE_Tap0 и FFE_Tap1.

  5. Нажмите Выбор>> кнопка, чтобы выбрать эти 3 элемента.

  6. Сохраните изменения.

Добавьте блок Mux и определите номер входных параметров к 3, чтобы мультиплексировать эти три параметра в вектор для блока FFE.

Соедините выход блока Mux к входу TapWeights на FFE.

Итоговый блок FFE должен быть похожим на следующее:

Введите Ctrl-D, чтобы скомпилировать модель и проверить ошибки.

Измените DFECDR, чтобы вывести Демонстрационное Напряжение глаза

Чтобы определить качество данного набора значений эквализации во время обучения обходной канала информации, напряжение, которое производится CDR в центре глаза для каждого символа, будет использоваться. Это значение получено блоком DataStoreWrite так, чтобы его значение было доступно для других блоков управления BCI.

В подсистеме Rx нажмите на блок DFECDR и введите Ctrl-U, чтобы посмотреть под маской блока Rx DFECDR.

Откройте объект BusSelector

  1. Подсветите voltageSample из списка Сигналов в шине.

  2. Поразите Выбор>>, чтобы переместить его в список Выбранных сигналов.

  3. Сохраните изменения.

Добавьте, что блок DataStoreWrite пометил CDR sample Voltage

  1. Дважды щелкните по блоку DataStoreWrite и установите Имя хранилища данных на: Rx_BCI_WriteSignal.

  2. На вкладке Element Assignment расширьте Rx_BCI_WriteSignal сигнала и подсветите sampleVoltage.

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Соедините voltageSample выход BusSelector к входу нового блока DataStoreWrite.

Этот фрагмент блока DFECDR должен быть похожим на следующее:

Введите Ctrl-D, чтобы скомпилировать модель и проверить ошибки.

Измените DFECDR, чтобы заменить Режим, когда обучение будет включено

Во время обучения обходной канала информации и FFE и Режимы DFE должны быть установлены в "Фиксированный". Режим FFE был трудно закодирован к "Фиксированному". Простая функция MATLAB используется, чтобы позволить вам устанавливать Режим DFE, когда обучение не включено.

В подсистеме Rx нажмите на блок DFECDR и введите Ctrl-U, чтобы посмотреть под маской блока Rx DFECDR.

Удалите связь между блоком DFECDRMode и DFECDR.

Добавьте новый блок MATLAB function и установите метку на DFEModeSelect. Этот функциональный блок читает значения BCI_State и DFE.Mode и обеспечивает Режим DFE к 1 (Фиксированный), когда обучение включено или завершено. Скопировать/вставить следующий код в блок MATLAB function DFEModeSelect, заменяя содержимое по умолчанию.

function Mode = DFEModeSelect(DFEModeIn, BCI_State_In)

if BCI_State_In == 1  % Training is Off
    Mode = DFEModeIn;
else
    Mode = 1;         % Force DFE Mode to Fixed for all other Training states
end

Добавьте, что блок DataStoreRead пометил Rx_BCI_Write_BCI_State_In, таким образом, значение BCI_State может быть подано в блок MATLAB function.

  1. Дважды щелкните по блоку DataStoreRead и установите Имя хранилища данных на: Rx_BCI_WriteSignal.

  2. На вкладке Element Selection расширьте Rx_BCI_WriteSignal сигнала и подсветите BCI_State.

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Обеспечьте электричеством эти новые блоки как показано. Итоговый блок DFECDR должен быть похожим на следующее:

Введите Ctrl-D, чтобы скомпилировать модель и проверить ошибки.

Настройте Пользовательский код Tx Init

Tx Инициализируют функцию, используется, чтобы настроить модель Tx AMI для рабочего обучения обходной канала информации во время анализа GetWave. Это создает коммуникацию обходной канала информации и файлы журнала, настраивает различные параметры и заменяет любые определяемые пользователем значения касания FFE.

В подсистеме Tx введите Ctrl-U, чтобы посмотреть под маской для блока Init, затем дважды щелкнуть по инициализировать блоку, чтобы открыть Инициализировать Функцию.

Дважды щелкните по impulseEqualization блоку MATLAB function, чтобы открыть функцию в MATLAB. Это - автоматически сгенерированная функция, которая обеспечивает обработку импульсной характеристики системного блока SerDes (AMI-Init IBIS). %% BEGIN: и % END: линии обозначают раздел, где пользовательский пользовательский код может быть введен. Данные в этом разделе не перезаписываются, когда Обновление Init запущено:

%% BEGIN: Custom user code area (retained when 'Refresh Init' button is pressed)
Tx_BCIBCI_State = Tx_BCIParameter.BCI_State; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tap0 = Tx_BCIParameter.FFE_Tap0; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tap1 = Tx_BCIParameter.FFE_Tap1; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tapm1 = Tx_BCIParameter.FFE_Tapm1; % User added AMI parameter from SerDes IBIS-AMI Manager

% END: Custom user code area (retained when 'Refresh Init' button is pressed)

Используйте эту пользовательскую пользовательскую область кода, чтобы инициализировать параметры обходной канала информации, написать первую запись в коммуникационном файле обходной канала информации "BCI_comm.csv" и создать файл журнала обходной канала информации "BCI_comm_log.csv". Чтобы добавить пользовательский код системы управления обходной канала информации, прокрутите вниз к пользовательской пользовательской области кода и Скопировать/вставить следующему коду:

Tx_BCIBCI_State = Tx_BCIParameter.BCI_State; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tap0 = Tx_BCIParameter.FFE_Tap0; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tap1 = Tx_BCIParameter.FFE_Tap1; % User added AMI parameter from SerDes IBIS-AMI Manager
Tx_BCIFFE_Tapm1 = Tx_BCIParameter.FFE_Tapm1; % User added AMI parameter from SerDes IBIS-AMI Manager

%% Set up for GetWave back-channel operation
if Tx_BCIBCI_State == 2 % Training enabled
    bciWrFile = 'BCI_comm.csv'; %% Tx/Rx back-channel communication file
    Protocol = ['DDR5' 0];      %% Null terminate string to keep fprintf happy in C++
    State = ['Training' 0];     %% Null terminate string to keep fprintf happy in C++
    Sequence = 1;               %% Initialize sequence counter
    EyeHeight = 0.0;            %% Initialize training metric
    % Publish Tx capabilities
    numFFEtaps = 3;
    FFEtaps = [0.0, 1.0, 0.0];
    FFEInit.TapWeights = [0.0, 1.0, 0.0];
    % Initialize Rx capabilities (actual values set by Rx)
    numDFEtaps = 1;
    DFEtaps = 0.0000;
    
    % Create new file for back-channel communication
    writeBCIfile(bciWrFile, 'w', Protocol, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, State, EyeHeight)

    % Create new BCI_ID_log.csv file (for back-channel history)
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Tx', 'Init', 0, Tx_BCIBCI_State, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, EyeHeight)
    
end

Чтобы протестировать это, новый пользовательский код работает правильно, запустите модель, проверьте, что новая коммуникация обходной канала информации (BCI_comm.csv) и регистрирует файлы (BCI_comm_log.csv), были созданы и что значения в файлах совпадают с набором значений выше.

Настройте Пользовательский код Rx Init

Rx Инициализируют функцию, используется, чтобы настроить модель Rx AMI для рабочего обучения обходной канала информации во время анализа GetWave. Это читает в коммуникационном файле обходной канала информации и затем обновляет файл с конфигурационной информацией Rx (количество касаний DFE и значений касания DFE). Это также обновляет файл журнала.

В Ctrl-U типа подсистемы Rx, чтобы посмотреть под маской для блока Init, затем дважды щелкните по инициализировать блоку, чтобы открыть Инициализировать Функцию.

Дважды кликните на impulseEqualization блоке MATLAB function, чтобы открыть функцию в MATLAB. Это - автоматически сгенерированная функция, которая обеспечивает обработку импульсной характеристики системного блока SerDes (AMI-Init IBIS). %% BEGIN: и % END: линии обозначают раздел, где пользовательский пользовательский код может быть введен. Данные в этом разделе не перезаписываются, когда Обновление Init запущено:

%% BEGIN: Custom user code area (retained when 'Refresh Init' button is pressed)
Rx_BCI_WritesampleVoltage = Rx_BCI_WriteParameter.sampleVoltage; % User added AMI parameter from SerDes IBIS-AMI Manager
Rx_BCI_WriteBCI_State = Rx_BCI_WriteParameter.BCI_State; % User added AMI parameter from SerDes IBIS-AMI Manager

% END: Custom user code area (retained when 'Refresh Init' button is pressed)

Используйте эту пользовательскую пользовательскую область кода, чтобы считать настройку из Tx, инициализировать дополнительные параметры обходной канала информации, требуемые Rx, написать следующую запись в коммуникационном файле обходной канала информации "BCI_comm.csv" и добавить к файлу журнала обходной канала информации "BCI_comm_log.csv". Чтобы добавить пользовательский код системы управления обходной канала информации, прокрутите вниз пользовательскую пользовательскую область кода и Скопировать/вставить следующий код:

Rx_BCI_WritesampleVoltage = Rx_BCI_WriteParameter.sampleVoltage; % User added AMI parameter from SerDes IBIS-AMI Manager
Rx_BCI_WriteBCI_State = Rx_BCI_WriteParameter.BCI_State; % User added AMI parameter from SerDes IBIS-AMI Manager

%% Set up for GetWave back-channel operation
if Rx_BCI_WriteBCI_State == 2 % Training enabled
    %% Read from back-channel communication file to get setup from Tx
    bciRdFile = 'BCI_comm.csv';
    [Protocol, ~, numFFEtaps, ~, FFEtaps, Sequence, State, EyeHeight] = readBCIfile(bciRdFile);

    %% Write Rx setup to back-channel communication file.
    bciWrFile = 'BCI_comm.csv';
    Sequence = Sequence + 1;   %% Initialize sequence counter
    % Publish Rx capabilities
    numDFEtaps = 4;
    DFEtaps = [0.0000, 0.0000, 0.0000, 0.0000];
    
    writeBCIfile(bciWrFile, 'w', Protocol, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, State, EyeHeight)
    
    % Write to log file
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Rx', 'Init', 0, Rx_BCI_WriteBCI_State, numDFEtaps, numFFEtaps, DFEtaps, FFEtaps, Sequence, EyeHeight)
    
    % Force DFE Mode to Fixed when training is enabled.
    DFECDRInit.Mode = 1;
    
end

Чтобы протестировать это, новый пользовательский код работает правильно, запустите модель, проверьте, что коммуникация обходной канала информации (BCI_comm.csv) и регистрирует файлы (BCI_comm_log.csv), были созданы и что значения в файлах совпадают с набором значений выше.

Настройте блок передачи Tx Tx_BCI

Блок Tx_BCI используется, чтобы управлять целым процессом обучения обходной канала информации. Первый раз через него инициализирует все параметры Tx и Rx, которые будут оптимизированы во время обучения. После каждого обучения обходной канала информации циклически повторяются, этот блок считает текущую метрику глаза, предоставленную Rx, сохранит это значение, затем обновит параметры Tx и Rx для следующей передачи. Когда обучение будет завершено, этот блок будет сигнализировать о завершении обучения, устанавливать все параметры Tx и Rx на их оптимальные значения и затем возвращать модели в регулярную операцию.

Первый шаг должен настроить блок Tx_BCI для работы обходной канала информации. Блок MATLAB function, который управляет операцией блока Tx_BCI, записан позже в этом примере.

Посмотрите под маской в блоке Tx_BCI.

Удалите системный объект Передачи, поскольку он не используется. Обязательно соедините Inport с Выходным портом.

Добавьте, что блок Constant пометил FFETapWeights и установленный постоянное значение к FFEParameter.TapWeights.

  • Дважды щелкните по блоку Constant, чтобы открыть маску.

  • Снимите флажок с Интерпретировать векторными параметрами как с 1D флажком, чтобы препятствовать тому, чтобы входящий вектор-строка Весов Касания был преобразован в вектор-столбец.

Добавьте, что блок DataStoreRead пометил TxBCIStateIn

  1. Дважды щелкните по блоку DataStoreRead и установите Имя хранилища данных на Tx_BCISignal.

  2. На вкладке Element Selection расширьте Tx_BCISignal сигнала и подсветите BCI_State.

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте, что блок DataStoreWrite пометил BCIFFETapWeightsOut

  1. Дважды щелкните по блоку DataStoreWrite и установите Имя хранилища данных на Tx_BCISignal.

  2. На вкладке Element Assignment расширьте Tx_BCISignal сигнала и подсветите FFE_Tapm1, FFE_Tap0 и FFE_Tap1

  3. Нажмите Выбор>> кнопка, чтобы выбрать эти элементы.

  4. Сохраните изменения.

Добавьте, что блок DataStoreWrite пометил TxBCIStateOut

  1. Дважды щелкните по блоку DataStoreWrite и установите Имя хранилища данных на: Tx_BCISignal.

  2. На вкладке Element Assignment расширьте Tx_BCISignal сигнала и подсветите BCI_State.

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте блок Demux и определите номер выходных параметров к 3, чтобы демультиплексировать tapWeightsOut вектор в три отдельных сигнала.

Добавьте новый блок MATLAB function и установите метку на Counter. Эта функция MATLAB возвращает количество общего количества выборок, обработанных моделью и получившимся количеством пользовательского интерфейса. Откройте этот новый блок MATLAB function затем Скопировать/вставить следующий код, заменив содержимое по умолчанию.

function [sampCount, uiCount] = counter(SymbolTime, SampleInterval)

% Calculate Samples Per Bit
sampBit = round(SymbolTime/SampleInterval);

% Set up persistant variables
persistent x y
if isempty(x)
    x = int32(1);
    y = int32(1);
else
    x = x + 1;
end

% Start counting by UI
if mod(x,sampBit) == 0
    y = y + 1;
end

% Output results
sampCount = x;
uiCount   = y;

Значения для двух из входных параметров к этой функции, SymbolTime и SampleInterval, наследованы от Рабочего пространства модели и поэтому не должны обнаруживаться как узлы на блоке MATLAB function. Удалить эти узлы из блока MATLAB function:

  1. Сохраните функцию MATLAB.

  2. Откройте Model Explorer и перейдите к Tx-> Tx_BCI-> Счетчик.

  3. Подсветите параметр SymbolTime.

  4. Обновите осциллограф от входа до Parameter и нажмите Apply.

  5. Повторите этот процесс для SampleInterval.

Тип данных для выходных параметров этой функции, sampCount и uiCount, собирается Наследоваться по умолчанию. Поскольку этот функциональный блок создает стоимость для этих двух параметров, их Тип данных должен быть явным образом задан вместо решительного на основе эвристики. Явным образом задавать Типы данных для этих двух параметров:

  1. Откройте Model Explorer и перейдите к Tx-> Tx_BCI-> Счетчик.

  2. Подсветите параметр sampCount.

  3. Обновитесь тип от наследовались до int32 и нажмите Apply.

  4. Повторите этот процесс для uiCount.

Добавьте другой новый блок MATLAB function и установите метку на txBackChannel. Этот блок MATLAB function используется, чтобы управлять процессом обучения обходной канала информации. Содержимое этой функции покрыто позже в этом примере. Однако, чтобы завершить связи блока Tx_BCI необходимо отобразить все правильные узлы. Включить это:

  1. Дважды щелкните по txBackChannel блоку MATLAB function, чтобы открыться в редакторе MATLAB.

  2. Удалите все содержимое по умолчанию.

  3. Вставьте следующую функциональную подпись:

function [tapWeightsOut, BCIStateOut] = txBCtraining(tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)

Значения для двух из входных параметров к этой функции, SymbolTime и SampleInterval, наследованы от Рабочего пространства модели и поэтому не должны обнаруживаться как узлы на блоке MATLAB function. Удалить эти узлы из блока MATLAB function:

  1. Сохраните функцию MATLAB.

  2. Подсветите параметр SymbolTime.

  3. Щелкните правой кнопкой по параметру и выберите Data Scope для "SymbolTime".

  4. Установите значение к Параметру.

  5. Повторите этот процесс для SampleInterval.

Соедините все вместе как показано ниже:

Настройте блок Rx Rx_BCI_Read

Блок Rx_BCI_Read используется, чтобы считать значения параметров Rx, которые требует блок Tx_BCI и установить те значения для следующего цикла обучения обходной канала информации. Если блоки-сигналы Tx_BCI, что обучение завершено, этот блок, устанавливают окончательные значения, которые будут использоваться в остатке от симуляции.

Первый шаг должен настроить блок Rx_BCI_Read для работы обходной канала информации. Блок MATLAB function, который управляет операцией блока Rx_BCI_Read, записан позже в примере.

Посмотрите под маской в блоке Rx_BCI_Read.

Удалите системный объект Передачи, поскольку он не будет использоваться. Обязательно соедините Inport с Выходным портом.

Добавьте, что блок DataStoreRead пометил DFECDRTapWeightsIn

  1. Дважды щелкните по блоку DataStoreRead и установите Имя хранилища данных на: DFECDRSignal.

  2. На вкладке Element Selection расширьте DFECDRSignal сигнала и подсветите TapWeights [1,4].

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте, что блок DataStoreRead пометил RxBCIStateIn

  1. Дважды щелкните по блоку DataStoreRead и установите Имя хранилища данных на: Rx_BCI_WriteSignal.

  2. На вкладке Element Selection расширьте Rx_BCI_WriteSignal сигнала и подсветите BCI_State.

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте, что блок DataStoreWrite пометил RxBCIStateOut

  1. Дважды щелкните по блоку DataStoreWrite и установите Имя хранилища данных на: Rx_BCI_WriteSignal.

  2. На вкладке Element Assignment расширьте Rx_BCI_WriteSignal сигнала и подсветите BCI_State.

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте, что блок DataStoreWrite пометил DFECDRTapWeightsOut

  1. Дважды кликните на блоке DataStoreWrite и установите Имя хранилища данных на: DFECDRSignal.

  2. На вкладке Element Assignment расширьте DFECDRSignal сигнала и подсветите TapWeights [1,4].

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Скопируйте Встречный блок MATLAB function с блока Tx Tx_BCI в этот блок.

Добавьте новый блок MATLAB function и установите метку на rxBackChannelRead. Этот блок MATLAB function используется, чтобы управлять процессом обучения обходной канала информации. Содержимое этой функции покрыто позже в этом примере. Однако, чтобы завершить связи блока Rx_BCI_Read необходимо отобразить все правильные узлы. Включить это:

  1. Дважды щелкните по rxBackChannelRead блоку MATLAB function, чтобы открыться в редакторе MATLAB.

  2. Удалите все содержимое по умолчанию.

  3. Вставьте следующую функциональную подпись:

function [BCIStateOut, tapWeightsOut] = rxBCtrainingRead(tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)

Значения для двух из входных параметров к этой функции, SymbolTime и SampleInterval, наследованы от Рабочего пространства модели и поэтому не должны обнаруживаться как узлы на блоке MATLAB function. Удалить эти узлы из блока MATLAB function:

  1. Сохраните блок MATLAB function.

  2. Подсветите параметр SymbolTime.

  3. Щелкните правой кнопкой по параметру и выберите Data Scope для "SymbolTime".

  4. Установите значение к Параметру.

  5. Повторите этот процесс для SampleInterval.

Соедините все вместе как показано ниже:

Настройте блок Rx Rx_BCI_Write

Блок Rx_BCI_Write используется в конце каждого цикла обучения обходной канала информации, чтобы вычислить текущие метрики глаза и сообщить те метрики с блоком Tx_BCI для анализа.

Первый шаг должен настроить блок Rx_BCI_Write для работы обходной канала информации. Блок MATLAB function, который управляет операцией блока Rx_BCI_Write, записан позже в примере.

Посмотрите под маской в блоке Rx_BCI_Write.

Удалите системный объект Передачи, поскольку он не используется. Обязательно соедините Inport с Выходным портом.

Добавьте, что блок DataStoreRead пометил CDRSampleVoltageIn.

  1. Дважды щелкните по блоку DataStoreRead и установите Имя хранилища данных на: Rx_BCI_WriteSignal.

  2. На вкладке Element Selection расширьте Rx_BCI_WriteSignal сигнала и подсветите sampleVoltage.

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте, что блок DataStoreRead пометил DFECDRTapWeightsIn.

  1. Дважды кликните на блоке DataStoreRead и установите Имя хранилища данных на DFECDRSignal.

  2. На вкладке Element Selection расширьте DFECDRSignal сигнала и подсветите TapWeights[1,4] .

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Добавьте блок DataStoreRead labeled RxBCIStateIn

  1. Дважды щелкните по блоку DataStoreRead и установите Имя хранилища данных на: Rx_BCI_WriteSignal

  2. На вкладке Element Selection расширьте Rx_BCI_WriteSignal сигнала и подсветите BCI_State

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент

  4. Нажмите OK, чтобы закрыть диалоговое окно DataStoreRead.

Добавьте, что блок DataStoreWrite пометил RxBCIStateOut

  1. Дважды щелкните по блоку DataStoreWrite и установите Имя хранилища данных на: Rx_BCI_WriteSignal.

  2. На вкладке Element Assignment расширьте Rx_BCI_WriteSignal сигнала и подсветите BCI_State.

  3. Нажмите Выбор>> кнопка, чтобы выбрать этот элемент.

  4. Сохраните изменения.

Скопируйте Встречный блок MATLAB function с блока Tx Tx_BCI в этот блок.

Добавьте новый блок MATLAB function и установите метку на rxBackChannelWrite. Этот блок MATLAB function используется, чтобы управлять процессом обучения обходной канала информации. Содержимое этой функции покрыто позже в этом примере. Однако, чтобы завершить связи блока Rx_BCI_Write необходимо отобразить все правильные узлы. Включить это:

  1. Дважды щелкните по rxBackChannelWrite блоку MATLAB function, чтобы открыться в редакторе MATLAB.

  2. Удалите все содержимое по умолчанию.

  3. Вставьте следующую функциональную подпись:

function BCIStateOut = rxBCtrainingWrite(sampleV, tapWeightsIn, BCIStateIn, sampleCounter, uiCounter, SymbolTime, SampleInterval)

Значения для двух из входных параметров к этой функции, SymbolTime и SampleInterval, наследованы от Рабочего пространства модели и поэтому не должны обнаруживаться как узлы на блоке MATLAB function. Удалить эти узлы из блока MATLAB function:

  1. Сохраните блок MATLAB function.

  2. Подсветите параметр SymbolTime.

  3. Щелкните правой кнопкой мыши по параметру и выберите Data Scope для "SymbolTime".

  4. Установите значение к Параметру.

  5. Повторите этот процесс для SampleInterval.

Соедините все вместе как показано ниже:

Отредактируйте txBCtraining блок MATLAB function

Блок Tx_BCI используется, чтобы управлять целым процессом обучения обходной канала информации. Первый раз через него инициализирует все параметры Tx и Rx, которые будут оптимизированы во время обучения. После каждого цикла обучения обходной канала информации этот блок читает текущую метрику глаза, предоставленную Rx, хранит это значение, затем обновляет параметры Tx и Rx для следующей передачи. Когда обучение завершено это завершение блоков-сигналов обучения, устанавливает все параметры Tx и Rx на их оптимальные значения и затем возвращает модели в регулярную операцию.

Блок Tx_BCI был настроен для работы обходной канала информации ранее в этом примере. Теперь создайте блок MATLAB function в основе блока Tx_BCI. Этот блок MATLAB function, который был помечен txBackChannel, управляет целым процессом обучения обходной канала информации. Шаги, вовлеченные в этот процесс, следующие:

  1. Задайте функциональную подпись

  2. Инициализируйте параметры и установите персистентные переменные

  3. Задайте параметры, которые будут развернуты и их области значений

  4. На первом вызове GetWave, настроенном начальные стартовые значения параметров для Tx и Rx

  5. Каждый цикл обучения обходной канала информации считал метрики глаза, вычисленные Rx, и решает, что сделать затем. Когда обучение является полным сигналом завершение обучения, вывело оптимальные значения параметров Tx и Rx, которые будут использоваться в процессе моделирования и запишут эти окончательные значения в файл журнала.

  6. Установите на соответствующее учебное состояние и выведите параметры FFE, которые будут использоваться

Следующие разделы обходят вас через код, используемый в txBackChannel блоке MATLAB function. В блоке Tx нажмите на блок передачи Tx_BCI и введите Ctrl-U, чтобы продвинуть в блок передачи Tx_BCI, настроенный ранее. Дважды кликните на txBackChannel блоке MATLAB function, затем Скопировать/вставить код, описанный в следующих разделах.

Задайте функциональную подпись

Функциональная подпись для блока txBCtraining имеет 6 входных параметров и 2 выходных параметров. Входные параметры:

  • tapWeightsIn: FFE касаются массива весов, как задано в маске FFE.

  • BCIStateIn: значение состояния обходной канала информации от Хранилища данных TxBCIStateIn.

  • sampleCounter: Количество общего количества выборок.

  • uiCounter: Количество общего количества пользовательского интерфейса.

  • SymbolTime: пользовательский интерфейс (в секундах). Это значение наследовано от Рабочего пространства модели и поэтому не должно обнаруживаться как узел на блоке MATLAB function. Чтобы удалить этот узел из блока MATLAB function, Осциллограф Данных был установлен в "Параметр".

  • SampleInterval: размер шага Симуляции (в секундах). Это значение наследовано от Рабочего пространства модели и поэтому не должно обнаруживаться как узел на блоке MATLAB function. Чтобы удалить этот узел из блока MATLAB function, Осциллограф Данных был установлен в "Параметр".

Существует два выходных параметров:

  • tapWeightsOut: FFE касаются массива весов выход к Хранилищу данных BCIFFETapWeightsOut.

  • BCIStateOut: значение состояния обходной канала информации выход к Хранилищу данных TxBCIStateOut.

Функциональная подпись вводилась, первоначально создавание блока MATLAB function и так уже присутствует.

Инициализируйте параметры и переменные

Этот раздел настраивает эти три константы, необходимые для вычисления размера цикла обучения обходной канала информации:

  • sampBit: количество выборок в каждом пользовательском интерфейсе.

  • messageInterval: длина (в пользовательском интерфейсе) каждого цикла обучения обходной канала информации. Это значение в настоящее время установлено к итерациям ~2 PRBS7.

  • BCIwait: время задержки (в пользовательском интерфейсе) перед стартовым обучением обходной канала информации. Это значение в настоящее время установлено к итерациям ~4 PRBS7.

В дополнение к постоянным значениям этот раздел настраивает 11 персистентных переменных, используемых этой функцией. Персистентные переменные сохраняют свои значения между каждым вызовом этой функции MATLAB. 11 персистентных переменных:

  • Протокол: протокол, используемый этой моделью обходной канала информации.

  • numDFEtaps: количество касаний DFE, включаемых в этот алгоритм обучения обходной канала информации.

  • numFFEtaps: номер касания FFE, включаемые в этот алгоритм обучения обходной канала информации.

  • DFEtaps: текущие DFE касаются значений.

  • FFEtaps: текущие FFE касаются значений.

  • Последовательность: целочисленный счетчик раньше регистрировал последовательность семинаров.

  • Состояние: текущее состояние обучения обходной канала информации.

  • EyeHeight: текущая высота глаза (в Вольтах) быть сообщаемым Rx.

  • шаг: текущий шаг обучающей последовательности запущен.

  • indx: индексная переменная для циклов управления.

  • метрика: массив раньше хранил входящие высоты глаза от каждого учебного шага.

Инициализировать эти параметры и переменные, Скопировать/вставить следующий код в txBackChannel блок MATLAB function:

%% Setup
sampBit = round(SymbolTime/SampleInterval);  %% Calculate Samples Per Bit
messageInterval = 256;                       %% Length (in UI) of back-channel training cycle iteration (~2 PRBS7 iterations)
BCIwait = 512;                               %% Delay time (in UI) before starting training(~4 PRBS7 iterations)

%% Read BCI file to determine training values
% Make variables available between time steps
persistent Protocol numDFEtaps numFFEtaps DFEtaps FFEtaps Sequence State EyeHeight step indx metric

% Initialize variable initial conditions
if isempty(Protocol)
    Protocol = 'Defaults';
end
if isempty(numDFEtaps)
    numDFEtaps = 4;
end
if isempty(numFFEtaps)
    numFFEtaps = 3;
end
if isempty(DFEtaps)
    DFEtaps = [0.000,0.000,0.000,0.000];
end
if isempty(FFEtaps)
    FFEtaps = [0.000,1.000,0.000];
end
if isempty(Sequence)
    Sequence = 1;
end
if isempty(State)
    State = 'Testing';
end
if isempty(EyeHeight)
    EyeHeight = 0.000;
end
if isempty(step)
    step = 1;
end
if isempty(indx)
    indx = 1;
end
if isempty(metric)
    metric = zeros(50,1);
end

Задайте развернутые параметры

Учебный алгоритм, реализованный в этом примере, развертывает пред и сообщение значения касания FFE и все 4 из касаний DFE индивидуально, затем выбирает оптимальное значение для каждого касания. Восемь параметров используются, чтобы задать области значений для каждого из касаний и размера шага, который будет использоваться во время обучения:

  • ffeTapStep: размер шага, который будет использоваться при развертке касаний FFE. Это значение отрицательно, поскольку значения касания FFE всегда <= 0.

  • dfeTapStep: размер шага, который будет использоваться при развертке касаний DFE.

  • regFFEtapm1: область значений min / макс. область значений значений, которые будут использоваться при развертке предварительного касания FFE.

  • regFFEtap1: область значений min / макс. область значений значений, которые будут использоваться при развертке посткасания FFE.

  • regDFEtap1: область значений min / макс. область значений значений, которые будут использоваться при развертке первого касания DFE.

  • regDFEtap2: область значений min / макс. область значений значений, которые будут использоваться при развертке второго касания DFE.

  • regDFEtap3: область значений min / макс. область значений значений, которые будут использоваться при развертке третьего касания DFE.

  • regDFEtap4: область значений min / макс. область значений значений, которые будут использоваться при развертке четвертого касания DFE.

Задавать все параметры, которые будут развернуты во время обучения, Скопировать/вставить следующий код в txBackChannel блок MATLAB function:

% Define parameter step sizes
ffeTapStep = -0.050;
dfeTapStep = 0.010;

% Map ranges to register values
regFFEtapm1 = ( 0.000:ffeTapStep:-0.300);
regFFEtap1  = ( 0.000:ffeTapStep:-0.300);
regDFEtap1  = (-0.200:dfeTapStep: 0.050);
regDFEtap2  = (-0.075:dfeTapStep: 0.075);
regDFEtap3  = (-0.060:dfeTapStep: 0.060);
regDFEtap4  = (-0.045:dfeTapStep: 0.045);

Первый вызов GetWave

Когда обучение включено, самый первый вызов этой функции MATLAB должен считать коммуникационный файл обходной канала информации, записанный во время Init, чтобы определить полную поддержку моделей Tx и Rx. Этот раздел также настраивает начальные значения, которые будут использоваться в первом цикле обучения обходной канала информации. Наконец, все эти значения записаны в коммуникационный файл журнала обходной канала информации.

Реализовывать первый вызов GetWave, Скопировать/вставить следующий код в txBackChannel блок MATLAB function:

%% First Tx GetWave Call (Sequence=3)
if sampleCounter == 1 && BCIStateIn == 2 % Training enabled
    % Read back-channel communication file to get current settings
    bciRdFile = 'BCI_comm.csv';
    [~, numDFEtaps, numFFEtaps, ~, ~, Sequence, ~, EyeHeight] = readBCIfile(bciRdFile);

    % Decide what to do first
    % Tx Params
    FFEtaps = [0.000,1.000,0.000];
    % Rx Params
    DFEtaps = [0.0000, 0.0000, 0.0000, 0.0000];
    
    % Write back-channel communication file with first pass settings for Rx
    bciWrFile = 'BCI_comm.csv';
    Protocol = ['DDR5' 0];   %% Null terminate string to keep fprintf happy in C++
    State = ['Training' 0];  %% Null terminate string to keep fprintf happy in C++
    Sequence = Sequence + 1;
    writeBCIfile(bciWrFile, 'w', Protocol, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, State, EyeHeight)
    
    % Write to log file
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Tx', 'GetW', sampleCounter, BCIStateIn, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, EyeHeight)
end

Алгоритм обучения обходной канала информации

Когда обучение включено после ожидания количества пользовательского интерфейса, как задано постоянным BCIwait, алгоритм обучения обходной канала информации называется каждым учебным блоком, как задано messageInterval константой. Сначала текущие метрики, о которых сообщает Rx, читаются, затем те результаты записаны в коммуникационный файл журнала обходной канала информации. Учебный алгоритм использует следующие шаги:

  1. Развернитесь все значения FFE предварительно касаются и определяют, какое значение приводит к самому большому открытию глаза.

  2. Развернитесь все значения FFE посткасаются и определяют, какое значение приводит к самому большому открытию глаза.

  3. Развернитесь все значения DFE касаются 1 и определяют, какое значение приводит к самому большому открытию глаза.

  4. Развернитесь все значения DFE касаются 2 и определяют, какое значение приводит к самому большому открытию глаза.

  5. Развернитесь все значения DFE касаются 3 и определяют, какое значение приводит к самому большому открытию глаза.

  6. Развернитесь все значения DFE касаются 4 и определяют, какое значение приводит к самому большому открытию глаза.

  7. Когда обучение завершено, изменитесь, состояние к "Сходилось", и запишите окончательные значения в коммуникационный файл журнала обходной канала информации.

Реализовывать алгоритм обучения обходной канала информации, Скопировать/вставить следующий код в txBackChannel блок MATLAB function:

%% Each subsequent BCI Block (Sequence=5,7,9,11...)
if  uiCounter > BCIwait + 2 && mod(sampleCounter - 1, (messageInterval * sampBit)) == 0 && BCIStateIn == 2 % Training enabled
    % Read setup used for previous 16 GetWaveblocks from back-channel communication file
    bciRdFile = 'BCI_comm.csv';
    [~, ~, ~, ~, ~, Sequence, ~, EyeHeight] = readBCIfile(bciRdFile);
    
    % Write current results to log file
    Sequence = Sequence + 1;
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Tx', 'GetW', sampleCounter, BCIStateIn, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, EyeHeight)
    if indx ~= 1
        % Store current metrics
        metric(indx - 1) = EyeHeight;
    end
    
    % Decide what to do next
    switch step
        case 1  % Step 1: Determine best value for FFE tap -1
            State = ['Training' 0];  %% Null terminate string to keep fprintf happy in C++
            if indx <= length(regFFEtapm1)
                % Set values for next iteration
                FFEtaps(1) = regFFEtapm1(indx);
                FFEtaps(3) = 0.0;
                FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3));
                indx = indx + 1;
            elseif indx == length(regFFEtapm1) + 1
                % Set best metric
                [~, jj] = max(metric);
                FFEtaps(1) = regFFEtapm1(jj);
                FFEtaps(3) = 0.0;
                FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3));

                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 2  % Step 2: Determine best value for FFE tap 1
            State = ['Training' 0];
            if indx <= length(regFFEtap1)
                % Set values for next iteration
                %FFEtaps(1) = 0.0;   %% Use value from step 1
                FFEtaps(3) = regFFEtap1(indx);
                FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3));
                indx = indx + 1;
            elseif indx == length(regFFEtap1) + 1
                % Set best metric
                [~, jj] = max(metric);
                FFEtaps(3) = regFFEtap1(jj);
                FFEtaps(2) = 1 - abs(FFEtaps(1)) - abs(FFEtaps(3));

                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 3  % Step 3: Determine best value for DFE tap 1
            State = ['Training' 0];
            if indx <= length(regDFEtap1)
                % Set values for next iteration
                DFEtaps = [regDFEtap1(indx), 0.0000, 0.0000, 0.0000];
                indx = indx + 1;
            elseif indx == length(regDFEtap1) + 1
                % Set best metric
                [~, jj] = max(metric);
                DFEtaps = [regDFEtap1(jj), 0.0000, 0.0000, 0.0000];
                
                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 4  % Step 4: Determine best value for DFE tap 2
            State = ['Training' 0];
            if indx <= length(regDFEtap2)
                % Set values for next iteration
                DFEtaps(2:4) = [regDFEtap2(indx), 0.0000, 0.0000];
                indx = indx + 1;
            elseif indx == length(regDFEtap2) + 1
                % Set best metric
                [~, jj] = max(metric);
                DFEtaps(2:4) = [regDFEtap2(jj), 0.0000, 0.0000];
                
                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 5  % Step 5: Determine best value for DFE tap 3
            State = ['Training' 0];
            if indx <= length(regDFEtap3)
                % Set values for next iteration
                DFEtaps(3:4) = [regDFEtap3(indx), 0.0000];
                indx = indx + 1;
            elseif indx == length(regDFEtap3) + 1
                % Set best metric
                [~, jj] = max(metric);
                DFEtaps(3:4) = [regDFEtap3(jj), 0.0000];
                
                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 6  % Step 6: Determine best value for DFE tap 4
            State = ['Training' 0];
            if indx <= length(regDFEtap4)
                % Set values for next iteration
                DFEtaps(4) = regDFEtap4(indx);
                indx = indx + 1;
            elseif indx == length(regDFEtap4) + 1
                % Set best metric
                [~, jj] = max(metric);
                DFEtaps(4) = regDFEtap4(jj);
                
                % Done. Set up for next step
                metric = zeros(50,1);
                step = step + 1;
                indx = 1;
            end
        case 7  % Step 7: Training is complete
            State = ['Converged' 0];
            % Write final entry in log file
            logFileName = 'BCI_comm_log.csv';
            Sequence = Sequence + 1;
            writeBCIhistory(logFileName, 'Tx', 'GetW', sampleCounter, 3, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, EyeHeight)
        otherwise
            State = ['Error' 0];
    end
    
    % Write to back-channel communication file with next pass settings for Rx
    bciWrFile = 'BCI_comm.csv';
    Protocol = ['DDR5' 0];   %% Null terminate string to keep fprintf happy in C++
    writeBCIfile(bciWrFile, 'w', Protocol, numel(DFEtaps), numel(FFEtaps), DFEtaps, FFEtaps, Sequence, State, EyeHeight)

end

Установите учебное состояние и значения выходного параметра

Последняя вещь, в которой должна выполнить эта функция MATLAB, состоит в том, чтобы обновить состояние для Хранилища данных BCI_State и обновить значения касания FFE массивов.

Установить учебные и выходные значения состояния, Скопировать/вставить следующий код в txBackChannel блок MATLAB function:

%% Set back-channel state
if strcmpi(State,'Off') || strcmpi(State,['Off' 0])
    BCIStateOut = 1;
elseif strcmpi(State,'Training') || strcmpi(State,['Training' 0])
    BCIStateOut = 2;
elseif strcmpi(State,'Converged') || strcmpi(State,['Converged' 0])
    BCIStateOut = 3;
elseif strcmpi(State,'Failed') || strcmpi(State,['Failed' 0])
    BCIStateOut = 4;
else %Error
    BCIStateOut = 5;
end

%% Set output FFE values based on Training
if BCIStateOut == 2 || BCIStateOut == 3 % Training enabled/Converged
    tapWeightsOut = FFEtaps(1,1:3);
else  % Training Off/Failed/Error
    tapWeightsOut = tapWeightsIn;
end

Сохраните и закройте этот блок MATLAB function.

Отредактируйте rxBCtrainingRead блок MATLAB function

Блок Rx_BCI_Read используется, чтобы считать значения параметров Rx, которые требует блок Tx_BCI и установить их для следующего цикла обучения обходной канала информации. Если блоки-сигналы Tx_BCI, что обучение завершено, этот блок, устанавливают окончательные значения, которые будут использоваться Rx в остатке от симуляции.

Блок Rx_BCI_Read был настроен для работы обходной канала информации ранее в этом примере. Теперь создайте блок MATLAB function в центре блока Rx_BCI_Read. Этот блок MATLAB function, который был помечен rxBCtrainingRead, устанавливает значения Rx DFE, которые будут использоваться. Шаги, вовлеченные в этот процесс, следующие:

  1. Задайте функциональную подпись.

  2. Инициализируйте параметры и установите персистентные переменные.

  3. На первом вызове GetWave, и в начале каждого цикла обучения обходной канала информации, читают значения касания Rx DFE, которые будут использоваться, как задано алгоритмом обучения обходной канала информации Tx.

  4. Установите соответствующее учебное состояние и выведите параметры DFE, которые будут использоваться.

Следующие разделы обходят вас через код, используемый в rxBCtrainingRead блоке MATLAB function. В блоке Rx нажмите на блок передачи Rx_BCI_Read и введите Ctrl-U, чтобы продвинуть в блок передачи Rx_BCI_Read, настроенный ранее. Дважды щелкните по rxBCtrainingRead блоку MATLAB function, затем Скопировать/вставить код, описанный в следующих разделах.

Задайте функциональную подпись

Функциональная подпись для блока rxBCtrainingRead имеет 6 входных параметров и 2 выходных параметров. Входные параметры:

  • tapWeightsIn: DFE касаются массива весов, как задано в Хранилище данных DFECDRTapWeightsIn.

  • BCIStateIn: значение состояния обходной канала информации от Хранилища данных RxBCIStateIn.

  • sampleCounter: Количество общего количества выборок.

  • uiCounter: Количество общего количества пользовательского интерфейса.

  • SymbolTime: пользовательский интерфейс (в секундах). Это значение наследовано от Рабочего пространства модели и поэтому не должно обнаруживаться как узел на блоке MATLAB function. Чтобы удалить этот узел из блока MATLAB function, Осциллограф Данных был установлен в "Параметр".

  • SampleInterval: размер шага Симуляции (в секундах). Это значение наследовано от Рабочего пространства модели и поэтому не должно обнаруживаться как узел на блоке MATLAB function. Чтобы удалить этот узел из блока MATLAB function, Осциллограф Данных был установлен в "Параметр".

Существует два выходных параметров:

  • tapWeightsOut: DFE касаются массива весов выход к Хранилищу данных DFECDRTapWeightsOut.

  • BCIStateOut: значение состояния обходной канала информации выход к Хранилищу данных RxBCIStateOut.

Функциональная подпись вводилась, первоначально создавание блока MATLAB function и так уже присутствует.

Инициализируйте параметры и переменные

Этот раздел настраивает эти три константы, необходимые для вычисления размера цикла обучения обходной канала информации:

  • sampBit: количество выборок в каждом пользовательском интерфейсе.

  • messageInterval: длина (в пользовательском интерфейсе) каждого цикла обучения обходной канала информации. Это значение в настоящее время установлено к итерациям ~2 PRBS7.

  • BCIwait: время задержки (в пользовательском интерфейсе) перед стартовым обучением обходной канала информации. Это значение в настоящее время установлено к итерациям ~4 PRBS7.

В дополнение к постоянным значениям этот раздел настраивает 7 персистентных переменных, используемых этой функцией. Персистентные переменные сохраняют свои значения между каждым вызовом этой функции MATLAB. 7 персистентных переменных:

  • Протокол: протокол, используемый этой моделью обходной канала информации.

  • numDFEtaps: количество касаний DFE, включаемых в этот алгоритм обучения обходной канала информации.

  • numFFEtaps: номер касания FFE, включаемые в этот алгоритм обучения обходной канала информации.

  • DFEtaps: текущие DFE касаются значений.

  • FFEtaps: текущие FFE касаются значений.

  • Последовательность: целочисленный счетчик раньше регистрировал последовательность семинаров.

  • Состояние: текущее состояние обучения обходной канала информации.

Инициализировать параметры и переменные, Скопировать/вставить следующий код в rxBCtrainingRead блок MATLAB function:

%% Setup
sampBit = round(SymbolTime/SampleInterval);  %% Calculate Samples Per Bit
messageInterval = 256;                       %% Length (in UI) of back-channel training cycle iteration (~2 PRBS7 iterations)
BCIwait = 512;                               %% Delay time (in UI) before starting training(~4 PRBS7 iterations)

% Make variables available between time steps
persistent Protocol numDFEtaps numFFEtaps DFEtaps FFEtaps Sequence State;

% Initialize variable initial conditions
if isempty(Protocol)
    Protocol = 'Defaults';
end
if isempty(numDFEtaps)
    numDFEtaps = 4;
end
if isempty(numFFEtaps)
    numFFEtaps = 3;
end
if isempty(DFEtaps)
    DFEtaps = tapWeightsIn;
end
if isempty(FFEtaps)
    FFEtaps = [0,0,0];
end
if isempty(Sequence)
    Sequence = 1;
end
if isempty(State)
    if BCIStateIn == 1     % Off
        State = ['Off' 0];
    elseif BCIStateIn == 2 % Training
        State = ['Training' 0];
    elseif BCIStateIn == 3 % Converged
        State = ['Converged' 0];
    elseif BCIStateIn == 4 % Failed
        State = ['Failed' 0];
    else  % Error
        State = ['Error' 0];
    end
end

Считайте значения касания DFE, которые будут использоваться

Когда обучение включено на самом первом вызове этой функции MATLAB и в начале каждого учебного блока, как задано messageInterval константой, коммуникационный файл обходной канала информации читается, чтобы определить обновленные значения касания DFE, которые будут использоваться в следующем учебном цикле.

Чтобы настроить DFE касаются значений, которые будут использоваться, Скопировать/вставить следующий код в rxBCtrainingRead блок MATLAB function:

%% First GetWave block of each BCI Block (Sequence=3,5,7,9,11,...)
% Read back-channel communication file to get current settings
if  (sampleCounter == 1 && BCIStateIn == 2) || ((uiCounter > BCIwait + 2 && mod(sampleCounter - 1, (messageInterval * sampBit)) == 0) && BCIStateIn == 2) % Training enabled
    bciRdFile = 'BCI_comm.csv';
    [Protocol, numDFEtaps, numFFEtaps, DFEtaps(1,1:4), FFEtaps, Sequence, State, ~] = readBCIfile(bciRdFile);
    
end

Установите учебное состояние и значения выходного параметра

Последняя вещь, в которой должен выполнить этот блок MATLAB function, состоит в том, чтобы обновить состояние для Хранилища данных BCI_State и обновить значения касания DFE массивов.

Установить и выходные значения состояния, Скопировать/вставить следующий код в rxBCtrainingRead блок MATLAB function:

%% Set back-channel state
if strcmpi(State,'Off') || strcmpi(State,['Off' 0])
    BCIStateOut = 1;
elseif strcmpi(State,'Training') || strcmpi(State,['Training' 0])
    BCIStateOut = 2;
elseif strcmpi(State,'Converged') || strcmpi(State,['Converged' 0])
    BCIStateOut = 3;
elseif strcmpi(State,'Failed') || strcmpi(State,['Failed' 0])
    BCIStateOut = 4;
else %Error
    BCIStateOut = 5;
end

%% Set output DFE values based on Training
if BCIStateOut == 2 % Training enabled
    tapWeightsOut = DFEtaps(1,1:4);
else
    tapWeightsOut = tapWeightsIn;
end

Сохраните и закройте этот блок MATLAB function.

Отредактируйте rxBCtrainingWrite блок MATLAB function

Блок Rx_BCI_Write используется в конце каждого цикла обучения обходной канала информации, чтобы вычислить текущие метрики глаза и сообщить те метрики с блоком Tx_BCI для анализа.

Блок Rx_BCI_Write был настроен для работы обходной канала информации ранее в этом примере. Теперь блок MATLAB function в центре блока Rx_BCI_Write будет создан. Этот блок MATLAB function, который мы пометили rxBCtrainingWrite, вычислит минимальную высоту глаза последних 127 битов и запишет те значения в коммуникационный файл обходной канала информации и файл журнала. Шаги, вовлеченные в этот процесс, следующие:

  1. Задайте функциональную подпись.

  2. Инициализируйте параметры и установите персистентные переменные.

  3. Сохраните вектор напряжений, которые будут использоваться при вычислении минимальной высоты глаза.

  4. В конце каждого обходной канала информации цикл обучения вычисляет минимальную высоту глаза и пишет его в коммуникационный файл обходной канала информации.

  5. Обновите учебное состояние.

Следующие разделы будут идти через код, используемый в rxBCtrainingWrite блоке MATLAB function. В блоке Rx нажмите на блок передачи Rx_BCI_Write и введите Ctrl-U, чтобы продвинуть в блок передачи Rx_BCI_Write, настроенный ранее. Дважды кликните на rxBCtrainingWrite блоке MATLAB function, затем Скопировать/вставить код, описанный в следующих разделах.

Задайте функциональную подпись

Функциональная подпись для блока rxBCtrainingWrite имеет 7 входных параметров и 1 выход. Входные параметры:

  • sampleV: напряжение в шаге расчета CDR.

  • tapWeightsIn: DFE касаются массива весов, как задано в Хранилище данных DFECDRTapWeightsIn.

  • BCIStateIn: значение состояния обходной канала информации от Хранилища данных RxBCIStateIn.

  • sampleCounter: Количество общего количества выборок.

  • uiCounter: Количество общего количества пользовательского интерфейса.

  • SymbolTime: пользовательский интерфейс (в секундах). Это значение наследовано от Рабочего пространства модели и поэтому не должно обнаруживаться как узел на блоке MATLAB function. Чтобы удалить этот узел из блока MATLAB function, Осциллограф Данных был установлен в "Параметр".

  • SampleInterval: размер шага Симуляции (в секундах). Это значение наследовано от Рабочего пространства модели и поэтому не должно обнаруживаться как узел на блоке MATLAB function. Чтобы удалить этот узел из блока MATLAB function, Осциллограф Данных был установлен в "Параметр".

Существует тот выход:

  • BCIStateOut: значение состояния обходной канала информации выход к Хранилищу данных RxBCIStateOut.

Функциональная подпись вводилась, первоначально создавание блока MATLAB function и так уже присутствует.

Инициализируйте параметры и переменные

Этот раздел настраивает эти четыре константы, необходимые для вычисления размера цикла обучения обходной канала информации:

  • sampBit: количество выборок в каждом пользовательском интерфейсе.

  • messageInterval: длина (в пользовательском интерфейсе) каждого цикла обучения обходной канала информации. Это значение в настоящее время установлено к итерациям ~2 PRBS7.

  • BCIwait: время задержки (в пользовательском интерфейсе) перед стартовым обучением обходной канала информации. Это значение в настоящее время установлено к итерациям ~4 PRBS7.

  • windowLength: длина окна (в пользовательском интерфейсе) раньше вычисляла минимальную высоту глаза. Это значение в настоящее время установлено к 1 итерации PRBS7.

В дополнение к постоянным значениям этот раздел настраивает 5 персистентных переменных, используемых этой функцией. Персистентные переменные сохраняют свои значения между каждым вызовом этой функции MATLAB. 5 персистентных переменных:

  • Протокол: протокол, используемый этой моделью обходной канала информации.

  • Последовательность: целочисленный счетчик раньше регистрировал последовательность семинаров.

  • Состояние: текущее состояние обучения обходной канала информации.

  • EyeHeight: расчетное внутреннее значение высоты глаза (в Вольтах).

  • vSamp: демонстрационное напряжение, сообщаемое блоком CDR.

Инициализировать все параметры и переменные для этого блока, Скопировать/вставить следующий код в rxBCtrainingWrite блок MATLAB function:

%% Setup
sampBit = round(SymbolTime/SampleInterval);  %% Calculate Samples Per Bit
messageInterval = 256;                       %% Length (in UI) of back-channel training cycle iteration (~2 PRBS7 iterations)
BCIwait = 512;                               %% Delay time (in UI) before starting training(~4 PRBS7 iterations)
windowLength = 127;                          %% Length of window (in UI) used to calculate minimum eye height (1 PRBS7 iteration)

% Make variables available between time steps
persistent Protocol Sequence State EyeHeight vSamp

if isempty(State)
    if BCIStateIn == 1     % Off
        State = ['Off' 0];
    elseif BCIStateIn == 2 % Training
        State = ['Training' 0];
    elseif BCIStateIn == 3 % Converged
        State = ['Converged' 0];
    elseif BCIStateIn == 4 % Failed
        State = ['Failed' 0];
    else  % Error
        State = ['Error' 0];
    end
end

Вектор хранилища напряжений, о которых сообщают,

Этот раздел накапливает прокручивающийся вектор напряжений, которые будут использоваться в минимальном расчете высоты глаза. Примите, что эти напряжения симметричны вокруг 0V, таким образом, абсолютное значение используется.

Сохранить значения напряжения глаза отчета, Скопировать/вставить следующий код в rxBCtrainingWrite блок MATLAB function:

% Accumulate rolling vector of voltages for minimum eye height calculations
if isempty(vSamp)
    vSamp = zeros(1, windowLength * sampBit);
end
vSamp = circshift(vSamp, 1);
vSamp(1) = abs(sampleV);      % Assume symmetry and only use positive values

Вычислите минимальную высоту глаза и запишите в файл

Когда обучение включено после ожидания количества пользовательского интерфейса, как задано постоянным BCIwait, метрики обходной канала информации вычисляются в конце каждой учебной итерации, как задано messageInterval константой. Сначала настройка обходной канала информации читается из коммуникационного файла обходной канала информации, затем внутреннее значение высоты глаза вычисляется и результаты выход к коммуникационному файлу обходной канала информации и файлу журнала.

calcalate метрики глаза и запись к коммуникации регистрируют каждый цикл обходной канала информации, Скопировать/вставить следующий код в rxBCtrainingWrite блок MATLAB function:

%% Write current state and eye metrics at the end of each BCI block
if  uiCounter > BCIwait + 2 && mod(sampleCounter, (messageInterval * sampBit)) == 0 && BCIStateIn == 2 % Training enabled  (Sequence=4,6,8,10,12,...)

    % Read setup used for last 16 GetWaveblocks from back-channel communication file
    bciRdFile = 'BCI_comm.csv';
    [Protocol, ~, ~, ~, FFEtaps, Sequence, State, ~] = readBCIfile(bciRdFile);

    % Calculate inner eye height from sampled voltage:
    EyeHeight = min(vSamp) * 2;    % 2x since using absolute value.
    
    % Write new back-channel communication file with end of BCI-Block metrics
    bciWrFile = 'BCI_comm.csv';
    Sequence = Sequence + 1;
    writeBCIfile(bciWrFile, 'w', Protocol, numel(tapWeightsIn), numel(FFEtaps), tapWeightsIn, FFEtaps, Sequence, State, EyeHeight)
    %
    % Write to log file:
    logFileName = 'BCI_comm_log.csv';
    writeBCIhistory(logFileName, 'Rx', 'GetW', sampleCounter, BCIStateIn, numel(tapWeightsIn), numel(FFEtaps), tapWeightsIn, FFEtaps, Sequence, EyeHeight)

end

Установите учебное состояние

Последняя вещь, в которой должен выполнить этот блок MATLAB function, состоит в том, чтобы обновить состояние для Хранилища данных BCI_State.

Установить учебное состояние, Скопировать/вставить следующий код в rxBCtrainingRead блок MATLAB function:

%% Update State Out if State In changed
if BCIStateIn == 3     % Converged
    State = ['Converged' 0];
elseif BCIStateIn == 4 % Failed
    State = ['Failed' 0];
end

if strcmpi(State,'Off') || strcmpi(State,['Off' 0])
    BCIStateOut = 1;
elseif strcmpi(State,'Training') || strcmpi(State,['Training' 0])
    BCIStateOut = 2;
elseif strcmpi(State,'Converged') || strcmpi(State,['Converged' 0])
    BCIStateOut = 3;
elseif strcmpi(State,'Failed') || strcmpi(State,['Failed' 0])
    BCIStateOut = 4;
else %Error
    BCIStateOut = 5;
end

Сохраните и закройте этот блок MATLAB function.

В Simulink введите Ctrl-D, чтобы скомпилировать модель и проверить ошибки. Разрешите любые ошибки перед продолжением.

Запустите Модель и Проверьте результаты

Следующий шаг должен запустить модель и проверить, что код обходной канала информации действует правильно.

Настройте параметры симуляции

Прежде, чем запустить полную модель, откройтесь, блок Stimulus, чтобы установить шаблон стимула раньше тестировал модель:

  • Установите PRBS на 7, так, чтобы шаблон PRBS7 использовался в процессе моделирования.

  • Определите Номер символов к 50000 позволить достаточному количеству времени алгоритма обучения обходной канала информации завершаться.

Протестируйте соответствующий opereration моделей Tx и Rx

Запустите модель. В то время как модель запускается, будьте пунктуальны доменная форма волны, изменяющаяся, когда каждая из настроек касания развертывается. Когда симуляция завершена, коммуникационный файл обходной канала информации, BCI_comm.csv, должен выглядеть похожим на:

Protocol,DDR5,
numDFEtaps,4,
numFFEtaps,3,
DFEtaps,0.01000,-0.00500,-0.01000,-0.00500,
FFEtaps,0.00000,0.85000,-0.15000,
Sequence,176,
State,Converged,
EyeHeight,0.612739,

Откройте коммуникационный файл журнала обходной канала информации, BCI_comm_log.csv, в редакторе электронной таблицы. Каждая строка в файле журнала показывает Порядковый номер, который модель записала в файл (Tx или Rx), текущее Демонстрационное количество, BCI_State и вычислила Высоту Глаза. Последние 7 столбцов в журнале показывают текущий FFE и симулируемые значения касаний DFE. Наблюдайте, как Высота Глаза изменяется, когда каждое значение развертывается, и значение параметров, которое дает самую большую Высоту Глаза, установлено после каждой итерации. Обратите внимание на то, что значение FFE0 всегда вычисляется из значений FFE-1 и FFE1.

Сгенерируйте Модель DDR5 Tx/Rx IBIS-AMI

Итоговая часть этого примера берет индивидуально настраиваемую модель Simulink и генерирует IBIS-AMI совместимые исполняемые файлы модели DDR5, IBIS и файлы AMI.

Откройте диалоговое окно Block Parameter для Блока Configuration и нажмите на кнопку Open SerDes IBIS-AMI Manager.

Экспортируйте модели

На вкладке Export в менеджере SerDes IBIS/AMI диалоговое окно.

  • Обновите имя модели Tx к ddr5_bc_tx.

  • Обновите имя модели Rx к ddr5_bc_rx.

  • Обратите внимание на то, что угол Tx и Rx percentageis набор к 10. Это будет масштабировать угловые значения аналоговой модели min / макс. угловые значения аналоговой модели +/-10%.

  • Проверьте, что модель Dual выбрана и для Tx и для Настроек Модели AMI Rx. Это создаст исполняемые файлы модели, которые поддерживают и статистический (Init) и временной интервал (GetWave) анализ.

  • Установите Биты модели Tx игнорировать значение к 3 с тех пор в Tx FFE существует три касания.

  • Установите Биты модели Rx игнорировать значение к 50000 позволить достаточно времени для обучения завершиться во время симуляций области времени.

  • Установите Модели экспортировать и как Tx и как Rx так, чтобы все файлы были выбраны, чтобы быть сгенерированными (файл IBIS, файлы AMI и файлы DLL).

  • Установите имя файла IBIS быть ddr5_bc_txrx.ibs

  • Дрожание может быть добавлено при желании.

  • Нажмите кнопку Export, чтобы сгенерировать модели в директории Target.

Обновите файлы AMI при желании

Tx и файлы AMI Rx, сгенерированные SerDes Toolbox, совместимы к спецификации IBIS 6.1, таким образом, весь обходной канал информации определенные параметры был помещен в раздел Model_Specific файла. Если вы хотите сделать модели совместимыми к спецификации IBIS 7.0, обновить AMI_Version к "7,0" и переместить все параметры BCI_* в раздел Reserved_Parameters файла.

Параметр BCI_State имеет 5 состояний, требуемых для полного обучения обходной канала информации, однако чтобы сделать эти модели более удобными для пользователя, конечному пользователю только нужны 2 состояния: "Прочь" и "Обучение". Чтобы внести это изменение, обновите параметр BCI_State в каждом файле AMI можно следующим образом:

  • Превратитесь (список 1 2 3 4 5) в (List 1 2).

  • Изменение (List_Tip "от" "обучения" "сходился" "не пройдено" "ошибка") к (List_Tip "Off" "Training").

  • Обратите внимание на то, что это не будет влиять на операцию модели, только к значениям параметров, видимым пользователю.

Протестируйте сгенерированные модели IBIS-AMI

Модели IBIS-AMI передатчика и получателя DDR5 теперь завершены и готовы быть протестированными в любом промышленном стандарте средство моделирования модели AMI.

Ограничения модели

При симуляции с этими моделями в промышленном стандарте средства моделирования модели AMI помните о нижеследующих ограничениях:

  • BCI_Protocol не поддержан. Эти модели были трудно закодированы к Протоколу под названием "DDRx_Write".

  • BCI_ID не поддержан. Эти модели были трудно закодированы к BCI_ID, названному "bci_comm", что означает, что каждая симуляция должна быть запущена в отдельной директории, чтобы избежать конфликтов имени файла в процессе моделирования.

  • Эти модели должны быть запущены с размером блока 1 024 для правильного функционирования.

  • Обучение обходной канала информации должно быть позволено на обеих моделях для обучения быть включенным. Это сделано путем установки параметров BCI_State на "Обучение".

  • Эти модели будут действовать правильно с любым пользовательским интерфейсом или Выборками На Битные значения.

Ссылки

  1. Спецификация IBIS 7.0, https://ibis.org/ver7.0/ver7_0.pdf

  2. Веб-сайт JEDEC, https://www.jedec.org /