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

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

На этой статье мы заканчиваем серию статей, посвященных симуляции высокоскоростных приёмопередатчиков различных поколений ПЛИС Intel/Altera

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

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

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

Введение

В этой статье мы подошли к самому «свежему» поколению ПЛИС фирмы Intel, а именно 10 поколение. И теперь мы будем создавать проект в среде симуляции для Arria 10.

Напомню, что высокоскоростные приёмопередатчики — это пара RX и TX, встроенные в ПЛИС, которые позволяют преобразовать параллельную шину данных на низкой частоте в последовательную на высокой при передаче данных и из последовательной в параллельную при получении данных. Они необходимы для реализации различных протоколов передачи данных. А динамическая реконфигурация в данном случае необходима для «автосогласования» скорости работы интерфейсов, например 1 / 2,5 /10 Gb Ethernet.

В ПЛИС Arria 10 схема проекта, который мы будем создавать, следующая:

lfs8_wpclfvpclgguffvzidohxc.png

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

В предыдущих поколениях схема отличается, но все различия мы опишем в конце статьи, нужно же как-то подвести итоги, или сразу дать информацию, если кто-то из читателей не захочет читать предыдущие статьи =)

Описание схемы

  • Transceiver Native PHY — IP ядро, необходимое для обеспечения приёма и передачи данных для

  • Transceiver PHY Reconfiguration Controller — модуль, обеспечивающий динамическую реконфигурацию, встроенный в IP ядро Transceiver Native PHY

  • Transceiver ATX PLL — IP ядро, необходимое для формирования высокой частоты для передачи последовательных данных

  • Transceiver ATX PLL Reconfiguration Controller —  модуль, обеспечивающий динамическую реконфигурацию, встроенный в IP ядро Transceiver ATX PLL

  • Transceiver PHY Reset — IP ядро, необходимое для правильного сброса аппаратной и программной части высокоскоростных приёмопередатчиков, используемых в IP ядре Transceiver Native PHY и Transceiver ATX PLL

  • PRBS9 Generator/Checker -модуль, генерирующий/проверяющий ПСП с полиномом G(x) = 1 + x^{5} + x^{9}

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

Приступим к нашему основному инструменту Quartus, но в этом случае будем использовать Intel Quartus Standart Edition 20.1, так как в Lite Edition нет поддержки Arria 10. Quartus Standart Edition требует лицензию, но мы выберем пробный период без возможности компиляции проекта, но мы же не собираемся работать в этом случае в железе. Думаю, что хватит уже вводных слов, пора переходить к делу.

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

В Quartus Standart Edition начнём создание нового проекта:

gfvcdbx_ic0yikkk2x2pzbllxd4.png

Здесь мы выбираем путь, по которому будет создан проект и его название

c6w-pc3svu_v0g8e2kylrev7p5e.png

Выберем ПЛИС Arria 10 GX, далее особо не важно, ну пусть будет 10AX027E3F27I2LG и нажмём финиш. Проект откроется и сразу переходим в IP Catalog. В нём создадим Transceiver Native PHY Intel Arria 10 FPGA IP

Нам откроется Platform Designer со следующим окном:

gsr1ijeazd8zaltarch9vniknxk.png

В этом окне необходимо настроить:

  • Transceiver configuration rules — PCS Direct, это значит, что не будем использовать дополнительные возможности, такие как кодек например

  • PMA configuration rules — basic

  • Transceiver mode — TX/RX Duplex

  • Number of data channels — 1, количество каналов

  • Data Rate — 1250 mbps, скоростные характеристики

  • Enable simplified data interface — значит, что мы не будем менять на лету параметры, связанные с изменением шины параллельных данных

Спускаемся ниже и там видим следующие настройки, касающиеся TX PMA

bdmvloch0o40-6-ic1j16kjqfoq.png

Здесь менять ничего не будем. Но нам важна информация о том, что для функционирования TX Channel необходимо подать на вход IP ядра частоту 625 MHz (Serial Clock)

Переходим на следующую вкладку RX PMA

w6kcojuy3kv7hbfdmazr9yczqek.png

В RX Channel нам необходимо выбрать:

  • Selected CDR reference clock frequency — выбор опорной частоты, на базе которой будет функционировать CDR (Clock Data Recovery)

  • Enable rx_is_lockedtodata port — сигнал, который говорит о том, что RX заблокирован на базе входных данных

  • Enable rx_is_lockedtoref port — сигнал, который говорит о том, что RX заблокирован на базе опорной частоты

Следующая по очереди вкладка PCS Direct Datapath:

xgqzvf4a_0ajykuusvsaqiktij8.png

Здесь всего одна настройка — выбор шины данных, выберем 20 бит и переходим к вкладке Dynamic Reconfiguration:

cyhqllddbcsey_vfhsfj4esx-je.png

И тут мы подошли к самому интересному и важному:

  • Enable Dynamic Reconfiguration — включаем динамическую реконфигурацию

  • Enable multiple reconfiguration profiles — включаем поддержку нескольких профилей, хранящиеся во встроенном реконфигураторе

  • Enable embedded reconfiguration streamer — включаем встроенный модуль, который при запросе сам изменит необходимые параметры

  • Generate reduced reconfiguration files — сгенерировать в настройках только различающиеся параметры

  • Number of reconfiguration profiles — количество используемых профилей

  • Selected reconfiguration profile — выбор профиля, который необходимо загрузить/сохранить

Далее делаем следующие шаги:

  1. Выбираем Selected reconfiguration profile 0

  2. Нажимаем Store configuration to selected profile

  3. Изменяем скорость 2500 mbps

  4. Выбираем Selected reconfiguration profile 1

  5. Нажимаем Store configuration to selected profile

  6. Готово

Нажимаем Finish и видим следующее окно:

trprx-aqcu6gscctx5herpsz-js.png

Выбираем везде VHDL, и нажимаем Generate,  на этом создание IP ядра закончено

Следующее IP ядро — Transceiver ATX PLL Intel Arria 10 FPGA IP, создаем его и видим следующее окно:

5r7i8pvkfx38lwqpdwcsrpdg1hw.png

Выбираем основные параметры:

  • PLL output frequency — 625 MHz, частота, необходимая для TX Channel

  • PLL integer reference clock frequency — 125 MHz, опорная частота для генерирования частоты, необходимой для стабильной работы PLL

После этого переходим к вкладке Dynamic Reconfiguration

idkvhhv9blummbg5j9ignhy5mvq.png

Она схожа с аналогичной вкладкой в IP ядра Transceiver Native PHY, поэтому нет смысла повторяться, главное, что нам необходимо

  • Выбрать профиль 0

  • Сохранить частоту 625 MHz

  • Выбрать профиль 1

  • Сохранить частоту 1250 MHz

Готово, нажимаем Finish и видим следующее окно:

88y_ky2k6w9-c14bp6aoehnx_00.png

В нем выбираем VHDL, нажимаем Generate, и очередное IP ядро у нас готово, осталось только одно, а именно Transceiver PHY Reset Controller

Выбираем его в IP Catalog и видим его настройки

o9d5q6x1u2dirmukgmfbpoyz9wq.png

И снова необходимо описать некоторые параметры, которые нам необходимы:

  • Input clock frequency — опорная частота, на базе которой IP ядро будет функционировать

  • Use fast reset for simulation — использовать короткий алгоритм сброса в среде симуляции

  • Enable TX Channel reset control — использовать данное IP ядро для сброса TX Channel

  • Enable RX Channel reset control — использовать данное IP ядро для сброса RX Channel

njblakrwwbdpz6tzyvu_lsokd5c.png

Заканчиваем с этим ядром, выбираем язык VHDL и жмём Generate,  и… На этом создания IP ядер закончено

Всё, теперь можно закрывать Quartus =)

Описание логики перестройки ATX PLL и Native PHY

Начиная с 10 поколения ПЛИС разработчики фирмы Intel для удобства разработчиков, использующих данные ПЛИС в своих проектах, в описанные IP ядра стали встраивать Embedded streamer, то есть всё то, что мы делали ранее в предыдущих статьях теперь можно запустить парой команд с использованием шины Avalon MM (Memory Mapped).

Ниже представлено адресное пространство как для Embedded Streamer IP ядра Native PHY так и для ATX PLL:

g7p4qmug67o-gfnx_umdvjwmps8.png

Алгоритм взаимодействия следующий:

  1. По адресу 0×340 записать в 8-ой бит единицу, в биты [2:0] — номер профиля, который необходимо загрузить

  2. По адресу 0×341 читаем данные

  3. Если в данных, которые мы запросили на 2 шаге нулевой бит равен '0', то перестройка закончена, если нет — то возвращаемся на шаг 2.

Всё, тут магия довольно простая =)

Симуляция

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

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

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

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

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

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

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

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

Взаимодействие с IP ядром Transceiver Native PHY через шину Avalon MM

gs0hsflz15r_fa85pg3evqdj280.png

Взаимодействие с IP ядром Transceiver ATX PLL через шину Avalon MM

2e7dpvt8umcfbm0k3mpvdfmaobw.png

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

mwikxf6gjxit1udzkwri43oqklc.png

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

Итог

Результат нашей работы — проект в для среды симуляции ModelSim, схема работы которого мы представили в начале статьи

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

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

Раз мы заканчиваем серию статей, то хочется сделать небольшой обзор, скажем так, эволюцию динамической реконфигурации IV, V, 10 поколений ПЛИС Intel

Поколение ПЛИС

RX/TX Channel

TX PLL

RX/TX Reconfig

TX PLL Reconfig

IV

ALTGX

Встроенная в ALTGX

Отдельное IP ядро (управляется MIF)

Отдельное IP ядро (управляется MIF)

V

Native PHY

Встроенная в Native PHY

Отдельное IP ядро (управляется AvMM и MIF)

Совмещённое с RX/TX Reconfig (управляется AvMM и MIF)

10

Native PHY

ATX PLL

Встроенное в Native PHY

Встроенное в ATX PLL

Теперь точно всё, спасибо за внимание!

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

© Habrahabr.ru