Inhaltsverzeichnis:

Vivado HLS Video-IP-Blocksynthese - Gunook
Vivado HLS Video-IP-Blocksynthese - Gunook

Video: Vivado HLS Video-IP-Blocksynthese - Gunook

Video: Vivado HLS Video-IP-Blocksynthese - Gunook
Video: Hello world video using Xilinx Zynq, Vivado 2020, and Vitis 2024, November
Anonim
Vivado HLS Video-IP-Blocksynthese
Vivado HLS Video-IP-Blocksynthese

Wollten Sie schon immer die Echtzeitverarbeitung von Videos ohne zusätzliche Latenz oder in einem eingebetteten System? Dazu werden manchmal FPGAs (Field Programmable Gate Arrays) verwendet; Das Schreiben von Videoverarbeitungsalgorithmen in Hardwarespezifikationssprachen wie VHDL oder Verilog ist jedoch bestenfalls frustrierend. Geben Sie Vivado HLS ein, das Xilinx-Tool, mit dem Sie in einer C++-Umgebung programmieren und daraus Hardware-Spezifikationssprachencode generieren können.

Erforderliche Software:

  • Vivado HLS
  • Vivado
  • (Wenn Sie die AXI-Register verwenden) Vivado SDK

(Optional) Laden Sie die von Xilinx erstellten Beispiele hier herunter:

Xilinx HLS-Videobeispiele

Schritt 1: Was ist Vivado HLS?

Vivado HLS ist ein Tool, das verwendet wird, um c++-ähnlichen Code in Hardwarestrukturen umzuwandeln, die auf einem FPGA implementiert werden können. Es enthält eine IDE für diese Entwicklung. Sobald Sie Ihre Entwicklung des Codes für HLS abgeschlossen haben, können Sie Ihre generierte IP in ein Format exportieren zur Verwendung mit Vivado.

Laden Sie die angehängten Dateien herunter und legen Sie sie in die Nähe des Ortes, an dem Sie Ihr Projekt erstellen werden. (benennen Sie sie wieder in "top.cpp" und "top.h" um, wenn sie einen zufälligen Namen haben)

Schritt 2: HLS-Videobibliothek

HLS-Videobibliothek
HLS-Videobibliothek
HLS-Videobibliothek
HLS-Videobibliothek

Die HLS-Videobibliothek enthält eine Dokumentation mit Referenzdesigns in diesem Papier:XAPP1167Eine weitere gute Ressource ist die Xilinx-Wiki-Seite dazu.

Starten Sie Vivado HLS.

Erstellen Sie ein neues Projekt.

Nehmen Sie die Dateien, die Sie im vorherigen Schritt heruntergeladen haben, und fügen Sie sie als Quelldateien hinzu. (Hinweis: die Dateien werden nicht in das Projekt kopiert, sondern verbleiben dort, wo sie sind)

Wählen Sie dann mit der Schaltfläche Durchsuchen die oberste Funktion aus.

Wählen Sie auf der nächsten Seite das von Ihnen verwendete Xilinx-Teil aus.

Schritt 3: Synthetisieren

Synthese
Synthese

Lösung => C-Synthese ausführen => Aktive Lösung

Nach ~227.218 Sekunden sollte es fertig sein. (Hinweis: Ihre tatsächliche Synthesezeit hängt von vielen Faktoren ab)

Schritt 4: Versionierung und andere Informationen für den Export

Versionierung und andere Informationen für den Export
Versionierung und andere Informationen für den Export

Versionsnummern interagieren mit Vivado, damit Sie die IP in einem Design aktualisieren können. Wenn es sich um eine geringfügige Versionsänderung handelt, kann sie an Ort und Stelle durchgeführt werden, während größere Versionsänderungen erfordern, dass Sie den neuen Block manuell hinzufügen und den alten entfernen erfolgt vollautomatisch durch Drücken der Schaltfläche IP aktualisieren. Sie können "report_ip_status" in der Vivado tcl-Konsole ausführen, um den Status Ihrer IP zu sehen.

Legen Sie die Versionsnummern und andere Informationen in Lösung => Lösungseinstellungen fest…

Alternativ können diese Einstellungen beim Export vorgenommen werden.

Schritt 5: Exportieren in eine Vivado IP-Bibliothek

Exportieren in eine Vivado IP-Bibliothek
Exportieren in eine Vivado IP-Bibliothek
Exportieren in eine Vivado IP-Bibliothek
Exportieren in eine Vivado IP-Bibliothek

Lösung => RTL exportieren

Wenn Sie die IP-Bibliotheksdetails im vorherigen Schritt nicht festgelegt haben, können Sie dies jetzt tun.

Schritt 6: Synthese- und Exportanalyse

Synthese und Exportanalyse
Synthese und Exportanalyse
Synthese und Exportanalyse
Synthese und Exportanalyse
Synthese und Exportanalyse
Synthese und Exportanalyse

Auf diesem Bildschirm können wir die Statistiken zu unserem exportierten Modul sehen, die zeigen, dass es unsere Taktperiode von 10 ns (100 MHz) einhält und wie viel von jeder Ressource es verwendet.

Mit einer Kombination daraus, unserem Synthesebericht und unserer Datenflussanalyse können wir sehen, dass es 317338 Taktzyklen * 10 ns Taktperiode * 14 Pipeline-Stufen = 0,04442732 Sekunden dauert. Das bedeutet, dass die von unserer Bildverarbeitung hinzugefügte Gesamtlatenz weniger als eine Zwanzigstelsekunde beträgt (bei einer Taktung mit den angestrebten 100 MHz).

Schritt 7: Hinzufügen der IP-Bibliothek in Vivado

Hinzufügen der IP-Bibliothek in Vivado
Hinzufügen der IP-Bibliothek in Vivado
Hinzufügen der IP-Bibliothek in Vivado
Hinzufügen der IP-Bibliothek in Vivado
Hinzufügen der IP-Bibliothek in Vivado
Hinzufügen der IP-Bibliothek in Vivado
Hinzufügen der IP-Bibliothek in Vivado
Hinzufügen der IP-Bibliothek in Vivado

Um Ihren synthetisierten IP-Block zu verwenden, müssen Sie ihn zu Vivado hinzufügen.

Fügen Sie in Vivado Ihrem Projekt ein IP-Repository hinzu, indem Sie zum IP-Katalog gehen und mit der rechten Maustaste "Repository hinzufügen…" auswählen.

Navigieren Sie zu Ihrem Vivado HLS-Projektverzeichnis und wählen Sie Ihr Lösungsverzeichnis aus.

Es sollte die gefundene IP melden.

Schritt 8: Durchführen eines Upgrades

Durchführen eines Upgrades
Durchführen eines Upgrades
Durchführen eines Upgrades
Durchführen eines Upgrades
Durchführen eines Upgrades
Durchführen eines Upgrades

Manchmal müssen Sie Ihren HLS-Block ändern, nachdem Sie ihn in ein Vivado-Design aufgenommen haben.

Um dies zu tun, können Sie die Änderungen vornehmen und die IP mit einer höheren Versionsnummer neu synthetisieren und exportieren (siehe Details im vorherigen Schritt zu Änderungen der Haupt-/Nebenversionsnummer).

Nachdem Sie den Export der neuen Version geändert haben, aktualisieren Sie Ihre IP-Repositorys in Vivado. Dies kann entweder erfolgen, wenn Vivado bemerkt, dass sich die IP im Repository geändert hat, oder manuell aktiviert werden. (Beachten Sie, wenn Sie Ihre IP-Repositorys nach dem Start aktualisieren, aber bevor der Export in HLS abgeschlossen ist, ist die IP vorübergehend nicht vorhanden. Warten Sie, bis sie abgeschlossen ist, und aktualisieren Sie sie erneut.)

An dieser Stelle sollte ein Fenster mit der Information erscheinen, dass eine IP auf der Festplatte geändert wurde und Ihnen die Möglichkeit bietet, diese mit einem "Upgrade Selected"-Button zu aktualisieren. Wenn die Änderung eine geringfügige Versionsänderung war und keine der Schnittstellen geändert wurde, dann wird durch Drücken dieser Taste automatisch die alte IP durch die neue ersetzt, andernfalls ist möglicherweise mehr Arbeit erforderlich.

Schritt 9: Zusätzliche Details und Informationen

Die folgenden Schritte enthalten weitere Informationen darüber, wie die HLS-Synthese funktioniert und was Sie damit tun können.

Ein Beispiel für ein Projekt mit einem HLS-synthetisierten IP-Block finden Sie in dieser Anleitung.

Schritt 10: Ausgabe und Eingabe

Ausgang und Eingang
Ausgang und Eingang
Ausgang und Eingang
Ausgang und Eingang

Ausgänge und Eingänge zum endgültigen IP-Block werden aus einer Analyse bestimmt, die der Synthesizer des Datenflusses in und aus der Top-Funktion durchführt.

Ähnlich wie bei VHDL oder Verilog können Sie mit HLS Details zu den Verbindungen zwischen IP angeben. Diese Zeilen sind Beispiele dafür:

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

#pragma HLS INTERFACE Achse port=video_in Bundle=INPUT_STREAM #pragma HLS INTERFACE Achse port=video_out Bundle=OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port=x Bundle=CONTROL_BUS offset=0x14#pragma HLS INTERFACE sy_axilite_port=BUS.0=xilite_port=BUS

Sie können sehen, wie die auf dem IP-Block angezeigten Ports von diesen Anweisungen beeinflusst werden.

Schritt 11: AXI-Registerschnittstelle

AXI-Registerschnittstelle
AXI-Registerschnittstelle

Um Eingaben/Ausgaben zu/von Ihrem IP-Block zum PS zu erhalten, ist dies eine gute Möglichkeit, dies über eine AXI-Schnittstelle zu tun.

Sie können dies in Ihrem HLS-Code angeben, einschließlich der Offsets, die verwendet werden sollen, um später auf den Wert zuzugreifen, wie folgt:

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 Datenfluss

x = 42;

y = 0xDEADBEEF; }

Sobald Sie in Vivado richtig verbunden sind, können Sie mit diesem Code im Vivado SDK auf die Werte zugreifen:

#include "parameter.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);

Dadurch erhalten Sie 42 in x und 0xdeadbeef in y

Schritt 12: Dataflow-Pragma

Dataflow-Pragma
Dataflow-Pragma
Dataflow-Pragma
Dataflow-Pragma
Dataflow-Pragma
Dataflow-Pragma

Innerhalb des #pragma DATAFLOW ändert sich die Art und Weise, wie der Code implementiert wird, von normalem C++. Der Code wird so gepipelinet, dass alle Anweisungen jederzeit in verschiedenen Teilen der Daten ausgeführt werden (Stellen Sie sich das wie ein Fließband in einer Fabrik vor, jede Station arbeitet kontinuierlich, führt eine Funktion aus und gibt sie an die nächste Station weiter)

Aus dem Bild können Sie sehen, dass jede der Anweisungen

Obwohl es sich um normale Variablen handelt, sind img-Objekte tatsächlich als kleine Puffer zwischen den Befehlen implementiert. Die Verwendung eines Bildes als Eingabe für eine Funktion "verbraucht" es und macht es nicht mehr verwendbar. (Daher die Notwendigkeit für die doppelten Befehle)

Empfohlen: