Симуляция высокоскоростных приёмопередатчиков с динамической реконфигурацией для ПЛИС 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 функционирует в обычном режиме
Схема всего проекта будет следующая:
Описание компонентов:
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.Описание
Общий алгоритм следующий:
Отправить запрос к ALTPLL_RECONFIG о необходимости загрузки новых параметров из ROM
Соединить сигналы от нужного ROM к сигналам ALTPLL_RECONFIG, оно само изменяет адрес и отправляет запросы на чтение, нужно только правильно соединить сигналы
ROM у нас занимает 144 ячейки по 1 биту, и когда адрес дойдёт до 144, то в кэш ALTPLL_RECONFIG загружены новые параметры
Отправить запрос ALTPLL_RECONFIG о том, что мы хотим загрузить новые параметры из кэша ALTPLL_RECONFIG в ALTGX
Дождаться сигнала от ALTPLL_RECONFIG о том, что новые параметры загружены
Сброс TX PLL, встроенную в ALTGX, IP ядро ALTPLL_RECONFIG производит самостоятельно
Дождаться сигнала pll_locked = '1' от ALTGX
ALTGX_RECONFIG. Описание
Общий алгоритм следующий:
Прочитать данные по адресу 0 из ROM и отправить запрос на запись в ALTGX_RECONFIG
Дождаться сигнала о том, что данные записаны и ALTGX_RECONFIG само изменяет адрес, по которому нам необходимо прочитать данные из ROM и отправить в ALTGX_RECONFIG
Повторить чтение и запись данных из ROM
Когда адрес дойдёт до 48 дождаться сигнала о том, что ALTGX_RECONFIG закончило перестройку ALTGX (взаимодействие ALTGX_RECONFIG и ALTGX происходит параллельно нашим запросам на запись)
Сбросить RX и TX Channel с использованием сигналов gxb_powerdown, rx_analogreset, rx_digitalreset, tx_digitalreset, установив их в '1' на один такт
Дождаться сигнала 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
Здесь мы наблюдаем загрузку параметров из 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
Здесь внимание стоит обратить на следующие сигналы, используемые для реконфигурации:
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
Визуализация работы модулей ПСП
Здесь мы видим, что после перестройки сигнал check_data_err падает в '0' и поднимается в '1', когда происходит очередная перестройка
Запросы на перестройку происходят 1 раз в 2048 тактов, счётчик обнуляется после успешной перестройки, и дальше по кругу, пока симуляция не надоест =)
Послесловие
Хотели поделиться опытом симуляции IV поколения ПЛИС (в нашем случае Cyclone IV) с пошаговой инструкцией и полным практическим пособием. И я считаю, что у нас это получилось!
Собранный проект как обычно доступен в git по ссылке.
Кстати, если не хочется проводить симуляцию, но хочется посмотреть сам результат, то в git так же доступен файл wlf, в котором записаны все необходимые сигналы.
P.S. Как обычно вопросы и комментарии приветствуются =)