Taula de continguts:
- Pas 1: Què és Vivado HLS?
- Pas 2: biblioteca de vídeos HLS
- Pas 3: Sintetització
- Pas 4: Versió de versions i altra informació per exportar
- Pas 5: exportació a una biblioteca IP de Vivado
- Pas 6: Anàlisi de síntesi i exportació
- Pas 7: Afegir la biblioteca IP a Vivado
- Pas 8: fer una actualització
- Pas 9: detalls i informació addicionals
- Pas 10: sortida i entrada
- Pas 11: Interfície del registre AXI
- Pas 12: Pragma de flux de dades
Vídeo: Síntesi de blocs de vídeo IP de Vivado HLS: 12 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:16
Alguna vegada heu volgut processar en temps real el vídeo sense afegir molta latència o en un sistema incrustat? De vegades s’utilitzen FPGA (Field Programmable Gate Arrays); no obstant això, escriure algoritmes de processament de vídeo en llenguatges d'especificació de maquinari com VHDL o Verilog és frustrant en el millor dels casos. Introduïu Vivado HLS, l'eina Xilinx que us permet programar en un entorn C ++ i generar-ne un codi d'idioma d'especificació de maquinari.
Programaris necessaris:
- Vivado HLS
- Vivado
- (Si utilitzeu els registres AXI) Vivado SDK
(Opcional) Descarregueu els exemples fets per Xilinx aquí:
Exemples de vídeo Xilinx HLS
Pas 1: Què és Vivado HLS?
Vivado HLS és una eina que s’utilitza per convertir codi com c ++ en estructures de maquinari que es poden implementar en un FPGA. Inclou un IDE per fer aquest desenvolupament. Un cop hàgiu completat el desenvolupament del codi per a HLS, podeu exportar la vostra IP generada en un format per utilitzar amb Vivado.
Baixeu-vos els fitxers adjunts i poseu-los a prop del lloc on crearà el vostre projecte. (canvieu-los amb el nom "top.cpp" i "top.h" si tenen un nom aleatori)
Pas 2: biblioteca de vídeos HLS
La biblioteca de vídeo HLS conté documentació amb dissenys de referència en aquest document: XAPP1167 Un altre bon recurs és la pàgina Xilinx Wiki sobre la mateixa.
Inicieu Vivado HLS.
Crea un projecte nou.
Agafeu els fitxers que heu descarregat al pas anterior i afegiu-los com a fitxers font. (Nota: els fitxers no es copien al projecte, sinó que queden allà on són)
A continuació, utilitzeu el botó Examinar per seleccionar la funció superior.
A la pàgina següent, seleccioneu la part Xilinx que utilitzeu.
Pas 3: Sintetització
Solució => Executa C Synthesis => Solució activa
Després de ~ 227.218 segons, s'hauria de fer. (Nota: el temps real de síntesi variarà en funció de molts factors)
Pas 4: Versió de versions i altra informació per exportar
Els números de versió interactuen amb Vivado per fer que pugueu actualitzar la IP en un disseny. Si es tracta d'un canvi de versió menor, es pot fer al seu lloc, mentre que els canvis de versió principals requereixen que afegiu manualment el bloc nou i que elimineu l'antic. Si les vostres interfícies no han canviat i l'actualització de la versió és menor, es pot actualitzar es fa completament automàticament prement el botó d'actualització d'IP. Podeu executar "report_ip_status" a la consola Vivado tcl per veure l'estat de la vostra IP.
Definiu els números de versió i altra informació a Solution => Configuració de la solució …
Com a alternativa, aquests paràmetres es poden configurar durant l’exportació.
Pas 5: exportació a una biblioteca IP de Vivado
Solució => Exporta RTL
Si no heu definit els detalls de la biblioteca IP al pas anterior, podeu fer-ho ara.
Pas 6: Anàlisi de síntesi i exportació
En aquesta pantalla podem veure les estadístiques sobre el nostre mòdul exportat, mostrant que compleix el nostre període de rellotge de 10ns (100 MHz) i la quantitat de cada recurs que utilitza.
Amb una combinació d’aquest, el nostre informe de síntesi i l’anàlisi del flux de dades, podem veure que triga 317338 cicles de rellotge * període de rellotge de 10ns * 14 etapes de canalització = 0,04442732 segons. És a dir, que la latència total afegida pel processament d’imatges és inferior a una vintena part de segon (quan es marca a 100 MHz).
Pas 7: Afegir la biblioteca IP a Vivado
Per utilitzar el bloc IP sintetitzat, haureu d'afegir-lo a Vivado.
A Vivado, afegiu un dipòsit d’IP al vostre projecte anant al catàleg d’IP i fent clic amb el botó dret seleccionant "Afegeix un dipòsit …"
Aneu al directori del projecte Vivado HLS i seleccioneu el directori de la solució.
Ha d’informar de la IP que ha trobat.
Pas 8: fer una actualització
De vegades, cal fer canvis al bloc HLS després d’incloure’l en un disseny Vivado.
Per fer-ho, podeu fer els canvis, tornar a sintetitzar i exportar la IP amb un número de versió superior (vegeu els detalls del pas anterior sobre els canvis de número de versió major / menor).
Després de canviar l'exportació de la nova versió, actualitzeu els repositoris IP a Vivado. Això es pot fer quan Vivado adverteix que la IP ha canviat al dipòsit o es pot activar manualment. (Tingueu en compte que si actualitzeu els repositoris d'IP després d'iniciar-lo, però abans que l'exportació es completi a HLS, la IP no hi serà temporalment, espereu que acabi i actualitzeu-la de nou.)
En aquest moment, hauria d'aparèixer una finestra amb la informació que ha canviat una adreça IP al disc i us dóna l'opció d'actualitzar-la amb un botó "Actualitza la selecció". aleshores, en prémer aquest botó se substituirà automàticament la vella IP per la nova, en cas contrari potser caldrà més treball.
Pas 9: detalls i informació addicionals
Els passos següents proporcionen més informació sobre com funciona la síntesi HLS i què podeu fer amb ella.
Per obtenir un exemple d’un projecte que utilitza un bloc IP sintetitzat HLS, consulteu aquest document instructiu.
Pas 10: sortida i entrada
Les sortides i entrades del bloc IP final es determinen a partir d’una anàlisi que fa el sintetitzador del flux de dades dins i fora de la funció superior.
De manera similar a la de VHDL o Verilog, HLS us permet especificar detalls sobre les connexions entre IP. Aquestes línies en són exemples:
void image_filter (AXI_STREAM & video_in, AXI_STREAM & video_out, int & x, int & y) {
#pragma HLS INTERFACE axis port = video_in bundle = INPUT_STREAM #pragma HLS INTERFACE axis port = video_out bundle = OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port = x bundle = CONTROL_BUS offset = 0x14 # pragma HLS INTERFACE = 0xL
Podeu veure com els ports exposats al bloc IP estan influïts per aquestes directives.
Pas 11: Interfície del registre AXI
Per aconseguir l'entrada / sortida del bloc IP a la PS, una bona manera de fer-ho és mitjançant una interfície AXI.
Podeu especificar-ho al vostre codi HLS, inclosos els desplaçaments que s'utilitzaran per accedir al valor més endavant així:
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; }
Un cop connectat correctament a Vivado, podeu accedir als valors utilitzant aquest codi a 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);
Això us farà acabar amb 42 en x i 0xdeadbeef en y
Pas 12: Pragma de flux de dades
Dins del #pragma DATAFLOW, la forma en què s’implementa el codi canvia del C ++ normal. El codi es canalitza de manera que totes les instruccions s’executin en tot moment en diferents parts de les dades (penseu-ho com una línia de muntatge en una fàbrica, cada estació treballa contínuament fent una funció i passant-la a la següent)
a la imatge es pot veure que cadascuna de les directives
Tot i semblar que són variables normals, els objectes img s’implementen en realitat com a petits buffers entre les ordres. L'ús d'una imatge com a entrada d'una funció la "consumeix" i la deixa de fer servir. (D'aquí la necessitat de les ordres duplicades)
Recomanat:
Plantadora de castells (amb blocs de codi Tinkercad): 25 passos (amb imatges)
Castle Planter (amb blocs de codi de Tinkercad): aquest disseny em va costar bastant temps, i atès que les meves habilitats de codificació són, com a mínim, espero que resultés correcte :) Amb les instruccions proporcionades hauríeu de ser capaços de recreeu completament tots els aspectes d’aquest disseny sense
Motor pas a pas controlat per MIDI amb xip de síntesi digital directa (DDS): 3 passos
Motor pas a pas controlat per MIDI amb xip de síntesi digital directa (DDS): Alguna vegada heu tingut una mala idea que NOMÉS heu de convertir-vos en un mini projecte? Bé, estava jugant amb un esbós que havia fet per a l'Arduino Due dirigit a fer música amb un mòdul AD9833 Direct Digital Synthesis (DDS) … i en algun moment vaig pensar & q
Codificació amb blocs de codi IOS: 6 passos
Codificació amb blocs de codi IOS: la codificació amb iOS és una manera única de fer que el vostre dispositiu iOS faci automatitzacions, obtingui les notícies, iniciï la guerra cibernètica i fins i tot programi missatges de text. Per a aquesta instrucció, ens centrarem en la guerra cibernètica, específicament els amics de correu brossa i c
Síntesi de parla retro. Part: 12 IoT, domòtica: 12 passos (amb imatges)
Síntesi de parla retro. Part: 12 IoT, domòtica: aquest article és el 12è d'una sèrie sobre instruccions domòtiques que documenten com crear i integrar un dispositiu de síntesi de parla retro IoT en un sistema domòtic existent que inclou totes les funcions de programari necessàries per habilitar t
Síntesi de so analògic a l'ordinador: 10 passos (amb imatges)
Síntesi de so analògic a l'ordinador: com el so d'aquests antics sintetitzadors analògics? Voleu jugar amb un al vostre temps, al vostre lloc, durant el temps que vulgueu, GRATIS? Aquí és on es fan realitat els teus somnis més salvatges de Moog. Podeu convertir-vos en artista de gravació electrònica o jus