Tabla de contenido:
- Paso 1: ¿Qué es Vivado HLS?
- Paso 2: Biblioteca de videos de HLS
- Paso 3: sintetizar
- Paso 4: control de versiones y otra información para la exportación
- Paso 5: Exportar a una biblioteca de IP de Vivado
- Paso 6: Análisis de síntesis y exportación
- Paso 7: Agregar la biblioteca de IP en Vivado
- Paso 8: hacer una actualización
- Paso 9: Información y detalles adicionales
- Paso 10: Salida y entrada
- Paso 11: Interfaz de registro AXI
- Paso 12: Pragma de flujo de datos
Video: Síntesis de bloques IP de video Vivado HLS: 12 pasos
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:44
¿Alguna vez ha querido procesar vídeo en tiempo real sin añadir mucha latencia o en un sistema integrado? Las FPGA (matrices de puertas programables en campo) se utilizan a veces para hacer esto; sin embargo, escribir algoritmos de procesamiento de video en lenguajes de especificación de hardware como VHDL o Verilog es frustrante en el mejor de los casos. Ingrese Vivado HLS, la herramienta de Xilinx que le permite programar en un entorno C ++ y generar código de lenguaje de especificación de hardware a partir de él.
Software requerido:
- Vivado HLS
- Vivado
- (Si usa los registros AXI) Vivado SDK
(Opcional) Descargue los ejemplos hechos por Xilinx aquí:
Ejemplos de video de Xilinx HLS
Paso 1: ¿Qué es Vivado HLS?
Vivado HLS es una herramienta utilizada para convertir código tipo c ++ en estructuras de hardware que se pueden implementar en una FPGA. Incluye un IDE para hacer este desarrollo. Una vez que hayas completado tu desarrollo del código para HLS puedes exportar tu IP generada en un formato para usar con Vivado.
Descarga los archivos adjuntos y colócalos cerca de donde vas a crear tu proyecto. (cámbieles el nombre de nuevo a "top.cpp" y "top.h" si tienen un nombre aleatorio)
Paso 2: Biblioteca de videos de HLS
La Videoteca de HLS tiene documentación con diseños de referencia en este documento: XAPP1167 Otro buen recurso es la página Wiki de Xilinx al respecto.
Inicie Vivado HLS.
Crea un nuevo proyecto.
Tome los archivos que descargó en el paso anterior y agréguelos como archivos de origen. (Nota: los archivos no se copian en el proyecto, sino que permanecen donde están)
Luego use el botón Examinar para seleccionar la función superior.
En la página siguiente, seleccione la pieza de Xilinx que está utilizando.
Paso 3: sintetizar
Solución => Ejecutar síntesis C => Solución activa
Después de ~ 227,218 segundos, debería estar listo. (Nota: su tiempo de síntesis real variará en función de muchos factores)
Paso 4: control de versiones y otra información para la exportación
Los números de versión interactúan con Vivado para que pueda actualizar la IP en un diseño. Si se trata de un cambio de versión menor, se puede realizar en su lugar, mientras que los cambios de versión principales requieren que agregue manualmente el nuevo bloque y elimine el anterior. Si sus interfaces no han cambiado y la actualización de la versión es menor, la actualización puede ser Se hace de forma completamente automática presionando el botón actualizar IP. Puedes ejecutar "report_ip_status" en la consola de Vivado tcl para ver el estado de tu IP.
Configure los números de versión y otra información en Solución => Configuración de la solución…
Alternativamente, estos ajustes se pueden establecer durante la exportación.
Paso 5: Exportar a una biblioteca de IP de Vivado
Solución => Exportar RTL
Si no configuró los detalles de la biblioteca de IP en el paso anterior, puede hacerlo ahora.
Paso 6: Análisis de síntesis y exportación
En esta pantalla podemos ver las estadísticas sobre nuestro módulo exportado, mostrando que cumple con nuestro período de reloj de 10ns (100MHz) y la cantidad de cada recurso que usa.
Con una combinación de esto, nuestro Informe de síntesis y nuestro análisis de flujo de datos, podemos ver que se necesitan 317338 ciclos de reloj * período de reloj de 10 ns * 14 etapas de canalización = 0.04442732 segundos. Lo que significa que la latencia total agregada por nuestro procesamiento de imágenes es menos de una vigésima parte de un segundo (cuando se registra en el objetivo de 100MHz).
Paso 7: Agregar la biblioteca de IP en Vivado
Para usar su bloque de IP sintetizado, deberá agregarlo a Vivado.
En Vivado agregue un repositorio de IP a su proyecto yendo al catálogo de IP y haga clic derecho seleccionando "Agregar Repositorio …"
Navegue hasta el directorio de su proyecto Vivado HLS y seleccione el directorio de su solución.
Debería informar la IP que encontró.
Paso 8: hacer una actualización
A veces, necesita realizar cambios en su bloque HLS después de incluirlo en un diseño de Vivado.
Para hacer esto, puede realizar los cambios y resintetizar y exportar la IP con un número de versión más alto (consulte los detalles en el paso anterior sobre los cambios de número de versión mayor / menor).
Después de cambiar la exportación de la nueva versión, actualice sus repositorios de IP en Vivado. Esto se puede hacer cuando Vivado nota que la IP ha cambiado en el repositorio o se puede activar manualmente. (Tenga en cuenta que si actualiza sus repositorios de IP después de comenzar, pero antes de que se complete la exportación en HLS, la IP no estará allí temporalmente, espere a que termine y actualice nuevamente).
En este punto debería aparecer una ventana con la información de que se ha cambiado una IP en el disco y te da la opción de actualizarla con un botón "Actualizar seleccionada". Si el cambio fue un cambio de versión menor y ninguna de las interfaces cambió, luego, presionar ese botón reemplazará automáticamente la antigua IP por la nueva; de lo contrario, es posible que se requiera más trabajo.
Paso 9: Información y detalles adicionales
Los siguientes pasos proporcionan más información sobre cómo funciona la síntesis de HLS y qué puede hacer con ella.
Para ver un ejemplo de un proyecto que utiliza un bloque de IP sintetizado de HLS, consulte este instructivo.
Paso 10: Salida y entrada
Las salidas y entradas al bloque de IP final se determinan a partir de un análisis que hace el sintetizador del flujo de datos dentro y fuera de la función superior.
Al igual que en VHDL o verilog, HLS le permite especificar detalles sobre las conexiones entre IP. Estas líneas son ejemplos de esto:
void image_filter (AXI_STREAM & video_in, AXI_STREAM & video_out, int & x, int & y) {
# pragma HLS INTERFACE puerto del eje = video_in bundle = INPUT_STREAM # pragma HLS INTERFACE eje puerto = video_out bundle = OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port = x bundle = CONTROL_BUS offset = 0x14 # pragma HLS INTERFACE 0 bundle s_axilite = port
Puede ver cómo los puertos exhibidos en el bloque de IP están influenciados por estas directivas.
Paso 11: Interfaz de registro AXI
Para obtener entrada / salida hacia / desde su bloque de IP al PS, una buena manera de hacerlo es a través de una interfaz AXI.
Puede especificar esto en su código HLS, incluidas las compensaciones que se utilizarán para acceder al valor más adelante de esta manera:
void image_filter (AXI_STREAM & video_in, AXI_STREAM & video_out, int & x, int & y) {
# pragma HLS INTERFACE s_axilite puerto = x paquete = CONTROL_BUS offset = 0x14
# pragma HLS INTERFACE s_axilite port = y bundle = CONTROL_BUS offset = 0x1C #pragma HLS dataflow
x = 42;
y = 0xDEADBEEF; }
Una vez conectado correctamente en Vivado, puede acceder a los valores usando este código en Vivado SDK:
#include "parámetros.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);
Esto hará que termines con 42 en xy 0xdeadbeef en y
Paso 12: Pragma de flujo de datos
Dentro de #pragma DATAFLOW, la forma en que se implementa el código cambia con respecto a C ++ normal. El código se canaliza para que todas las instrucciones se ejecuten en todo momento en diferentes partes de los datos (piense en ello como una línea de ensamblaje en una fábrica, cada estación está trabajando continuamente haciendo una función y pasándola a la siguiente estación)
en la imagen se puede ver que cada una de las directivas
A pesar de parecer variables normales, los objetos img se implementan en realidad como pequeños búferes entre los comandos. El uso de una imagen como entrada a una función la "consume" y hace que ya no sea utilizable. (De ahí la necesidad de los comandos duplicados)
Recomendado:
Jardinera Castle (con bloques de código Tinkercad): 25 pasos (con imágenes)
Castle Planter (con bloques de código Tinkercad): este diseño me tomó bastante tiempo lograrlo, y dado que mis habilidades de codificación están limitadas, por decir lo menos, espero que haya salido bien :) Usando las instrucciones proporcionadas, debería poder recrear completamente todos los aspectos de este diseño sin
Bloques de código de Tinkercard: 4 pasos
Bloques de código de Tinkercard: las instrucciones Construyen algo de contexto en torno a las matemáticas & Codificación ¿Cómo pueden los matemáticos o los informáticos parecerse más a los artistas? Hacer patrones es algo que todos tienen en común. Un patrón es un diseño decorativo repetido. El estudio del patrón es el
Codificación con bloques de código IOS: 6 pasos
Codificación con bloques de código IOS: la codificación con iOS es una forma única de hacer que su dispositivo iOS realice automatizaciones, obtenga noticias, inicie guerra cibernética e incluso programe mensajes de texto. Para este instructable, nos centraremos en la guerra cibernética, específicamente enviar spam a amigos y c
Un parque con bloques de código Tinkercad: 9 pasos
Un parque con bloques de código Tinkercad: ¡Hola a todos! ¡Hoy hice una cosa de parque / vecindario! Es mi primer intento con Tinkercad Code Blocks, por lo que esto requirió mucho retroceso y revisión cuando las cosas no funcionaron. (Que fue mucho: P) ¡Espero que disfrutes y hagas esto
Bloques de circuitos magnéticos: 10 pasos (con imágenes)
Bloques de circuitos magnéticos: nada es mejor para aprender o diseñar componentes electrónicos que construir circuitos reales. La placa de pruebas es una opción popular, pero a menudo da como resultado un espagueti incomprensible que no se parece al esquema original y es difícil de depurar. Eso