Cuprins:

Sinteza blocurilor video IP Vivado HLS: 12 pași
Sinteza blocurilor video IP Vivado HLS: 12 pași

Video: Sinteza blocurilor video IP Vivado HLS: 12 pași

Video: Sinteza blocurilor video IP Vivado HLS: 12 pași
Video: FPGA Transmitter for 2m Band (144Mhz) 2024, Iulie
Anonim
Vivado HLS Video IP Block Synthesis
Vivado HLS Video IP Block Synthesis

Ați dorit vreodată să procesați în timp real videoclipuri fără a adăuga multă latență sau într-un sistem încorporat? FPGA (Field Programmable Gate Arrays) sunt uneori folosite pentru a face acest lucru; cu toate acestea, scrierea algoritmilor de procesare video în limbaje de specificații hardware precum VHDL sau Verilog este frustrantă în cel mai bun caz. Introduceți Vivado HLS, instrumentul Xilinx care vă permite să programați într-un mediu C ++ și să generați codul de limbaj de specificații hardware din acesta.

Software-uri necesare:

  • Vivado HLS
  • Vivado
  • (Dacă utilizați registrele AXI) Vivado SDK

(Opțional) Descărcați exemplele făcute de Xilinx aici:

Exemple video Xilinx HLS

Pasul 1: Ce este Vivado HLS?

Vivado HLS este un instrument folosit pentru a transforma codul c ++ în structuri hardware care pot fi implementate pe un FPGA. Include un IDE pentru a face această dezvoltare. După ce ați finalizat dezvoltarea codului pentru HLS, puteți exporta IP-ul generat într-un format pentru utilizare cu Vivado.

Descărcați fișierele atașate și puneți-le aproape de locul în care vă veți crea proiectul. (redenumiți-le înapoi la „top.cpp” și „top.h” dacă au un nume randomizat)

Pasul 2: Biblioteca video HLS

Biblioteca video HLS
Biblioteca video HLS
Biblioteca video HLS
Biblioteca video HLS

Biblioteca video HLS conține documentație cu designuri de referință în această lucrare: XAPP1167 O altă resursă bună este pagina Xilinx Wiki despre aceasta.

Porniți Vivado HLS.

Creați un proiect nou.

Luați fișierele pe care le-ați descărcat în pasul anterior și adăugați-le ca fișiere sursă. (Notă: fișierele nu sunt copiate în proiect, ci rămân acolo unde sunt)

Apoi utilizați butonul Răsfoire pentru a selecta funcția de sus.

Pe pagina următoare, selectați partea Xilinx pe care o utilizați.

Pasul 3: Sintetizarea

Sintetizare
Sintetizare

Soluție => Executați C Synthesis => Soluție activă

După ~ 227.218 secunde, ar trebui să se facă. (Notă: timpul real de sinteză va varia în funcție de mulți factori)

Pasul 4: versiuni și alte informații pentru export

Versiuni și alte informații pentru export
Versiuni și alte informații pentru export

Numerele de versiune interacționează cu Vivado pentru a vă permite să actualizați IP-ul într-un design. Dacă este vorba de o modificare a versiunii minore, aceasta se poate face în loc, în timp ce modificările majore ale versiunii necesită adăugarea manuală a noului bloc și eliminarea celui vechi. realizat complet automat apăsând butonul de actualizare IP. Puteți rula „report_ip_status” în consola Vivado tcl pentru a vedea starea IP-ului dvs.

Setați numerele de versiune și alte informații în Soluție => Setări soluție …

Alternativ, aceste setări pot fi setate în timpul exportului.

Pasul 5: Exportul într-o bibliotecă IP Vivado

Exportul către o bibliotecă IP Vivado
Exportul către o bibliotecă IP Vivado
Exportul către o bibliotecă IP Vivado
Exportul către o bibliotecă IP Vivado

Soluție => Export RTL

Dacă nu ați setat detaliile bibliotecii IP în pasul anterior, puteți face acest lucru acum.

Pasul 6: Sinteza și analiza exportului

Sinteza și analiza exportului
Sinteza și analiza exportului
Sinteza și analiza exportului
Sinteza și analiza exportului
Sinteza și analiza exportului
Sinteza și analiza exportului

Pe acest ecran putem vedea statisticile despre modulul nostru exportat, arătând că acesta îndeplinește perioada de ceas de 10ns (100MHz) și cât din fiecare resursă utilizează.

Cu o combinație dintre acestea, Raportul nostru de sinteză și analiza fluxului de date, putem vedea că durează 317338 cicluri de ceas * 10ns perioadă de ceas * 14 etape ale conductei = 0,04442732 secunde. Însemnând că latența totală adăugată prin procesarea imaginii noastre este mai mică de o douăzecime de secundă (când este tactată la 100MHz vizată).

Pasul 7: Adăugarea bibliotecii IP în Vivado

Adăugarea bibliotecii IP în Vivado
Adăugarea bibliotecii IP în Vivado
Adăugarea bibliotecii IP în Vivado
Adăugarea bibliotecii IP în Vivado
Adăugarea bibliotecii IP în Vivado
Adăugarea bibliotecii IP în Vivado
Adăugarea bibliotecii IP în Vivado
Adăugarea bibliotecii IP în Vivado

Pentru a utiliza blocul IP sintetizat, va trebui să îl adăugați la Vivado.

În Vivado adăugați un depozit IP la proiectul dvs. accesând catalogul IP și făcând clic dreapta selectând „Adăugare depozit…”

Navigați la directorul de proiect Vivado HLS și selectați directorul soluției.

Ar trebui să raporteze adresa IP pe care a găsit-o.

Pasul 8: Efectuarea unui upgrade

Efectuarea unui upgrade
Efectuarea unui upgrade
Efectuarea unui upgrade
Efectuarea unui upgrade
Efectuarea unui upgrade
Efectuarea unui upgrade

Uneori trebuie să faceți modificări la blocul dvs. HLS după ce îl includeți într-un design Vivado.

Pentru a face acest lucru, puteți face modificările și resintezați și exportați adresa IP cu un număr de versiune mai mare (consultați detaliile din pasul anterior despre modificările numărului de versiune majoră / minoră).

După ce ați schimbat exportul noii versiuni, reîmprospătați-vă depozitele IP în Vivado. Acest lucru se poate face fie când Vivado observă că IP-ul s-a schimbat în depozit, fie este activat manual. (Rețineți, dacă vă reîmprospătați depozitele IP după ce ați început, dar înainte ca exportul să se finalizeze în HLS, IP nu va fi temporar acolo, așteptați să se termine și reîmprospătați din nou.)

În acest moment ar trebui să apară o fereastră cu informațiile despre faptul că un IP a fost modificat pe disc și vă oferă opțiunea de a-l actualiza cu un buton „Upgrade Selected”. apoi apăsarea butonului respectiv va înlocui automat vechiul IP cu cel nou, altfel ar putea fi nevoie de mai multă muncă.

Pasul 9: Detalii suplimentare și informații

Următorii pași oferă mai multe informații despre modul în care funcționează sinteza HLS și ce puteți face cu aceasta.

Pentru un exemplu de proiect care utilizează un bloc IP sintetizat HLS, consultați acest instructable.

Pasul 10: ieșire și intrare

Ieșire și intrare
Ieșire și intrare
Ieșire și intrare
Ieșire și intrare

Ieșirile și intrările către blocul IP final sunt determinate dintr-o analiză pe care sintetizatorul o face asupra fluxului de date în și din funcția de sus.

Similar cu VHDL sau verilog, HLS vă permite să specificați detalii despre conexiunile dintre IP. Aceste linii sunt exemple în acest sens:

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

#pragma HLS INTERFACE ax port = video_in bundle = INPUT_STREAM #pragma HLS INTERFACE ax port = video_out bundle = OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port = x bundle = CONTROL_BUS offset = 0x14 # pragma HLS INTERFACE = yBil

Puteți vedea cum porturile expuse pe blocul IP sunt influențate de aceste directive.

Pasul 11: AXI Register Interfacing

AXI Register Interfacing
AXI Register Interfacing

Pentru a obține intrarea / ieșirea către / de la blocul IP către PS, o modalitate bună de a face acest lucru este printr-o interfață AXI.

Puteți specifica acest lucru în codul dvs. HLS, inclusiv compensările care vor fi utilizate pentru a accesa valoarea ulterior astfel:

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

#pragma HLS INTERFACE s_axilite port = x bundle = CONTROL_BUS offset = 0x14

#pragma HLS INTERFACE s_axilite port = y bundle = CONTROL_BUS offset = 0x1C #pragma HLS dataflow

x = 42;

y = 0xDEADBEEF; }

Odată conectat corect în Vivado, puteți accesa valorile folosind acest cod în 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);

Acest lucru vă va face să ajungeți cu 42 în x și 0xdeadbeef în y

Pasul 12: Pragma fluxului de date

Pragma fluxului de date
Pragma fluxului de date
Pragma fluxului de date
Pragma fluxului de date
Pragma fluxului de date
Pragma fluxului de date

În interiorul #pragma DATAFLOW, modul în care este implementat codul se schimbă față de C ++ normal. Codul este canalizat astfel încât toate instrucțiunile să ruleze în orice moment în diferite părți ale datelor (gândiți-vă la el ca la o linie de asamblare într-o fabrică, fiecare stație funcționează continuu, realizând o funcție și trecând-o la următoarea stație)

din imagine puteți vedea că fiecare dintre directive

În ciuda faptului că par a fi variabile normale, obiectele img sunt de fapt implementate ca tampoane mici între comenzi. Utilizarea unei imagini ca intrare pentru o funcție o „consumă” și o face să nu mai fie utilizabilă. (De aici necesitatea comenzilor duplicat)

Recomandat: