Оглавление:
- Шаг 1. Что такое Vivado HLS?
- Шаг 2. Библиотека видео HLS
- Шаг 3: синтез
- Шаг 4. Контроль версий и другая информация для экспорта
- Шаг 5: Экспорт в IP-библиотеку Vivado
- Шаг 6: синтез и анализ экспорта
- Шаг 7: Добавление IP-библиотеки в Vivado
- Шаг 8: Выполнение обновления
- Шаг 9: Дополнительные сведения и информация
- Шаг 10: вывод и ввод
- Шаг 11: Сопряжение регистров AXI
- Шаг 12: Прагма Dataflow
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Вы когда-нибудь хотели обрабатывать видео в реальном времени без увеличения задержки или во встроенной системе? Иногда для этого используются 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 есть документация со справочными проектами в этом документе: 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
Решение => Экспорт RTL
Если вы не установили детали IP-библиотеки на предыдущем шаге, вы можете сделать это сейчас.
Шаг 6: синтез и анализ экспорта
На этом экране мы можем увидеть статистику нашего экспортированного модуля, показывающую, что он соответствует нашему тактовому периоду 10 нс (100 МГц) и сколько ресурсов он использует.
Сочетая все это, наш сводный отчет и анализ потока данных, мы видим, что это занимает 317338 тактовых циклов * тактовый период 10 нс * 14 этапов конвейера = 0,04442732 секунды. Это означает, что общая задержка, добавленная нашей обработкой изображений, составляет менее одной двадцатой секунды (при тактовой частоте 100 МГц).
Шаг 7: Добавление 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
Чтобы получить вход / выход в / из вашего 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
Внутри #pragma DATAFLOW способ реализации кода отличается от обычного C ++. Код является конвейерным, так что все инструкции всегда выполняются в разных частях данных (подумайте об этом как о сборочной линии на заводе, каждая станция работает непрерывно, выполняя одну функцию и передавая ее на следующую станцию)
из изображения видно, что каждая из директив
Несмотря на то, что они кажутся обычными переменными, объекты img на самом деле реализованы как небольшие буферы между командами. Использование изображения в качестве входных данных для функции «потребляет» его и делает непригодным для использования. (Отсюда необходимость в повторяющихся командах)