Автор: 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. Как обычно вопросы и комментарии приветствуются =)
ссылка на оригинал статьи https://habr.com/ru/articles/788104/
Добавить комментарий