Πίνακας περιεχομένων:

Vivado HLS Video IP Block Synthesis: 12 Βήματα
Vivado HLS Video IP Block Synthesis: 12 Βήματα

Βίντεο: Vivado HLS Video IP Block Synthesis: 12 Βήματα

Βίντεο: Vivado HLS Video IP Block Synthesis: 12 Βήματα
Βίντεο: Introduction to Vitis High-Level Synthesis (HLS) 2024, Νοέμβριος
Anonim
Vivado HLS Video IP Block Synthesis
Vivado HLS Video IP Block Synthesis

Θέλατε ποτέ να κάνετε επεξεργασία σε πραγματικό χρόνο σε βίντεο χωρίς να προσθέσετε μεγάλη καθυστέρηση ή σε ενσωματωμένο σύστημα; Μερικές φορές χρησιμοποιούνται FPGAs (Field Programmable Gate Arrays). Ωστόσο, η συγγραφή αλγορίθμων επεξεργασίας βίντεο σε γλώσσες προδιαγραφών υλικού όπως το VHDL ή το Verilog είναι στην καλύτερη περίπτωση απογοητευτική. Εισαγάγετε το Vivado HLS, το εργαλείο Xilinx που σας επιτρέπει να προγραμματίζετε σε περιβάλλον C ++ και να δημιουργείτε κώδικα γλώσσας προδιαγραφών υλικού από αυτό.

Απαιτούμενα λογισμικά:

  • Vivado HLS
  • Vivado
  • (Εάν χρησιμοποιείτε τους καταχωρητές AXI) Vivado SDK

(Προαιρετικό) Κατεβάστε τα παραδείγματα του Xilinx εδώ:

Παραδείγματα βίντεο Xilinx HLS

Βήμα 1: Τι είναι το Vivado HLS;

Το Vivado HLS είναι ένα εργαλείο που χρησιμοποιείται για τη μετατροπή κώδικα τύπου c ++ σε δομές υλικού που μπορούν να εφαρμοστούν σε FPGA. Περιλαμβάνει IDE για την πραγματοποίηση αυτής της ανάπτυξης. Μόλις ολοκληρώσετε την ανάπτυξη του κώδικα για το HLS, μπορείτε να εξάγετε τη δημιουργημένη IP σας σε μορφή για χρήση με το Vivado.

Κατεβάστε τα συνημμένα αρχεία και τοποθετήστε τα κοντά στο σημείο που θα δημιουργήσετε το έργο σας. (μετονομάστε τα ξανά σε "top.cpp" και "top.h" εάν έχουν τυχαίο όνομα)

Βήμα 2: Βιβλιοθήκη βίντεο HLS

Βιβλιοθήκη βίντεο HLS
Βιβλιοθήκη βίντεο HLS
Βιβλιοθήκη βίντεο HLS
Βιβλιοθήκη βίντεο HLS

Η Βιβλιοθήκη βίντεο HLS έχει τεκμηρίωση με σχέδια αναφοράς σε αυτό το έγγραφο: XAPP1167Ένας άλλος καλός πόρος είναι η σελίδα Xilinx Wiki σχετικά με αυτό.

Ξεκινήστε το Vivado HLS.

Δημιουργήστε ένα νέο έργο.

Πάρτε τα αρχεία που κατεβάσατε στο προηγούμενο βήμα και προσθέστε τα ως αρχεία προέλευσης. (Σημείωση: τα αρχεία δεν αντιγράφονται στο έργο, αλλά αντίθετα παραμένουν εκεί που είναι)

Στη συνέχεια, χρησιμοποιήστε το κουμπί Αναζήτηση για να επιλέξετε την κορυφαία λειτουργία.

Στην επόμενη σελίδα, επιλέξτε το τμήμα Xilinx που χρησιμοποιείτε.

Βήμα 3: Σύνθεση

Σύνθεση
Σύνθεση

Λύση => Εκτέλεση C Synthesis => Ενεργή λύση

Μετά από 7 227.218 δευτερόλεπτα, θα πρέπει να γίνει. (Σημείωση: ο πραγματικός χρόνος σύνθεσής σας θα διαφέρει ανάλογα με πολλούς παράγοντες)

Βήμα 4: Έκδοση και άλλες πληροφορίες για εξαγωγή

Έκδοση και άλλες πληροφορίες για εξαγωγή
Έκδοση και άλλες πληροφορίες για εξαγωγή

Οι αριθμοί έκδοσης αλληλεπιδρούν με το Vivado για να έχετε τη δυνατότητα να ενημερώσετε την IP σε ένα σχέδιο. Εάν πρόκειται για αλλαγή δευτερεύουσας έκδοσης, μπορεί να γίνει στη θέση της, ενώ οι μεγάλες αλλαγές της έκδοσης απαιτούν να προσθέσετε μη αυτόματα το νέο μπλοκ και να αφαιρέσετε το παλιό. Εάν οι διεπαφές σας δεν έχουν αλλάξει και η ενημέρωση έκδοσης είναι ήσσονος σημασίας, η ενημέρωση μπορεί να είναι γίνεται εντελώς αυτόματα πατώντας το κουμπί ενημέρωσης IP. Μπορείτε να εκτελέσετε το "report_ip_status" στην κονσόλα Vivado tcl για να δείτε την κατάσταση της IP σας.

Ορίστε τους αριθμούς έκδοσης και άλλες πληροφορίες στο Solution => Solution Settings…

Εναλλακτικά, αυτές οι ρυθμίσεις μπορούν να οριστούν κατά την εξαγωγή.

Βήμα 5: Εξαγωγή σε βιβλιοθήκη IP Vivado

Εξαγωγή σε βιβλιοθήκη IP Vivado
Εξαγωγή σε βιβλιοθήκη IP Vivado
Εξαγωγή σε βιβλιοθήκη IP Vivado
Εξαγωγή σε βιβλιοθήκη IP Vivado

Λύση => Εξαγωγή RTL

Εάν δεν ορίσατε τις λεπτομέρειες της βιβλιοθήκης IP στο προηγούμενο βήμα, μπορείτε να το κάνετε τώρα.

Βήμα 6: Ανάλυση σύνθεσης και εξαγωγής

Σύνθεση και ανάλυση εξαγωγής
Σύνθεση και ανάλυση εξαγωγής
Σύνθεση και ανάλυση εξαγωγής
Σύνθεση και ανάλυση εξαγωγής
Σύνθεση και ανάλυση εξαγωγής
Σύνθεση και ανάλυση εξαγωγής

Σε αυτήν την οθόνη μπορούμε να δούμε τα στατιστικά στοιχεία σχετικά με την εξαγόμενη μονάδα μας, δείχνοντας ότι ανταποκρίνεται στην περίοδο ρολογιού μας των 10ns (100MHz) και πόσο από κάθε πόρο που χρησιμοποιεί.

Με έναν συνδυασμό αυτού, της σύνθετης έκθεσής μας και της ανάλυσης ροής δεδομένων, μπορούμε να δούμε ότι χρειάζονται 317338 κύκλοι ρολογιού * περίοδος ρολογιού 10ns * 14 στάδια αγωγών = 0,04442732 δευτερόλεπτα. Αυτό σημαίνει ότι η συνολική καθυστέρηση που προστίθεται από την επεξεργασία της εικόνας μας είναι μικρότερη από το ένα εικοστό του δευτερολέπτου (όταν χρονομετρηθεί στα στοχευμένα 100MHz).

Βήμα 7: Προσθήκη της Βιβλιοθήκης IP στο Vivado

Προσθήκη της Βιβλιοθήκης IP στο Vivado
Προσθήκη της Βιβλιοθήκης IP στο Vivado
Προσθήκη της Βιβλιοθήκης IP στο Vivado
Προσθήκη της Βιβλιοθήκης IP στο Vivado
Προσθήκη της Βιβλιοθήκης IP στο Vivado
Προσθήκη της Βιβλιοθήκης IP στο Vivado
Προσθήκη της Βιβλιοθήκης IP στο Vivado
Προσθήκη της Βιβλιοθήκης IP στο Vivado

Για να χρησιμοποιήσετε το συνθετικό μπλοκ IP σας, θα χρειαστεί να το προσθέσετε στο Vivado.

Στο Vivado προσθέστε ένα αποθετήριο IP στο έργο σας πηγαίνοντας στον κατάλογο IP και κάντε δεξί κλικ επιλέγοντας "Προσθήκη αποθήκης …"

Μεταβείτε στον κατάλογο έργου Vivado HLS και επιλέξτε τον κατάλογο λύσεων.

Θα πρέπει να αναφέρει την IP που βρήκε.

Βήμα 8: Κάντε αναβάθμιση

Κάνοντας αναβάθμιση
Κάνοντας αναβάθμιση
Κάνοντας μια αναβάθμιση
Κάνοντας μια αναβάθμιση
Κάνοντας αναβάθμιση
Κάνοντας αναβάθμιση

Μερικές φορές χρειάζεται να κάνετε αλλαγές στο μπλοκ HLS αφού το συμπεριλάβετε σε σχέδιο Vivado.

Για να το κάνετε αυτό, μπορείτε να κάνετε τις αλλαγές και να επανασυνθέσετε και να εξάγετε την IP με έναν υψηλότερο αριθμό έκδοσης (δείτε λεπτομέρειες στο προηγούμενο βήμα σχετικά με τις μεγάλες αλλαγές στον αριθμό του αριθμού έκδοσης).

Αφού αλλάξετε την εξαγωγή της νέας έκδοσης, ανανεώστε τα αποθετήρια IP σας στο Vivado. Αυτό μπορεί είτε να γίνει όταν η Vivado παρατηρήσει ότι η IP έχει αλλάξει στο χώρο αποθήκευσης, είτε ενεργοποιείται χειροκίνητα. (Σημείωση, εάν ανανεώσετε τα αποθετήρια IP σας μετά την έναρξη, αλλά πριν ολοκληρωθεί η εξαγωγή σε HLS, η IP δεν θα είναι προσωρινά εκεί, περιμένετε να τελειώσει και να ανανεωθεί ξανά.)

Σε αυτό το σημείο θα πρέπει να εμφανιστεί ένα παράθυρο με τις πληροφορίες ότι έχει αλλάξει μια διεύθυνση IP στο δίσκο και σας δίνει την επιλογή να την ενημερώσετε με ένα κουμπί "Upgrade Selected". Εάν η αλλαγή ήταν μια μικρή έκδοση και καμία από τις διεπαφές δεν άλλαξε, στη συνέχεια, πατώντας αυτό το κουμπί θα αντικαταστήσει αυτόματα την παλιά IP με τη νέα, διαφορετικά μπορεί να απαιτηθεί περισσότερη εργασία.

Βήμα 9: Πρόσθετες λεπτομέρειες και πληροφορίες

Τα παρακάτω βήματα παρέχουν περισσότερες πληροφορίες σχετικά με τον τρόπο λειτουργίας της σύνθεσης HLS και τι μπορείτε να κάνετε με αυτήν.

Για ένα παράδειγμα έργου που χρησιμοποιεί ένα μπλοκ IP συνθεμένης HLS, δείτε αυτό το διδακτικό.

Βήμα 10: Έξοδος και είσοδος

Έξοδος και Είσοδος
Έξοδος και Είσοδος
Έξοδος και Είσοδος
Έξοδος και Είσοδος

Οι έξοδοι και οι είσοδοι στο τελικό μπλοκ IP καθορίζονται από μια ανάλυση που κάνει ο συνθέτης της ροής δεδομένων μέσα και έξω από την κορυφαία συνάρτηση.

Παρόμοια με το VHDL ή το verilog, το HLS σάς επιτρέπει να καθορίσετε λεπτομέρειες σχετικά με τις συνδέσεις μεταξύ IP. Αυτές οι γραμμές είναι παραδείγματα αυτού:

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

#pragma HLS INTERFACE θύρα άξονα = video_in bundle = INPUT_STREAM #pragma HLS INTERFACE port port = video_out bundle = OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port = x bundle = CONTROL_BLUSFL

Μπορείτε να δείτε πώς οι θύρες που εμφανίζονται στο μπλοκ IP επηρεάζονται από αυτές τις οδηγίες.

Βήμα 11: Εγγραφή διασύνδεσης AXI Register

AXI Register Interfacing
AXI Register Interfacing

Για να έχετε είσοδο/έξοδο από/από το μπλοκ IP σας στο PS, ένας καλός τρόπος για να το κάνετε αυτό είναι μέσω μιας διεπαφής AXI.

Μπορείτε να το καθορίσετε στον κωδικό HLS, συμπεριλαμβανομένων των αντισταθμίσεων που θα χρησιμοποιηθούν για να αποκτήσετε πρόσβαση στην τιμή αργότερα ως εξής:

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

Αφού συνδεθείτε σωστά στο Vivado, μπορείτε να αποκτήσετε πρόσβαση στις τιμές χρησιμοποιώντας αυτόν τον κωδικό στο Vivado SDK:

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

Αυτό θα σας κάνει να καταλήξετε με 42 σε x και 0xdeadbeef σε y

Βήμα 12: Dataflow Pragma

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

Μέσα στο #pragma DATAFLOW ο τρόπος εφαρμογής του κώδικα αλλάζει από το κανονικό C ++. Ο κώδικας διοχετεύεται έτσι ώστε όλες οι οδηγίες να εκτελούνται ανά πάσα στιγμή σε διαφορετικά μέρη των δεδομένων (Σκεφτείτε το σαν μια γραμμή συναρμολόγησης σε ένα εργοστάσιο, κάθε σταθμός λειτουργεί συνεχώς κάνοντας μια λειτουργία και μεταφέροντάς την στον επόμενο σταθμό)

από την εικόνα μπορείτε να δείτε ότι κάθε μία από τις οδηγίες

Παρά το γεγονός ότι φαίνονται φυσιολογικές μεταβλητές, τα αντικείμενα img εφαρμόζονται στην πραγματικότητα ως μικρά buffer μεταξύ των εντολών. Η χρήση μιας εικόνας ως είσοδο σε μια συνάρτηση την "καταναλώνει" και την καθιστά πλέον άχρηστη. (Εξ ου και η ανάγκη για διπλές εντολές)

Συνιστάται: