Симуляция высокоскоростных приёмопередатчиков с динамической реконфигурацией для ПЛИС Intel серии V
Автор: https://github.com/iwaniwaniwan012
Введение
Этой статьей мы продолжает серию статей, цель которых поделиться опытом создания проектов в среде симуляции для тестирования динамической реконфигурации высокоскоростных интерфейсов (приёмопередатчиков) различных поколений ПЛИС фирмы Intel/Altera. В предыдущей статье мы описали IV поколение, теперь очередь «обуздать» V поколение.
Хочется немного повториться… Для того, чтобы освежить информацию в памяти.
Высокоскоростные приёмопередатчики — это пара RX и TX, встроенные в ПЛИС, которые позволяют преобразовать параллельную шину данных на низкой частоте в последовательную на высокой при передаче данных и из последовательной в параллельную при получении данных.
В ПЛИС Intel серии V для использование приёмопередатчиков необходимо использовать IP ядро Transceiver Native Phy.
Динамическая реконфигурация позволяет менять различные параметры приёмопередатчиков «на лету», то есть не меняя прошивку ПЛИС.
Общая схема проекта, который мы будем создавать, следующая:
Описание модулей
Transceiver Native Phy — IP ядро, необходимое для обеспечения приёма и передачи данных, включает в себя TX PLL, необходимая для формирования высокой частоты для передачи последовательных данных
Transceiver PHY Reset — IP ядро, необходимое для правильного сброса аппаратной и программной части высокоскоростных приёмопередатчиков, используемых в IP ядре Transceiver Native PHY
Transceiver Reconfiguration Controller — IP ядро, необходимое для динамической реконфигурации IP ядра Transceiver Native PHY
PRBS9_Generator/Checker — модули, передающие ПСП с полиномом
Управление реконфигурацией — модуль, который по счётчику отправляет запрос на перестройку скоростных характеристик
Transceiver PHY Reconfiguration User Logic — модуль, который по запросу передаёт параметры в IP ядро Transceiver Reconfiguration Controller из MIF, размещённых в памяти ПЛИС
Создание проекта
Приступим к созданию проекта
В Quartus начнём создание нового проекта, использовать будем 21.1 Lite Edition.
Выберем ПЛИС
И нажмём финиш
Перейдём к созданию необходимых нам IP ядер. Первым создадим Transceiver Native PHY. Выбираем название и язык VHDL и нам открывается окно настройки в Megawizard
Необходимо настроить следующие параметры:
Enable simplified data interface — упрощённый интерфейс данных
Data rate — 1250 mbps, скоростные характеристики
Reference clock frequency — выбор опорной частоты для TX PLL
Select CDR reference clock frequency — выбор опорной частоты для CDR (Clock Data Recovery), частота, выделенная на базе входящих данных
Enable rx_is_lockedtodata — сигнал, сигнализирующий о том, что RX заблокировался для работы на базе опорной частоты, входных данных и функционирует в обычном режиме
Enable rx_is_lockedtoref — сигнал, сигнализирующий о том, что RX заблокировался для работы на базе опорной частоты
Переходим к вкладке Standart PCS
Здесь нам необходимо выбрать только один параметр, а именно Enable 'Standart PCS' low latency mode, так как мы никакие дополнительные параметры использовать не будем
Жмём финиш, и ждём пока Quartus закончит генерацию необходимых файлов
Следующим шагом создадим Transceiver Reconfiguration Controller. Выбираем название, язык VHDL и нам открывается окно настройки в Megawizard
Здесь нам необходимо настроить:
Number of reconfiguration interfaces — 2, первый для RX/TX Channel, второй для TX PLL
Enable channel/PLL reconfiguration — включаем возможность перестройки RX/TX Channel и TX PLL
Жмём финиш, и ждём пока Quartus закончит генерацию необходимых файлов
Осталось у нас создать Transceiver PHY Reset, к созданию которого мы и переходим*.* Выбираем название, язык VHDL и нам открывается окно настройки в Megawizard
Параметры необходимо настроить следующие:
Number of transceiver channels — количество используемых каналов
Number of TX PLLs — количество TX PLL
Input clock frequency — входная частота для IP ядра
Synchronize reset input — синхронизировать запрос на сброс от пользовательской логики с входной частотой
Use fast reset for simulation — использовать ускоренную симуляцию сброса
Enable TX Channel reset control — использовать данное IP ядро для сброса TX Channel
Enable RX Channel reset control — использовать данное IP ядро для сброса RX Channel
Жмём финиш, и ждём пока Quartus закончит генерацию необходимых файлов
Всё, на этом все необходимые IP ядра созданы, проект создан, осталось сделать несколько небольших шагов:
Изменить Top Level Entity нашего проекта
Скомпилировать проект, сохранить полученные .mif файлы
Изменить скоростные характеристики в IP ядре Transceiver Native Phy
Скомпилировать проект, сохранить полученные .mif файлы
Это те .mif файлы, которые мы разместим в ROM и именно данные из них мы будем передавать в IP ядро Transceiver Reconfiguration Controller
Всё, теперь с Quartus точно всё, закрываем его =)
Transceiver Reconfiguration Controller.Описание взаимодействия
В Transceiver Reconfiguration Controller есть 3 основные шины данных для взаимодействия:
Шина Avalon-MM (Memory Mapped), для настройки параметров
Служебная шина данных между Transceiver Reconfiguration Controller и Transceiver Native PHY
Шина для получения данных из .MIF, хранящихся в ROM
Адресное пространство для шины Avalon MM, необходимое для динамической реконфигурации следующее
Адресное пространство для модуля, который принимает данные из .mif
Общая идея следующая:
По адресу 0×38 записать 0×00 — сообщаем, что будем перестраивать 0-й канал (то есть RX/TX)
По адресу 0×3A записать 0×00 — сообщаем, что на следующем шаге передадим данные по адресу 0×00
По адресу 0×3B записать 0×00 — сообщаем, что на следующем шаге передадим начальный адрес mif
По адресу 0×3C записать 0×100 — сообщаем, что адрес mif 8 бит
По адресу 0×3A записать 0×01 — записываем все переданные на предыдущих шагах данные
По адресу 0×3B записать 0×01 — сообщаем, что на следующем шаге передадим данные по адресу 0×01
По адресу 0×3C записать 0×03 — сообщаем, что хотим передать новые параметры из mif и шина данных 16 бит
По адресу 0×3A записать 0×01 — записываем все переданные на предыдущих шагах данные
По адресу 0×3A считываем данные и проверяем 8-й бит полученных данных, если '0', то перестройка закончена, если '1', то перестройка ещё в процессе
Если на предыдущем шаге получили '1', то повторяем шаг 9, если '0', то перестройка окончена
Описанный алгоритм мы повторим и для TX PLL, только номер канала передадим на 1-м шаге не 0×00, а 0×01
Итого, получается:
Через Avalon-MM сообщаем IP ядру Transceiver Reconfiguration Controller необходимые параметры
IP ядро Transceiver Reconfiguration Controller считывает из MIF (ROM) данные для RX/TX
Отправляет по служебному каналу данные в IP ядро Transceiver Native PHY
Через Avalon-MM сообщаем IP ядру Transceiver Reconfiguration Controller необходимые параметры
IP ядро Transceiver Reconfiguration Controller считывает из MIF (ROM) данные для RX/TX
Отправляет по служебному каналу данные в IP ядро Transceiver Native PHY
Перестройка IP ядра Transceiver Native PHY закончена
В общем-то вся магия на этом и заканчивается =)
Теперь посмотрим, что из всего этого выйдет и ради чего мы всё это затеяли
Симуляция
Для сборки всего проекта был написан скрипт на языке TCL, который:
Собирает все необходимые библиотеки, который необходимы для симуляции IP ядер
Собирает все необходимые библиотеки из файлов, которые были сгенерированы Quartus
Собирает все модули, разработанные самостоятельно, включая основной файл TestBench
Добавляет все необходимые сигналы для визуализации (waveform)
Запускает симуляцию
Листинг можно посмотреть в папке scripts, файл называет setup.tcl. (Ссылка на скрипт и все исходники проекта в конце статьи)
Есть пару основных моментов, на которые стоит обратить внимание
Передача необходимых параметров в IP ядро Transceiver Reconfiguration Controller через шину Avalon MM
После того, как мы записали все параметры, IP ядро выставило сигнал waitrequest в '1'
Чтение из ROM данных IP ядром Transceiver Reconfiguration Controller
При чтении из MIF в модуль от IP ядра приходят запросы на чтение, мы выставляем сигнал waitrequest в '1' на 1 такт (согласно стандарту Avalon)
Визуализация проверки данных ПСП
Данные ПСП принимаются без ошибок после каждой перестройки
Итог
У нас получился проект, который симулирует передачу данных и изменение скоростных характеристик IP ядра Transceiver Native PHY
Исходные коды всего проекта доступны в github по ссылке
Кстати, если не хочется проводить симуляцию, но хочется посмотреть сам результат, то в git так же доступен файл wlf, в котором записаны все необходимые сигналы.
P.S. Как обычно вопросы и комментарии приветствуются =)