Оглавление:

Синтез IP-блоков видео Vivado HLS: 12 шагов
Синтез IP-блоков видео Vivado HLS: 12 шагов

Видео: Синтез IP-блоков видео Vivado HLS: 12 шагов

Видео: Синтез IP-блоков видео Vivado HLS: 12 шагов
Видео: FPGA Twitch 02 - Работа с IP ядрами в Xilinx Vivado: UG939 Design with IP tutorial (часть 1 из 4) 2024, Июль
Anonim
Синтез IP-блоков видео Vivado HLS
Синтез IP-блоков видео Vivado HLS

Вы когда-нибудь хотели обрабатывать видео в реальном времени без увеличения задержки или во встроенной системе? Иногда для этого используются FPGA (программируемые пользователем вентильные матрицы); однако написание алгоритмов обработки видео на языках спецификации оборудования, таких как VHDL или Verilog, в лучшем случае разочаровывает. Откройте для себя Vivado HLS, инструмент Xilinx, который позволяет вам программировать в среде C ++ и генерировать из него код языка спецификации оборудования.

Необходимое программное обеспечение:

  • Vivado HLS
  • Вивадо
  • (Если вы используете регистры AXI) Vivado SDK

(Необязательно) Загрузите примеры, сделанные Xilinx здесь:

Примеры видео Xilinx HLS

Шаг 1. Что такое Vivado HLS?

Vivado HLS - это инструмент, используемый для превращения кода, подобного C ++, в аппаратные структуры, которые могут быть реализованы на FPGA. Он включает IDE для выполнения этой разработки. После того, как вы завершили разработку кода для HLS, вы можете экспортировать сгенерированный IP-адрес в формате для использования с Vivado.

Загрузите прикрепленные файлы и положите их рядом с тем местом, где вы будете создавать свой проект. (переименуйте их обратно в «top.cpp» и «top.h», если у них рандомизированное имя)

Шаг 2. Библиотека видео HLS

Библиотека видео HLS
Библиотека видео HLS
Библиотека видео HLS
Библиотека видео HLS

В библиотеке видео HLS есть документация со справочными проектами в этом документе: XAPP1167 Еще один хороший ресурс - это страница Xilinx Wiki об этом.

Запустите Vivado HLS.

Создайте новый проект.

Возьмите файлы, которые вы загрузили на предыдущем шаге, и добавьте их в качестве исходных файлов. (Примечание: файлы не копируются в проект, а остаются там, где они есть)

Затем используйте кнопку «Обзор», чтобы выбрать верхнюю функцию.

На следующей странице выберите деталь Xilinx, которую вы используете.

Шаг 3: синтез

Синтезирующий
Синтезирующий

Решение => Запустить C Synthesis => Активное решение

Через ~ 227,218 секунды это должно быть сделано. (Примечание: ваше фактическое время синтеза будет зависеть от многих факторов)

Шаг 4. Контроль версий и другая информация для экспорта

Контроль версий и другая информация для экспорта
Контроль версий и другая информация для экспорта

Номера версий взаимодействуют с Vivado, чтобы вы могли обновлять IP в дизайне. Если это незначительное изменение версии, оно может быть выполнено на месте, в то время как изменения основной версии требуют, чтобы вы вручную добавили новый блок и удалили старый. Если ваши интерфейсы не изменились, а обновление версии является второстепенным, обновление может быть выполняется полностью автоматически, нажав кнопку обновления IP. Вы можете запустить "report_ip_status" в консоли Vivado tcl, чтобы увидеть статус вашего IP.

Задайте номера версий и другую информацию в Solution => Solution Settings…

Как вариант, эти настройки можно установить во время экспорта.

Шаг 5: Экспорт в IP-библиотеку Vivado

Экспорт в IP-библиотеку Vivado
Экспорт в IP-библиотеку Vivado
Экспорт в IP-библиотеку Vivado
Экспорт в IP-библиотеку Vivado

Решение => Экспорт RTL

Если вы не установили детали IP-библиотеки на предыдущем шаге, вы можете сделать это сейчас.

Шаг 6: синтез и анализ экспорта

Синтез и экспортный анализ
Синтез и экспортный анализ
Синтез и экспортный анализ
Синтез и экспортный анализ
Синтез и экспортный анализ
Синтез и экспортный анализ

На этом экране мы можем увидеть статистику нашего экспортированного модуля, показывающую, что он соответствует нашему тактовому периоду 10 нс (100 МГц) и сколько ресурсов он использует.

Сочетая все это, наш сводный отчет и анализ потока данных, мы видим, что это занимает 317338 тактовых циклов * тактовый период 10 нс * 14 этапов конвейера = 0,04442732 секунды. Это означает, что общая задержка, добавленная нашей обработкой изображений, составляет менее одной двадцатой секунды (при тактовой частоте 100 МГц).

Шаг 7: Добавление IP-библиотеки в Vivado

Добавление IP-библиотеки в Vivado
Добавление IP-библиотеки в Vivado
Добавление IP-библиотеки в Vivado
Добавление IP-библиотеки в Vivado
Добавление IP-библиотеки в Vivado
Добавление IP-библиотеки в Vivado
Добавление IP-библиотеки в Vivado
Добавление IP-библиотеки в Vivado

Чтобы использовать синтезированный блок IP, вам нужно добавить его в Vivado.

В Vivado добавьте репозиторий IP в свой проект, перейдя в каталог IP и щелкнув правой кнопкой мыши, выбрав «Добавить репозиторий…»

Перейдите в каталог проекта Vivado HLS и выберите каталог решения.

Он должен сообщить IP, который он нашел.

Шаг 8: Выполнение обновления

Выполнение обновления
Выполнение обновления
Выполнение обновления
Выполнение обновления
Выполнение обновления
Выполнение обновления

Иногда вам нужно внести изменения в свой HLS-блок после его включения в дизайн Vivado.

Для этого вы можете внести изменения, повторно синтезировать и экспортировать IP-адрес с более высоким номером версии (см. Подробности на предыдущем шаге об изменении основного / дополнительного номера версии).

После изменения экспорта новой версии обновите репозитории IP в Vivado. Это можно сделать, когда Vivado замечает, что IP-адрес в репозитории изменился, или активировать вручную. (Обратите внимание: если вы обновляете свои репозитории IP после запуска, но до завершения экспорта в HLS, IP временно не будет там, дождитесь его завершения и обновите снова.)

На этом этапе должно появиться окно с информацией о том, что IP-адрес был изменен на диске, и дает вам возможность обновить его с помощью кнопки «Обновить выбранный». Если изменение было незначительным изменением версии и ни один из интерфейсов не изменился, затем нажатие этой кнопки автоматически заменит старый IP-адрес новым, в противном случае может потребоваться дополнительная работа.

Шаг 9: Дополнительные сведения и информация

Следующие шаги предоставляют дополнительную информацию о том, как работает синтез HLS и что с ним можно делать.

Для примера проекта, использующего блок IP, синтезированный HLS, см. Это руководство.

Шаг 10: вывод и ввод

Выход и вход
Выход и вход
Выход и вход
Выход и вход

Выходы и входы в последний IP-блок определяются на основе анализа, который синтезатор выполняет для потока данных, поступающих и исходящих из верхней функции.

Подобно VHDL или Verilog, HLS позволяет вам указывать детали о соединениях между IP. Эти строки являются примерами этого:

void image_filter (AXI_STREAM & video_in, AXI_STREAM & video_out, int & x, int & y) {

#pragma HLS INTERFACE, ось port = video_in bundle = INPUT_STREAM #pragma HLS INTERFACE axis port = video_out bundle = OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port = x bundle = CONTROL_BUS offset = 0x14 # pragma HLS INTERFACE_S_S_BANDLITE_SPORT = s_Bandle_Bandle_port

Вы можете увидеть, как эти директивы влияют на порты, выставленные в блоке IP.

Шаг 11: Сопряжение регистров AXI

Интерфейс регистров AXI
Интерфейс регистров AXI

Чтобы получить вход / выход в / из вашего IP-блока в PS, хороший способ сделать это - через интерфейс AXI.

Вы можете указать это в своем коде HLS, включая смещения, которые будут использоваться для доступа к значению позже, например:

void image_filter (AXI_STREAM & video_in, AXI_STREAM & video_out, int & x, int & y) {

#pragma ИНТЕРФЕЙС HLS s_axilite port = x bundle = CONTROL_BUS смещение = 0x14

#pragma ИНТЕРФЕЙС HLS s_axilite port = y bundle = CONTROL_BUS offset = 0x1C #pragma HLS dataflow

х = 42;

y = 0xDEADBEEF; }

После правильного подключения в Vivado вы можете получить доступ к значениям с помощью этого кода в Vivado SDK:

#include "parameters.h"

#define xregoff 0x14 #define yregoff 0x1c x = Xil_In32 (XPAR_IMAGE_FILTER_0_S_AXI_CONTROL_BUS_BASEADDR + xregoff); y = Xil_In32 (XPAR_IMAGE_FILTER_0_S_AXI_CONTROL_BUS_BASEADDR + yregoff);

Это приведет к тому, что у вас будет 42 в x и 0xdeadbeef в y

Шаг 12: Прагма Dataflow

Прагма Dataflow
Прагма Dataflow
Прагма Dataflow
Прагма Dataflow
Прагма Dataflow
Прагма Dataflow

Внутри #pragma DATAFLOW способ реализации кода отличается от обычного C ++. Код является конвейерным, так что все инструкции всегда выполняются в разных частях данных (подумайте об этом как о сборочной линии на заводе, каждая станция работает непрерывно, выполняя одну функцию и передавая ее на следующую станцию)

из изображения видно, что каждая из директив

Несмотря на то, что они кажутся обычными переменными, объекты img на самом деле реализованы как небольшие буферы между командами. Использование изображения в качестве входных данных для функции «потребляет» его и делает непригодным для использования. (Отсюда необходимость в повторяющихся командах)

Рекомендуемые: