Tabla de contenido:

Síntesis de bloques IP de video Vivado HLS: 12 pasos
Síntesis de bloques IP de video Vivado HLS: 12 pasos

Video: Síntesis de bloques IP de video Vivado HLS: 12 pasos

Video: Síntesis de bloques IP de video Vivado HLS: 12 pasos
Video: Síntesis de Alto Nivel para FPGAs con Vivado-HLS: Como describir HW desde C/C++ 2024, Noviembre
Anonim
Síntesis de bloques IP de vídeo Vivado HLS
Síntesis de bloques IP de vídeo Vivado HLS

¿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

Biblioteca de videos de HLS
Biblioteca de videos de HLS
Biblioteca de videos de HLS
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

Sintetizando
Sintetizando

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

Control de versiones y otra información para la exportación
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

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

Análisis de síntesis y exportación
Análisis de síntesis y exportación
Análisis de síntesis y exportación
Análisis de síntesis y exportación
Análisis de síntesis y exportación
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

Agregar la biblioteca de IP en Vivado
Agregar la biblioteca de IP en Vivado
Agregar la biblioteca de IP en Vivado
Agregar la biblioteca de IP en Vivado
Agregar la biblioteca de IP en Vivado
Agregar la biblioteca de IP en Vivado
Agregar la biblioteca de IP en Vivado
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

Haciendo una actualización
Haciendo una actualización
Haciendo una actualización
Haciendo una actualización
Haciendo una actualización
Haciendo 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

Salida y entrada
Salida y entrada
Salida y entrada
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

Interfaz de registro AXI
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

Pragma de flujo de datos
Pragma de flujo de datos
Pragma de flujo de datos
Pragma de flujo de datos
Pragma de flujo de datos
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: