Indholdsfortegnelse:

Vivado HLS Video IP -bloksyntese: 12 trin
Vivado HLS Video IP -bloksyntese: 12 trin

Video: Vivado HLS Video IP -bloksyntese: 12 trin

Video: Vivado HLS Video IP -bloksyntese: 12 trin
Video: FPGA Twitch 04 - Vivado HLS - С-тестбенчи и Назначение интерфейсов (часть 1 из 2) 2024, November
Anonim
Vivado HLS Video IP -bloksyntese
Vivado HLS Video IP -bloksyntese

Har du nogensinde ønsket at behandle video i realtid uden at tilføje meget latens eller i et integreret system? FPGA'er (feltprogrammerbare gate -arrays) bruges undertiden til at gøre dette; at skrive videobehandlingsalgoritmer på hardwarespecifikationssprog som VHDL eller Verilog er i bedste fald frustrerende. Indtast Vivado HLS, Xilinx -værktøjet, der giver dig mulighed for at programmere i et C ++ - miljø og generere hardwarespecifikationens sprogkode fra det.

Påkrævet software:

  • Vivado HLS
  • Vivado
  • (Hvis du bruger AXI -registre) Vivado SDK

(Valgfrit) Download de Xilinx -eksempler her:

Xilinx HLS -videoeksempler

Trin 1: Hvad er Vivado HLS?

Vivado HLS er et værktøj, der bruges til at omdanne c ++ - lignende kode til hardwarestrukturer, der kan implementeres på en FPGA. Den indeholder en IDE til at gøre denne udvikling. Når du har afsluttet din udvikling af koden til HLS, kan du eksportere din genererede IP i et format til brug sammen med Vivado.

Download de vedhæftede filer og læg dem tæt på, hvor du vil oprette dit projekt. (omdøb dem tilbage til "top.cpp" og "top.h", hvis de har et randomiseret navn)

Trin 2: HLS videobibliotek

HLS videobibliotek
HLS videobibliotek
HLS videobibliotek
HLS videobibliotek

HLS -videobiblioteket har dokumentation med referencedesign i dette papir: XAPP1167En anden god ressource er Xilinx Wiki -siden om det.

Start Vivado HLS.

Opret et nyt projekt.

Tag de filer, du downloadede i det foregående trin, og tilføj dem som kildefiler. (Bemærk: filerne kopieres ikke til projektet, men forbliver i stedet, hvor de er)

Brug derefter knappen Gennemse til at vælge den øverste funktion.

På den næste side skal du vælge den Xilinx -del, du bruger.

Trin 3: Syntetisering

Syntetisering
Syntetisering

Løsning => Kør C -syntese => Aktiv løsning

Efter ~ 227.218 sekunder skal det gøres. (Bemærk: din faktiske syntesetid vil variere baseret på mange faktorer)

Trin 4: Versionering og anden information til eksport

Versionering og anden information til eksport
Versionering og anden information til eksport

Versionsnumre interagerer med Vivado for at få dig til at kunne opdatere IP'en i et design. Hvis det er en mindre versionændring, kan den gøres på plads, mens større versionændringer kræver, at du manuelt tilføjer den nye blok og fjerner den gamle. Hvis dine grænseflader ikke er ændret, og versionopdateringen er en mindre, kan opdateringen være gøres helt automatisk ved at trykke på opdateringens IP -knap. Du kan køre "report_ip_status" i Vivado tcl -konsollen for at se status for din IP.

Indstil versionsnumre og andre oplysninger i Løsning => Løsningsindstillinger …

Alternativt kan disse indstillinger sættes under eksporten.

Trin 5: Eksport til et Vivado IP -bibliotek

Eksporterer til et Vivado IP -bibliotek
Eksporterer til et Vivado IP -bibliotek
Eksporterer til et Vivado IP -bibliotek
Eksporterer til et Vivado IP -bibliotek

Løsning => Eksporter RTL

Hvis du ikke har angivet oplysninger om IP -biblioteket i det foregående trin, kan du gøre det nu.

Trin 6: Syntese og eksportanalyse

Syntese og eksportanalyse
Syntese og eksportanalyse
Syntese og eksportanalyse
Syntese og eksportanalyse
Syntese og eksportanalyse
Syntese og eksportanalyse

På denne skærm kan vi se statistikken om vores eksporterede modul, der viser, at det opfylder vores urperiode på 10ns (100MHz) og hvor meget af hver ressource, den bruger.

Med en kombination af dette, vores synteserapport og vores Dataflow -analyse kan vi se, at det tager 317338 urcykler * 10ns urperiode * 14 pipeline -faser = 0,04442732 sekunder. Det betyder, at den samlede latenstid, der tilføjes af vores billedbehandling, er mindre end en tyvendedel af et sekund (når den er klokket til den målrettede 100MHz).

Trin 7: Tilføjelse af IP -biblioteket i Vivado

Tilføjelse af IP -biblioteket i Vivado
Tilføjelse af IP -biblioteket i Vivado
Tilføjelse af IP -biblioteket i Vivado
Tilføjelse af IP -biblioteket i Vivado
Tilføjelse af IP -biblioteket i Vivado
Tilføjelse af IP -biblioteket i Vivado
Tilføjelse af IP -biblioteket i Vivado
Tilføjelse af IP -biblioteket i Vivado

For at bruge din syntetiserede IP -blok skal du tilføje den til Vivado.

I Vivado skal du tilføje et IP-lager til dit projekt ved at gå til IP-kataloget og højreklikke på "Tilføj depot …"

Naviger til dit Vivado HLS -projektmappe, og vælg dit løsningskatalog.

Den skal rapportere den IP, den fandt.

Trin 8: Gør en opgradering

Gør en opgradering
Gør en opgradering
Gør en opgradering
Gør en opgradering
Gør en opgradering
Gør en opgradering

Nogle gange skal du foretage ændringer i din HLS -blok efter at have inkluderet den i et Vivado -design.

For at gøre dette kan du foretage ændringerne og resyntetisere og eksportere IP'en med et højere versionsnummer (se detaljer i tidligere trin om større/mindre versionsnummerændringer).

Efter ændring af eksport af den nye version skal du opdatere dine IP -lagre i Vivado. Dette kan enten gøres, når Vivado bemærker, at IP'en er ændret i depotet eller aktiveret manuelt. (Bemærk, hvis du opdaterer dine IP -lagre efter start, men før eksporten er fuldført i HLS, vil IP'en midlertidigt ikke være der, skal du vente på, at den er færdig og opdateres igen.)

På dette tidspunkt skal der vises et vindue med oplysninger om, at en IP er blevet ændret på disken og giver dig mulighed for at opdatere den med en "Opgrader valgt" -knappen. Hvis ændringen var en mindre versionændring, og ingen af grænsefladerne blev ændret, derefter trykke på den knap vil automatisk erstatte den gamle IP med den nye, ellers mere arbejde kan være påkrævet.

Trin 9: Yderligere detaljer og oplysninger

De følgende trin giver mere information om, hvordan HLS -syntese fungerer, og hvad du kan gøre med det.

For et eksempel på et projekt, der bruger en HLS -syntetiseret IP -blok, kan du se denne instruks.

Trin 10: Output og input

Output og input
Output og input
Output og input
Output og input

Output og input til den endelige IP -blok bestemmes ud fra en analyse, synthesizeren foretager af datastrømmen ind og ud af topfunktionen.

På samme måde som i VHDL eller verilog giver HLS dig mulighed for at angive detaljer om forbindelserne mellem IP. Disse linjer er eksempler på dette:

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

#pragma HLS INTERFACE akseport = video_in bundle = INPUT_STREAM #pragma HLS INTERFACE akseport = video_out bundle = OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port = x bundle = CONTROL_BUS offset = 0x14 #pragma HLS INTERCACE = port_x1 = offset_1 = offset_PUNKT = port_x1 = offset_sats1 = offset_forbindelse = port_x1_komponent_sats

Du kan se, hvordan de porte, der vises på IP -blokken, påvirkes af disse direktiver.

Trin 11: AXI Register Interfacing

AXI Register Interfacing
AXI Register Interfacing

For at få input/output til/fra din IP -blok til PS'en er en god måde at gøre dette på via et AXI -interface.

Du kan angive dette i din HLS -kode, herunder de forskydninger, der skal bruges til at få adgang til værdien senere på følgende måde:

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; }

Når den er tilsluttet korrekt i Vivado, kan du få adgang til værdierne ved hjælp af denne kode i 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);

Dette får dig til at ende med 42 i x og 0xdeadbeef i y

Trin 12: Dataflow Pragma

Dataflow Pragma
Dataflow Pragma
Dataflow Pragma
Dataflow Pragma
Dataflow Pragma
Dataflow Pragma

Inde i #pragma DATAFLOW ændres måden, hvorpå koden er implementeret, fra normal C ++. Koden er pipelineret, så alle instruktionerne til enhver tid kører i forskellige dele af dataene (Tænk på det som en samlebånd på en fabrik, hver station arbejder kontinuerligt med at udføre en funktion og videregive den til den næste station)

fra billedet kan du se, at hvert af direktiverne

På trods af at det ser ud til at være normale variabler, implementeres img -objekter faktisk som små buffere mellem kommandoerne. Brug af et billede som input til en funktion "forbruger" det og gør det ikke længere brugbart. (Derfor behovet for de dobbelte kommandoer)

Anbefalede: