Inhoudsopgave:

Vivado HLS Video IP-bloksynthese - Ajarnpa
Vivado HLS Video IP-bloksynthese - Ajarnpa

Video: Vivado HLS Video IP-bloksynthese - Ajarnpa

Video: Vivado HLS Video IP-bloksynthese - Ajarnpa
Video: Vivado HLS video 2024, November
Anonim
Vivado HLS Video IP-bloksynthese
Vivado HLS Video IP-bloksynthese

Heb je ooit video willen verwerken in realtime zonder veel latentie of in een embedded systeem? Hiervoor worden soms FPGA's (Field Programmable Gate Arrays) gebruikt; het schrijven van videoverwerkingsalgoritmen in hardwarespecificatietalen zoals VHDL of Verilog is echter op zijn best frustrerend. Voer Vivado HLS in, de Xilinx-tool waarmee u in een C++-omgeving kunt programmeren en daaruit hardwarespecificatietaalcode kunt genereren.

Vereiste software:

  • Vivado HLS
  • Vivado
  • (Als u de AXI-registers gebruikt) Vivado SDK

(Optioneel) Download hier de door Xilinx gemaakte voorbeelden:

Xilinx HLS-videovoorbeelden

Stap 1: Wat is Vivado HLS?

Vivado HLS is een tool die wordt gebruikt om c++-achtige code om te zetten in hardwarestructuren die op een FPGA kunnen worden geïmplementeerd. Het bevat een IDE om deze ontwikkeling te doen. Zodra u uw ontwikkeling van de code voor HLS hebt voltooid, kunt u uw gegenereerde IP exporteren voor gebruik met Vivado.

Download de bijgevoegde bestanden en plaats ze in de buurt van waar u uw project gaat maken. (hernoem ze terug naar "top.cpp" en "top.h" als ze een willekeurige naam hebben)

Stap 2: HLS-videobibliotheek

HLS-videobibliotheek
HLS-videobibliotheek
HLS-videobibliotheek
HLS-videobibliotheek

De HLS-videobibliotheek heeft documentatie met referentieontwerpen in dit artikel: XAPP1167 Een andere goede bron is de Xilinx Wiki-pagina erover.

Start Vivado HLS.

Maak een nieuw project.

Neem de bestanden die je in de vorige stap hebt gedownload en voeg ze toe als bronbestanden. (Opmerking: de bestanden worden niet naar het project gekopieerd, maar blijven waar ze zijn)

Gebruik vervolgens de knop Bladeren om de bovenste functie te selecteren.

Selecteer op de volgende pagina het Xilinx-onderdeel dat u gebruikt.

Stap 3: Synthetiseren

synthetiseren
synthetiseren

Oplossing => Voer C-synthese uit => Actieve oplossing

Na ~ 227.218 seconden zou het klaar moeten zijn. (Opmerking: uw werkelijke synthesetijd is afhankelijk van vele factoren)

Stap 4: Versiebeheer en andere informatie voor export

Versiebeheer en andere informatie voor export
Versiebeheer en andere informatie voor export

Versienummers werken samen met Vivado om ervoor te zorgen dat u het IP-adres in een ontwerp kunt bijwerken. Als het een kleine versiewijziging is, kan dit ter plekke worden gedaan, terwijl voor grote versiewijzigingen u handmatig het nieuwe blok moet toevoegen en het oude moet verwijderen. Als uw interfaces niet zijn gewijzigd en de versie-update een kleine is, kan de update worden gebeurt volledig automatisch door op de update IP-knop te drukken. U kunt "report_ip_status" uitvoeren in de Vivado tcl-console om de status van uw IP te zien.

Stel de versienummers en andere informatie in Oplossing => Oplossingsinstellingen…

Als alternatief kunnen deze instellingen tijdens het exporteren worden ingesteld.

Stap 5: Exporteren naar een Vivado IP-bibliotheek

Exporteren naar een Vivado IP-bibliotheek
Exporteren naar een Vivado IP-bibliotheek
Exporteren naar een Vivado IP-bibliotheek
Exporteren naar een Vivado IP-bibliotheek

Oplossing => RTL exporteren

Als u de details van de IP-bibliotheek niet in de vorige stap hebt ingesteld, kunt u dat nu doen.

Stap 6: Synthese en exportanalyse

Synthese en exportanalyse
Synthese en exportanalyse
Synthese en exportanalyse
Synthese en exportanalyse
Synthese en exportanalyse
Synthese en exportanalyse

Op dit scherm kunnen we de statistieken over onze geëxporteerde module zien, waaruit blijkt dat deze voldoet aan onze klokperiode van 10ns (100MHz) en hoeveel van elke bron het gebruikt.

Met een combinatie hiervan, ons syntheserapport en onze Dataflow-analyse, kunnen we zien dat het 317338 klokcycli * 10ns klokperiode * 14 pijplijnstadia = 0,04442732 seconden duurt. Dit betekent dat de totale latentie die door onze beeldverwerking wordt toegevoegd, minder dan een twintigste van een seconde is (wanneer geklokt op de beoogde 100 MHz).

Stap 7: De IP-bibliotheek toevoegen in Vivado

De IP-bibliotheek toevoegen in Vivado
De IP-bibliotheek toevoegen in Vivado
De IP-bibliotheek toevoegen in Vivado
De IP-bibliotheek toevoegen in Vivado
De IP-bibliotheek toevoegen in Vivado
De IP-bibliotheek toevoegen in Vivado
De IP-bibliotheek toevoegen in Vivado
De IP-bibliotheek toevoegen in Vivado

Om je gesynthetiseerde IP-blok te gebruiken, moet je het aan Vivado toevoegen.

Voeg in Vivado een IP-repository toe aan uw project door naar de IP-catalogus te gaan en met de rechtermuisknop te klikken op "Repository toevoegen…"

Navigeer naar uw Vivado HLS-projectdirectory en selecteer uw oplossingsdirectory.

Het zou het IP moeten rapporteren dat het heeft gevonden.

Stap 8: Een upgrade uitvoeren

Een upgrade uitvoeren
Een upgrade uitvoeren
Een upgrade uitvoeren
Een upgrade uitvoeren
Een upgrade uitvoeren
Een upgrade uitvoeren

Soms moet u uw HLS-blok wijzigen nadat u het in een Vivado-ontwerp hebt opgenomen.

Om dit te doen, kunt u de wijzigingen aanbrengen en het IP-adres opnieuw synthetiseren en exporteren met een hoger versienummer (zie details in eerdere stap over grote/kleine wijzigingen in versienummers).

Na het wijzigen van het exporteren van de nieuwe versie, ververs je je IP-repository's in Vivado. Dit kan worden gedaan wanneer Vivado merkt dat het IP-adres is gewijzigd in de repository, of handmatig worden geactiveerd. (Let op, als u uw IP-opslagplaatsen vernieuwt na het starten, maar voordat de export in HLS is voltooid, zal het IP-adres tijdelijk niet aanwezig zijn, wacht tot het is voltooid en vernieuw opnieuw.)

Op dit punt zou er een venster moeten verschijnen met de informatie dat een IP is gewijzigd op de schijf en u de mogelijkheid biedt om het bij te werken met een "Upgrade Selected"-knop. Als de wijziging een kleine versiewijziging was en geen van de interfaces is gewijzigd, als u vervolgens op die knop drukt, wordt het oude IP-adres automatisch vervangen door het nieuwe, anders kan er meer werk nodig zijn.

Stap 9: Aanvullende details en informatie

De volgende stappen geven meer informatie over hoe HLS-synthese werkt en wat u ermee kunt doen.

Zie dit instructable voor een voorbeeld van een project met behulp van een HLS gesynthetiseerd IP-blok.

Stap 10: uitvoer en invoer

Uitgang en ingang
Uitgang en ingang
Uitgang en ingang
Uitgang en ingang

Uitgangen en ingangen naar het laatste IP-blok worden bepaald op basis van een analyse die de synthesizer doet van de gegevensstroom in en uit de topfunctie.

Net als in VHDL of verilog, kunt u met HLS details specificeren over de verbindingen tussen IP. Deze regels zijn daar voorbeelden van:

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

#pragma HLS INTERFACE as poort=video_in bundel=INPUT_STREAM #pragma HLS INTERFACE as poort=video_out bundel=OUTPUT_STREAM #pragma HLS INTERFACE s_axilite poort=x bundel=CONTROL_BUS offset=0x14#pragma HLS INTERFACE offset s_axilite poort=y bundel

U kunt zien hoe de poorten die op het IP-blok worden weergegeven, worden beïnvloed door deze richtlijnen.

Stap 11: AXI Registreer Interfacing

AXI Register-interface
AXI Register-interface

Om invoer/uitvoer van/naar uw IP-blok naar de PS te krijgen, is een goede manier om dit te doen via een AXI-interface.

U kunt dit specificeren in uw HLS-code, inclusief de offsets die moeten worden gebruikt om later toegang te krijgen tot de waarde als volgt:

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

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

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

x = 42;

y = 0xDEADBEEF; }

Eenmaal correct verbonden in Vivado, hebt u toegang tot de waarden met behulp van deze code in 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);

Hierdoor krijg je 42 in x en 0xdeadbeef in y

Stap 12: Dataflow Pragma

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

Binnen de #pragma DATAFLOW verandert de manier waarop de code is geïmplementeerd ten opzichte van normale C++. De code is gepijplijnd zodat alle instructies te allen tijde in verschillende delen van de gegevens worden uitgevoerd (zie het als een lopende band in een fabriek, elk station werkt continu aan één functie en geeft deze door aan het volgende station)

uit de afbeelding kunt u zien dat elk van de richtlijnen

Ondanks dat het lijkt alsof het normale variabelen zijn, worden img-objecten eigenlijk geïmplementeerd als kleine buffers tussen de commando's. Het gebruik van een afbeelding als invoer voor een functie "consumeert" het en maakt het niet langer bruikbaar. (Vandaar de noodzaak voor de dubbele commando's)

Aanbevolen: