Автор: 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
Общая идея следующая:
С использованием шины Avalon-MM (Memory Mapped)
По адресу 0x38 записать 0x00 - сообщаем, что будем перестраивать 0-й канал (то есть RX/TX)
По адресу 0x3A записать 0x00 - сообщаем, что на следующем шаге передадим данные по адресу 0x00
По адресу 0x3B записать 0x00 - сообщаем, что на следующем шаге передадим начальный адрес mif
По адресу 0x3C записать 0x100 - сообщаем, что адрес mif 8 бит
По адресу 0x3A записать 0x01 - записываем все переданные на предыдущих шагах данные
По адресу 0x3B записать 0x01 - сообщаем, что на следующем шаге передадим данные по адресу 0x01
По адресу 0x3C записать 0x03 - сообщаем, что хотим передать новые параметры из mif и шина данных 16 бит
По адресу 0x3A записать 0x01 - записываем все переданные на предыдущих шагах данные
По адресу 0x3A считываем данные и проверяем 8-й бит полученных данных, если '0', то перестройка закончена, если '1', то перестройка ещё в процессе
Если на предыдущем шаге получили '1', то повторяем шаг 9, если '0', то перестройка окончена
Описанный алгоритм мы повторим и для TX PLL, только номер канала передадим на 1-м шаге не 0x00, а 0x01.
Итого, получается:
Через 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. Как обычно вопросы и комментарии приветствуются =)