Innholdsfortegnelse:

Vivado HLS Video IP Block Syntese: 12 trinn
Vivado HLS Video IP Block Syntese: 12 trinn

Video: Vivado HLS Video IP Block Syntese: 12 trinn

Video: Vivado HLS Video IP Block Syntese: 12 trinn
Video: Vivado HLS demonstration C function to FPGA 2024, Juli
Anonim
Vivado HLS Video IP Block Synthesis
Vivado HLS Video IP Block Synthesis

Har du noen gang ønsket å behandle video i sanntid uten å legge til mye ventetid eller i et innebygd system? Noen ganger brukes FPGA (Field Programmable Gate Arrays) for å gjøre dette; Men å skrive videobearbeidingsalgoritmer på maskinvarespesifikasjonsspråk som VHDL eller Verilog er i beste fall frustrerende. Skriv inn Vivado HLS, Xilinx -verktøyet som lar deg programmere i et C ++ - miljø og generere maskinvarespesifikasjonens språkkode fra den.

Nødvendig programvare:

  • Vivado HLS
  • Vivado
  • (Hvis du bruker AXI -registrene) Vivado SDK

(Valgfritt) Last ned Xilinx -eksempler her:

Xilinx HLS -videoeksempler

Trinn 1: Hva er Vivado HLS?

Vivado HLS er et verktøy som brukes til å gjøre c ++ - lignende kode til maskinvarestrukturer som kan implementeres på en FPGA. Den inkluderer en IDE for å gjøre denne utviklingen. Når du har fullført utviklingen av koden for HLS kan du eksportere din genererte IP i et format til bruk sammen med Vivado.

Last ned de vedlagte filene og legg dem nær der du skal lage prosjektet. (gi dem et nytt navn til "top.cpp" og "top.h" hvis de har et randomisert navn)

Trinn 2: HLS videobibliotek

HLS videobibliotek
HLS videobibliotek
HLS videobibliotek
HLS videobibliotek

HLS videobibliotek har dokumentasjon med referansedesign i denne artikkelen: XAPP1167En annen god ressurs er Xilinx Wiki -siden om den.

Start Vivado HLS.

Lag et nytt prosjekt.

Ta filene du lastet ned i forrige trinn, og legg dem til som kildefiler. (Merk: filene blir ikke kopiert til prosjektet, men forblir i stedet der de er)

Bruk deretter Bla gjennom -knappen for å velge toppfunksjonen.

På neste side velger du Xilinx -delen du bruker.

Trinn 3: Syntetisering

Syntetisering
Syntetisering

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

Etter ~ 227.218 sekunder, bør det gjøres. (Merk: din faktiske syntesetid vil variere avhengig av mange faktorer)

Trinn 4: Versjonering og annen informasjon for eksport

Versjonering og annen informasjon for eksport
Versjonering og annen informasjon for eksport

Versjonsnumre samhandler med Vivado for å få deg til å kunne oppdatere IP -en i et design. Hvis det er en mindre versjonsendring, kan den gjøres på plass mens store versjonsendringer krever at du manuelt legger til den nye blokken og fjerner den gamle. Hvis grensesnittene ikke har endret seg og versjonsoppdateringen er en mindre, kan oppdateringen være gjort helt automatisk ved å trykke på oppdateringens IP -knapp. Du kan kjøre "report_ip_status" i Vivado tcl -konsollen for å se statusen til IP -en din.

Angi versjonsnumre og annen informasjon i Løsning => Løsningsinnstillinger …

Alternativt kan disse innstillingene angis under eksporten.

Trinn 5: Eksporter 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 angav IP -bibliotekets detaljer i forrige trinn, kan du gjøre det nå.

Trinn 6: Syntese og eksportanalyse

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

På denne skjermen kan vi se statistikken om vår eksporterte modul, som viser at den oppfyller klokkeperioden vår på 10ns (100MHz) og hvor mye av hver ressurs den bruker.

Med en kombinasjon av dette, vår synteserapport og vår Dataflow -analyse, kan vi se at det tar 317338 klokkesykluser * 10ns klokkeperiode * 14 rørledningstrinn = 0,04442732 sekunder. Det betyr at den totale ventetiden som er lagt til av vår bildebehandling, er mindre enn en tyvendedel av et sekund (når den klokkes til den målrettede 100MHz).

Trinn 7: Legge til IP -biblioteket i Vivado

Legger til IP -biblioteket i Vivado
Legger til IP -biblioteket i Vivado
Legger til IP -biblioteket i Vivado
Legger til IP -biblioteket i Vivado
Legger til IP -biblioteket i Vivado
Legger til IP -biblioteket i Vivado
Legger til IP -biblioteket i Vivado
Legger til IP -biblioteket i Vivado

For å bruke din syntetiserte IP -blokk må du legge den til i Vivado.

I Vivado kan du legge til et IP-depot i prosjektet ditt ved å gå til IP-katalogen og høyreklikke på "Legg til depot …"

Naviger til Vivado HLS -prosjektkatalogen og velg løsningskatalogen din.

Den bør rapportere IP -en som den fant.

Trinn 8: Gjør en oppgradering

Gjør en oppgradering
Gjør en oppgradering
Gjør en oppgradering
Gjør en oppgradering
Gjør en oppgradering
Gjør en oppgradering

Noen ganger må du gjøre endringer i HLS -blokken etter å ha inkludert den i et Vivado -design.

For å gjøre dette kan du gjøre endringene og syntetisere på nytt og eksportere IP -adressen med et høyere versjonsnummer (se detaljer i tidligere trinn om større/mindre versjonsnummerendringer).

Etter endring av eksport av den nye versjonen, oppdater IP -lagrene dine i Vivado. Dette kan enten gjøres når Vivado merker at IP -en har endret seg i depotet, eller aktivert manuelt. (Vær oppmerksom på at hvis du oppdaterer IP -lagrene dine etter oppstart, men før eksporten er fullført i HLS, vil IP -adressen midlertidig ikke være der, vent på at den er ferdig og oppdateres igjen.)

På dette tidspunktet skal det vises et vindu med informasjon om at en IP har blitt endret på disken og gir deg muligheten til å oppdatere den med en "Oppgrader valgt" -knapp. Hvis endringen var en mindre versjonsendring og ingen av grensesnittene ble endret, Hvis du trykker på den knappen, erstattes den gamle IP -adressen automatisk med den nye, ellers kan det være nødvendig med mer arbeid.

Trinn 9: Ytterligere detaljer og informasjon

Følgende trinn gir mer informasjon om hvordan HLS -syntese fungerer og hva du kan gjøre med den.

For et eksempel på et prosjekt som bruker en HLS -syntetisert IP -blokk, se denne instruksen.

Trinn 10: Output og Input

Utgang og inngang
Utgang og inngang
Utgang og inngang
Utgang og inngang

Utganger og innganger til den endelige IP -blokken bestemmes ut fra en analyse som synthesizeren gjør av datastrømmen inn og ut av toppfunksjonen.

I likhet med i VHDL eller verilog lar HLS deg spesifisere detaljer om tilkoblingene mellom IP. Disse linjene er eksempler på dette:

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

#pragma HLS INTERFACE akseport = video_in bunt = INPUT_STREAM #pragma HLS INTERFACE akseport = video_out pakke = OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port = x bundle = CONTROL_BUS offset = 0x14 #pragma HLS INTERCACE = portx_yTX_1

Du kan se hvordan portene som vises på IP -blokken påvirkes av disse direktivene.

Trinn 11: AXI Register Interfacing

AXI Register Interfacing
AXI Register Interfacing

For å få input/output til/fra IP -blokken til PS er en god måte å gjøre dette på via et AXI -grensesnitt.

Du kan spesifisere dette i HLS -koden din, inkludert forskyvningene som skal brukes for å få tilgang til verdien senere slik:

ugyldig 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 du er koblet til riktig i Vivado, kan du få tilgang til verdiene ved hjelp av denne koden 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 vil få deg til å ende opp med 42 i x og 0xdeadbeef i y

Trinn 12: Dataflow Pragma

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

I #pragma DATAFLOW endres måten som koden er implementert på fra normal C ++. Koden er pipelined slik at alle instruksjonene kjører til enhver tid i forskjellige deler av dataene (Tenk på det som en samlebånd i en fabrikk, hver stasjon jobber kontinuerlig med å gjøre en funksjon og overføre den til neste stasjon)

fra bildet kan du se at hvert av direktivene

Til tross for at de ser ut til å være normale variabler, blir img -objekter faktisk implementert som små buffere mellom kommandoene. Å bruke et bilde som inngang til en funksjon "forbruker" det og gjør det ikke lenger brukbart. (Derfor behovet for dupliserte kommandoer)

Anbefalt: