Taula de continguts:

Síntesi de blocs de vídeo IP de Vivado HLS: 12 passos
Síntesi de blocs de vídeo IP de Vivado HLS: 12 passos

Vídeo: Síntesi de blocs de vídeo IP de Vivado HLS: 12 passos

Vídeo: Síntesi de blocs de vídeo IP de Vivado HLS: 12 passos
Vídeo: Vivado HLS demonstration C function to FPGA 2024, De novembre
Anonim
Síntesi de blocs de vídeo IP de Vivado HLS
Síntesi de blocs de vídeo IP de Vivado HLS

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

Biblioteca de vídeos HLS
Biblioteca de vídeos HLS
Biblioteca de vídeos HLS
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ó

Sintetitzant
Sintetitzant

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

Versió de versions i altra informació per exportar
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

Exportació a una biblioteca IP de Vivado
Exportació a una biblioteca IP de Vivado
Exportació a una biblioteca IP de Vivado
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ó

Anàlisi de síntesi i exportació
Anàlisi de síntesi i exportació
Anàlisi de síntesi i exportació
Anàlisi de síntesi i exportació
Anàlisi de síntesi i exportació
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

Addició de la biblioteca IP a Vivado
Addició de la biblioteca IP a Vivado
Addició de la biblioteca IP a Vivado
Addició de la biblioteca IP a Vivado
Addició de la biblioteca IP a Vivado
Addició de la biblioteca IP a Vivado
Addició de la biblioteca IP a Vivado
Addició de 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ó

Fent una actualització
Fent una actualització
Fent una actualització
Fent una actualització
Fent una actualització
Fent 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

Sortida i entrada
Sortida i entrada
Sortida i entrada
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

Interfície del registre AXI
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

Pragma de flux de dades
Pragma de flux de dades
Pragma de flux de dades
Pragma de flux de dades
Pragma de flux de dades
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: