Симуляция высокоскоростных приёмопередатчиков с динамической реконфигурацией для ПЛИС Intel серии IV. Практика

Автор: https://github.com/iwaniwaniwan012

Введение

В прошлой статье ссылка. мы описали и подготовили всё, что необходимо для сборки TestBench.

Пора приступать от теории к практике. Начнём.

Создание пользовательской логики для IP ядер ALTGX_Reconfig и ALTPLL_Reconfig

Для перестройки скоростных характеристик нам необходимо:

  • перестроить TX PLL

  • перестроить RX и TX Channel

  • сбросить RX и TX Channel

  • проверить сигнал pll_locked, сигнализирующий то, что TX PLL функционирует в обычном режиме

  • проверить сигнал rx_freqlocked, сигнализирующий о том, что RX функционирует в обычном режиме

Схема всего проекта будет следующая:

hbndx54kqkh1ckzznwgjmhmmjjg.png

Описание компонентов:

  • ALTGX — IP ядро RX/TX и встроенным TX PLL

  • ALTGX_RECONFIG — IP ядро, преобразующее пользовательскую логику в служебный канал взаимодействия с ALTGX

  • ALTPLL_RECONFIG — IP ядро, преобразующее пользовательскую логику в служебный канал взаимодействия с ALTGX

  • ALTGX_RECONFIG_User_Logic — модуль, в функцию которого входит чтение MIF файла, находящегося в ROM и передача в ALTGX_RECONFIG

  • ALTPLL_RECONFIG_User_Logic — модуль, в функцию которого входит чтение MIF файла, находящегося в ROM и передача в ALTPLL_RECONFIG

  • PRBS9_Generator/Checker — модули формирования и проверки ПСП с полиномом G (x) = 1 + x^{5} + x^{9}

  • Управление реконфигурацией — модуль взаимодействующий с пользовательской логикой ALTGX_RECONFIG_User_Logic и ALTPLL_RECONFIG_User_Logic

Подробно хочется описать алгоритм взаимодействия пользовательской логики с ALTPLL_RECONFIG и ALTGX_RECONFIG

ALTPLL_RECONFIG.Описание

Общий алгоритм следующий:

  1. Отправить запрос к ALTPLL_RECONFIG о необходимости загрузки новых параметров из ROM

  2. Соединить сигналы от нужного ROM к сигналам ALTPLL_RECONFIG, оно само изменяет адрес и отправляет запросы на чтение, нужно только правильно соединить сигналы

  3. ROM у нас занимает 144 ячейки по 1 биту, и когда адрес дойдёт до 144, то в кэш ALTPLL_RECONFIG загружены новые параметры

  4. Отправить запрос ALTPLL_RECONFIG о том, что мы хотим загрузить новые параметры из кэша ALTPLL_RECONFIG в ALTGX

  5. Дождаться сигнала от ALTPLL_RECONFIG о том, что новые параметры загружены

  6. Сброс TX PLL, встроенную в ALTGX, IP ядро ALTPLL_RECONFIG производит самостоятельно

  7. Дождаться сигнала pll_locked = '1' от ALTGX

ALTGX_RECONFIG. Описание

Общий алгоритм следующий:

  1. Прочитать данные по адресу 0 из ROM и отправить запрос на запись в ALTGX_RECONFIG

  2. Дождаться сигнала о том, что данные записаны и ALTGX_RECONFIG само изменяет адрес, по которому нам необходимо прочитать данные из ROM и отправить в ALTGX_RECONFIG

  3. Повторить чтение и запись данных из ROM

  4. Когда адрес дойдёт до 48 дождаться сигнала о том, что ALTGX_RECONFIG закончило перестройку ALTGX (взаимодействие ALTGX_RECONFIG и ALTGX происходит параллельно нашим запросам на запись)

  5. Сбросить RX и TX Channel с использованием сигналов gxb_powerdown, rx_analogreset, rx_digitalreset, tx_digitalreset, установив их в '1' на один такт

  6. Дождаться сигнала rx_freqlocked = '1' от IP ядра ALTGX

Симуляция

Симуляцию мы будем проводить в ModelSim 10.2c, скорость симуляции которого значительно превосходит ModelSim Altera Edition

Можно конечно всё собирать отдельно, но разработав все необходимые модули, включая весь TestBench, мы сделали .tcl файл, который:

  • компилирует необходимые файлы всех необходимые компонентов из Quartus и добавляет их как библиотеки в проект

  • компилирует созданные нами IP ядра ALTGX, ALTGX_RECONFIG, ALTPLL_RECONFIG

  • компилирует разработанные нами модули, включая сам модуль TestBench

  • запускает симуляцию с необходимыми параметрами

  • добавляет необходимые сигналы для визуализации

Переходим в проект

cd «путь к проекту»

do ./scripts/setup.tcl

и наслаждаемся симуляцией =)

Визуализация работы ALTPLL_RECONFIG

d3dpmyp0ydu4pbbgve3yzlry_4m.png

Здесь мы наблюдаем загрузку параметров из ROM с использованием сигналов:

  • write_from_rom — начальный запрос на запись из ROM в ALTPLL_RECONFIG

  • rom_address_out — адрес по которому ALTPLL_RECONFIG ждёт данные из ROM

  • rom_data_in — данные из ROM в ALTPLL_RECONFIG

  • write_rom_enable — запрос на чтение от ALTPLL_RECONFIG в ROM

Далее, когда загрузка из ROM закончена, ALTPLL_RECONFIG начинает взаимодействие с ALTGX с использованием сигналов:

  • scanclk — тактовый сигнал служебного канала

  • scanclkena — разрешающий сигнал служебного канала

  • scandata — данные служебного канала от ALTGX_RECONFIG к ALTGX

  • scandataout — данные служебного канала от ALTGX к ALTPLL_RECONFIG

  • scandone — данные о том, что взаимодействие между ALTGX и ALTPLL_RECONFIG

  • configupdate — данные о том, что TX PLL перестроена на новые параметры

Визуализация работы ALTGX_RECONFIG

ct-7iedi7egzefmyfetgklq5c_o.png

Здесь внимание стоит обратить на следующие сигналы, используемые для реконфигурации:

  • write_all — запрос на запись от пользователя к ALTGX_RECONFIG

  • reconfig_data — данный из ROM к ALTGX_RECONFIG

  • busy — сигнал о том, что ALTGX_RECONFIG не готова обрабатывать запросы

  • error — сигнал о том, что ALTGX_RECONFIG получила ошибочные данные и сбрасывается к стартовому состоянию

  • reconfig_address_en — сигнал о том, что ALTGX_RECONFIG готова принимать данные (reconfig_address_out изменился)

  • reconfig_address_out — сигнал от ALTGX_RECONFIG о том, по какому адресу из ROM ожидаются данные

  • reconfig_fromgxb — служебный канал от ALTGX к ALTGX_RECONFIG

  • reconfig_togxb — служебный канал от ALTGX_RECONFIG к ALTGX

Визуализация работы модулей ПСП

vdmclfeftvjhz_wcuztsdcxurfa.png

Здесь мы видим, что после перестройки сигнал check_data_err падает в '0' и поднимается в '1', когда происходит очередная перестройка

Запросы на перестройку происходят 1 раз в 2048 тактов, счётчик обнуляется после успешной перестройки, и дальше по кругу, пока симуляция не надоест =)

Послесловие

Хотели поделиться опытом симуляции IV поколения ПЛИС (в нашем случае Cyclone IV) с пошаговой инструкцией и полным практическим пособием. И я считаю, что у нас это получилось!

Собранный проект как обычно доступен в git по ссылке.

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

P.S. Как обычно вопросы и комментарии приветствуются =)

© Habrahabr.ru