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

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

Введение

Этой статьей мы продолжает серию статей, цель которых поделиться опытом создания проектов в среде симуляции для тестирования динамической реконфигурации высокоскоростных интерфейсов (приёмопередатчиков) различных поколений ПЛИС фирмы Intel/Altera. В предыдущей статье мы описали IV поколение, теперь очередь «обуздать» V поколение.

Хочется немного повториться… Для того, чтобы освежить информацию в памяти.

Высокоскоростные приёмопередатчики — это пара RX и TX, встроенные в ПЛИС, которые позволяют преобразовать параллельную шину данных на низкой частоте в последовательную на высокой при передаче данных и из последовательной в параллельную при получении данных.

В ПЛИС Intel серии V для использование приёмопередатчиков необходимо использовать IP ядро Transceiver Native Phy.

Динамическая реконфигурация позволяет менять различные параметры приёмопередатчиков «на лету», то есть не меняя прошивку ПЛИС.

Общая схема проекта, который мы будем создавать, следующая:

iahcpsfktg_1cepfxmpvx5tjatw.png

Описание модулей

  • 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 — модули, передающие ПСП с полиномом G(x) = 1 + x^{5} + x^{9}

  • Управление реконфигурацией — модуль, который по счётчику отправляет запрос на перестройку скоростных характеристик

  • Transceiver PHY Reconfiguration User Logic — модуль, который по запросу передаёт параметры в IP ядро Transceiver Reconfiguration Controller из MIF, размещённых в памяти ПЛИС

Создание проекта

Приступим к созданию проекта

В Quartus начнём создание нового проекта, использовать будем 21.1 Lite Edition.

bam20sxdrh9_gcsbz3gkyftsh38.png

Выберем ПЛИС

lebhuna-ztmvy-k5cnmyp5tadfq.png

И нажмём финиш

Перейдём к созданию необходимых нам IP ядер. Первым создадим Transceiver Native PHY. Выбираем название и язык VHDL и нам открывается окно настройки в Megawizard

cu8hxadlblimjdjiavevuihzrhc.pngcb38o80hqpazadgg1vtrnogywey.png

Необходимо настроить следующие параметры:

  • 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

edr0rkgu0agvg97t3hicxhcm4zo.png

Здесь нам необходимо выбрать только один параметр, а именно Enable 'Standart PCS' low latency mode, так как мы никакие дополнительные параметры использовать не будем

Жмём финиш, и ждём пока Quartus закончит генерацию необходимых файлов

Следующим шагом создадим Transceiver Reconfiguration Controller. Выбираем название, язык VHDL и нам открывается окно настройки в Megawizard

xw2tdc_ny_lvdaemch5mmaxsnzo.png

Здесь нам необходимо настроить:

  • 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

s0fsyjcdfcsmawkho6ia8-prrri.png

Параметры необходимо настроить следующие:

  • 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 ядра созданы, проект создан, осталось сделать несколько небольших шагов:

  1. Изменить Top Level Entity нашего проекта

    wg8haa3bbi9n3mmm_rgnoruxiu4.png
  2. Скомпилировать проект, сохранить полученные .mif файлы

  3. Изменить скоростные характеристики в IP ядре Transceiver Native Phy

  4. Скомпилировать проект, сохранить полученные .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, необходимое для динамической реконфигурации следующее

goa48cyepnulgoknd6q89vzqf-o.pngga30jnzzgelzn7bnsfmbtun8n5c.png

Адресное пространство для модуля, который принимает данные из .mif

cbcykz35lmkqgwhkktfq-6tqxs8.png

Общая идея следующая:

  1. По адресу 0×38 записать 0×00 — сообщаем, что будем перестраивать 0-й канал (то есть RX/TX)

  2. По адресу 0×3A записать 0×00 — сообщаем, что на следующем шаге передадим данные по адресу 0×00

  3. По адресу 0×3B записать 0×00 — сообщаем, что на следующем шаге передадим начальный адрес mif

  4. По адресу 0×3C записать 0×100 — сообщаем, что адрес mif 8 бит

  5. По адресу 0×3A записать 0×01 — записываем все переданные на предыдущих шагах данные

  6. По адресу 0×3B записать 0×01 — сообщаем, что на следующем шаге передадим данные по адресу 0×01

  7. По адресу 0×3C записать 0×03 — сообщаем, что хотим передать новые параметры из mif и шина данных 16 бит

  8. По адресу 0×3A записать 0×01 — записываем все переданные на предыдущих шагах данные

  9. По адресу 0×3A считываем данные и проверяем 8-й бит полученных данных, если '0', то перестройка закончена, если '1', то перестройка ещё в процессе

  10. Если на предыдущем шаге получили '1', то повторяем шаг 9, если '0', то перестройка окончена

Описанный алгоритм мы повторим и для TX PLL, только номер канала передадим на 1-м шаге не 0×00, а 0×01

Итого, получается:

  1. Через Avalon-MM сообщаем IP ядру Transceiver Reconfiguration Controller необходимые параметры

  2. IP ядро Transceiver Reconfiguration Controller считывает из MIF (ROM) данные  для RX/TX

  3. Отправляет по служебному каналу данные в IP ядро Transceiver Native PHY

  4. Через Avalon-MM сообщаем IP ядру Transceiver Reconfiguration Controller необходимые параметры

  5. IP ядро Transceiver Reconfiguration Controller считывает из MIF (ROM) данные для RX/TX

  6. Отправляет по служебному каналу данные в IP ядро Transceiver Native PHY

  7. Перестройка IP ядра Transceiver Native PHY закончена

В общем-то вся магия на этом и заканчивается =)

Теперь посмотрим, что из всего этого выйдет и ради чего мы всё это затеяли

Симуляция

Для сборки всего проекта был написан скрипт на языке TCL, который:

  • Собирает все необходимые библиотеки, который необходимы для симуляции IP ядер

  • Собирает все необходимые библиотеки из файлов, которые были сгенерированы Quartus

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

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

  • Запускает симуляцию

Листинг можно посмотреть в папке scripts, файл называет setup.tcl. (Ссылка на скрипт и все исходники проекта в конце статьи)

Есть пару основных моментов, на которые стоит обратить внимание

Передача необходимых параметров в IP ядро Transceiver Reconfiguration Controller через шину Avalon MM

gqm8s_ntabapup0hj-2k6btphpo.png

После того, как мы записали все параметры, IP ядро выставило сигнал waitrequest в '1'

Чтение из ROM данных IP ядром Transceiver Reconfiguration Controller

h1tv6dtsky6gg5bhpdvez-2apdo.png

При чтении из MIF в модуль от IP ядра приходят запросы на чтение, мы выставляем сигнал waitrequest в '1' на 1 такт (согласно стандарту Avalon)

Визуализация проверки данных ПСП

oubdoltmhosktnbflntiktbplsy.png

Данные ПСП принимаются без ошибок после каждой перестройки

Итог

У нас получился проект, который симулирует передачу данных и изменение скоростных характеристик IP ядра Transceiver Native PHY

Исходные коды всего проекта доступны в github по ссылке

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

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

© Habrahabr.ru