Съдържание:

Vivado HLS Video IP Block Synthesis: 12 стъпки
Vivado HLS Video IP Block Synthesis: 12 стъпки

Видео: Vivado HLS Video IP Block Synthesis: 12 стъпки

Видео: Vivado HLS Video IP Block Synthesis: 12 стъпки
Видео: Introduction to Vitis High-Level Synthesis (HLS) 2024, Юли
Anonim
Вивадо HLS видео блоков синтез
Вивадо HLS видео блоков синтез

Искали ли сте някога обработка на видео в реално време без добавяне на много латентност или в вградена система? Понякога за това се използват FPGA (Field Programmable Gate Arrays); обаче писането на алгоритми за обработка на видео в езици за хардуерни спецификации като 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 синтез => Активно решение

След ~ 227.218 секунди трябва да се направи. (Забележка: действителното ви време за синтез ще варира в зависимост от много фактори)

Стъпка 4: Версия и друга информация за експортиране

Версиониране и друга информация за експортиране
Версиониране и друга информация за експортиране

Номерата на версиите взаимодействат с Vivado, за да ви позволят да актуализирате IP в дизайна. Ако това е незначителна промяна на версията, тя може да се извърши, докато основните промени изискват ръчно добавяне на новия блок и премахване на стария. Ако интерфейсите ви не са се променили и актуализацията на версията е незначителна, актуализацията може да бъде направено напълно автоматично чрез натискане на бутона за актуализиране на IP. Можете да стартирате „report_ip_status“в конзолата на Vivado tcl, за да видите състоянието на вашия IP.

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

Като алтернатива тези настройки могат да бъдат зададени по време на експортирането.

Стъпка 5: Експортиране в Vivado IP библиотека

Експортиране към Vivado IP библиотека
Експортиране към Vivado IP библиотека
Експортиране към Vivado IP библиотека
Експортиране към Vivado IP библиотека

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

Ако не сте задали подробности за IP библиотеката в предишната стъпка, можете да направите това сега.

Стъпка 6: Синтез и анализ на експорта

Синтез и анализ на износа
Синтез и анализ на износа
Синтез и анализ на износа
Синтез и анализ на износа
Синтез и анализ на износа
Синтез и анализ на износа

На този екран можем да видим статистическите данни за нашия експортиран модул, показващи, че той отговаря на нашия тактов период от 10ns (100MHz) и колко от всеки ресурс използва.

С комбинация от това, нашият синтезиран доклад и нашия анализ на потока данни можем да видим, че отнема 317338 тактови цикъла * 10ns тактов период * 14 етапа на конвейера = 0,04442732 секунди. Това означава, че общата латентност, добавена от нашата обработка на изображения, е по -малка от една двадесета от секундата (когато се задейства на целевите 100MHz).

Стъпка 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 и какво можете да направите с него.

За пример на проект, използващ HLS синтезиран IP блок, вижте тази инструкция.

Стъпка 10: Изход и вход

Изход и вход
Изход и вход
Изход и вход
Изход и вход

Изходите и входовете към крайния IP блок се определят от анализ, който синтезаторът извършва за потока от данни във и извън функцията top.

Подобно на VHDL или verilog, HLS ви позволява да посочите подробности за връзките между IP. Тези редове са примери за това:

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

#pragma HLS INTERFACE ос порт = video_in пакет = INPUT_STREAM #pragma HLS INTERFACE ос порт = video_out пакет = OUTPUT_STREAM #pragma HLS ИНТЕРФЕЙС s_axilite порт = x пакет = CONTROL_BUS отместване = 0x14 #pragma sLBxx xLSx bLxx hLSx bLxx hLS x hLS x hLS x hLS x hLS x hLS x hLS xx

Можете да видите как портовете, изложени на 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 порт = x пакет = CONTROL_BUS отместване = 0x14

#pragma HLS INTERFACE s_axilite port = y bundle = CONTROL_BUS offset = 0x1C #pragma HLS поток от данни

x = 42;

y = 0xDEADBEEF; }

След като се свържете правилно във Vivado, можете да получите достъп до стойностите, като използвате този код във Vivado SDK:

#include "параметри.h"

#дефинирайте xregoff 0x14 #дефинирайте 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: Прагма на потока данни

Прагма на потока данни
Прагма на потока данни
Прагма на потока данни
Прагма на потока данни
Прагма на потока данни
Прагма на потока данни

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

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

Въпреки че изглеждат като нормални променливи, img обектите всъщност се реализират като малки буфери между командите. Използването на изображение като вход за функция го "консумира" и го прави вече неизползваем. (Следователно необходимостта от дублиращи се команди)

Препоръчано: