Tabla de contenido:

Cámara ZYBO OV7670 con control de giro / inclinación: 39 pasos (con imágenes)
Cámara ZYBO OV7670 con control de giro / inclinación: 39 pasos (con imágenes)

Video: Cámara ZYBO OV7670 con control de giro / inclinación: 39 pasos (con imágenes)

Video: Cámara ZYBO OV7670 con control de giro / inclinación: 39 pasos (con imágenes)
Video: OV7670 FPGA Zedboard 2024, Noviembre
Anonim
Image
Image
Cámara ZYBO OV7670 con control de giro / inclinación
Cámara ZYBO OV7670 con control de giro / inclinación

Comience en el paso uno para obtener detalles sobre cómo crear un servocontrolador PWM de 2 ejes.

Comience en el diagrama de bloques masivo (Paso 19) para el proyecto completo.

Configuración de cámara + giro / inclinación que usamos:

Se utilizó el PmodCON3 de Digilent para conectar los servos.

Paso 1: Creación de un módulo PWM: archivo de origen

Paso 2: Creación de un módulo PWM: configuración de Vivado

Creación de un módulo PWM: configuración de Vivado
Creación de un módulo PWM: configuración de Vivado

Primero, descargue el sitio web Vivado Design Suite From Xilinx. Instale todo el paquete de diseño, incluido el kit de desarrollo de software (SDK) de Vivado. Este proyecto utiliza la versión 2017.2.

Mientras tanto, Digilent Adept 2 también debería instalarse como un controlador de placa Zybo.

Paso 3: Crear un módulo PWM: crear un archivo de proyecto

Creación de un módulo PWM: creación de un archivo de proyecto
Creación de un módulo PWM: creación de un archivo de proyecto

Antes de crear un archivo de proyecto, debe asegurarse de haber instalado el archivo Zybo correctamente como el tutorial aquí:

Instalación del archivo de placa Vivado versión 2015.1 y posterior

Abra Vivado 2017.2. En Inicio rápido, haga clic en Crear proyecto -> Siguiente -> Nombre del proyecto (nombre el nombre de su proyecto aquí) -> Tipo de proyecto. En Tipo de proyecto, seleccione Proyecto RTL y marque "No especificar fuentes en este momento". A continuación, para la parte predeterminada, seleccione "Tableros" y "Zybo" como nombre para mostrar. A continuación, haga clic en Finalizar para iniciar el proyecto.

Paso 4: Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (I)

Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (I)
Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (I)

En Flow Navigator, haga clic en “” Crear diseño de bloque”, luego presione OK. haga clic en el signo "+" para agregar las direcciones IP necesarias. Agregar:

  • Un sistema de procesamiento ZYNQ7 Dos temporizadores AXI
  • Dos temporizadores AXI

Paso 5: Creación de un módulo PWM: diseño de bloques y configuración de archivos de restricciones (II)

Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (II)
Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (II)

Después de agregar direcciones IP, ejecute la automatización de bloques y la automatización de la conexión. Una vez completada la automatización, en el bloque “axi_timer_0”, haga clic derecho en pwm0 -> Make External. Nombra el pin externo pwm0 como pwm_Xaxis. Además, repita el proceso anterior en el bloque "axi_timer_1" y nombre el pin externo pwm0 como pwm_Zaxis.

Paso 6: Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (III)

Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (III)
Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (III)

Observe que cada vez que terminamos el Diseño de bloques en Vivado, necesitamos crear un Wrapper HDL. Ya que será el módulo de nivel superior para cada proyecto.

Paso 7: Creación de un módulo PWM: diseño de bloques y configuración de archivos de restricciones (IV)

Creación de un módulo PWM: diseño de bloques y configuración de archivos de restricciones (IV)
Creación de un módulo PWM: diseño de bloques y configuración de archivos de restricciones (IV)

Ahora, necesitamos configurar nuestro archivo de restricción para asignar pines conectados a nuestro diagrama de bloques. Cierre la ventana Diseño de bloque, pestaña En Fuentes, "Agregar fuentes" -> Agregar o crear restricciones-> agregar Zybo-Master.xdc como nuestros archivos de restricciones.

Paso 8: Creación de un módulo PWM: configuración de archivo de restricción y diseño de bloques (V)

Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (V)
Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (V)

Abra el archivo de restricción Zybo-Master.xdc de la carpeta Constraints, descomente los puertos que queremos especificar como señales de salida y cambie el nombre de “get_ports {XXXX}”, que XXXX denota el pin externo nombrado en el diagrama de bloques. La configuración del archivo de restricción se muestra en la figura.

Paso 9: Creación de un módulo PWM: instalación de hardware

Creación de un módulo PWM: instalación de hardware
Creación de un módulo PWM: instalación de hardware

Conecte los servomotores al Pmod CON3. TowerPro SG90 es el modelo de servomotor que utilizamos en este proyecto. Para los cables del servomotor, el cable naranja representa la señal PWM, conectada al pin SIG en Pmod CON3. El cable rojo Vcc es un cable de alimentación conectado al pin VS en Pmod CON3. Finalmente, el cable marrón Gnd es un cable de tierra conectado al pin GND. A continuación, inserte el Pmod CON3 en la fila superior del puerto JD en la placa Zybo.

Paso 10: Creación de un módulo PWM: genere Bitstream y ejecute SDK

En la pestaña Navegador de proyectos, ejecute Generate BitStream.

2. Exportar hardware: Archivo> Exportar> Exportar hardware-> marcar en "incluir bitstream" -> Aceptar 3. Iniciar SDK: Archivo -> Iniciar SDK.

Paso 11: Creación de un módulo PWM: cree una nueva aplicación en Xilinx SDK

Creación de un módulo PWM: cree una nueva aplicación en Xilinx SDK
Creación de un módulo PWM: cree una nueva aplicación en Xilinx SDK

Crear una nueva aplicación:

Archivo> Nuevo> Proyecto de aplicación -> Ingrese el nombre de su proyecto -> Finalizar

En el Explorador de proyectos, debería haber tres carpetas.

En este caso, “design_1_wrapper_hw_platform_0” es la carpeta previamente exportada por Vivado. Axis_2_PWM_SDK_bsp es la carpeta del paquete de soporte de la placa. Y Axis_2_PWM_SDK es nuestra carpeta principal de proyectos en SDK. Puede ver el archivo "helloworld.c" en la carpeta "src" de Axis_2_PWM_SDK, donde "helloworld.c" es el archivo principal.

Paso 12: Creación de un módulo PWM: descripción general del Explorador de proyectos (I)

Creación de un módulo PWM: descripción general del Explorador de proyectos (I)
Creación de un módulo PWM: descripción general del Explorador de proyectos (I)

Revisemos algunos archivos en el Explorador de proyectos. Primero, en la carpeta "design_1_wrapper_hw_platform_0", abra el "system.hdf". Este archivo muestra el mapa de direcciones para el procesador ps7_cortex9 y los bloques IP presentes en nuestro diseño.

Paso 13: Creación de un módulo PWM: descripción general del Explorador de proyectos (II)

Creación de un módulo PWM: descripción general del Explorador de proyectos (II)
Creación de un módulo PWM: descripción general del Explorador de proyectos (II)

Luego, verifique el archivo "incluir" y "libsrc" en la carpeta "Axis_2_PWM_SDK_bsp". Los archivos de biblioteca aquí nos permiten interactuar con periféricos de hardware sin “reproducir” registros.

Paso 14: Creación de un módulo PWM: descripción general del Explorador de proyectos (III)

Creación de un módulo PWM: descripción general del Explorador de proyectos (III)
Creación de un módulo PWM: descripción general del Explorador de proyectos (III)

A través de la documentación de BSP, xtmrctr.h se encuentra como una biblioteca de control de temporizador de Xilinx relacionada con AXI Timer. Normalmente, podríamos encontrar la función PWM deseada aquí. Sin embargo, si lee la documentación "tmrctr_v4_3", muestra que el controlador no es compatible actualmente con la operación PWM del dispositivo. Debido a la deficiencia en la función PWM, tenemos que terminar nuestra función PWM con la ayuda de xtmrctr.h y AXI Timer v2.0 LogiCORE IP Product Guide.

Paso 15: Creación de un módulo PWM: función de resumen de PWM (I)

Creación de un módulo PWM: función de resumen de PWM (I)
Creación de un módulo PWM: función de resumen de PWM (I)

De vuelta al archivo principal "helloworld.c", incluya los siguientes archivos de encabezado:

Paso 16: Creación de un módulo PWM: función de resumen de PWM (II)

Creación de un módulo PWM: función de resumen de PWM (II)
Creación de un módulo PWM: función de resumen de PWM (II)

Defina las direcciones base de dos AXI TImer mediante "xparameters.h".

Paso 17: Creación de un módulo PWM: función de resumen de PWM (III)

Creación de un módulo PWM: función de resumen de PWM (III)
Creación de un módulo PWM: función de resumen de PWM (III)

Cree la función PWM deseada.

Duty_val: convierte el valor de grado en ciclo de trabajo PWM_Freq_Duty: establece la frecuencia y el ciclo de trabajo deseados para generar PWM. También se debe asignar un período de reloj.

PWM_START: asigne la dirección del registro PWM y comience a generar PWM.

PWM_STOP: asigne la dirección del registro PWM y deje de generar PWM.

El resto del código de demostración se muestra en "helloworld.c" en "Axis_2_PWM_SDK"

Paso 18: Creación de un módulo PWM: ¡hágalo funcionar

1. Programe la FPGA a través del SDK

  • Conecte la placa Zybo a través del puerto USB a la PC.
  • Herramientas Xilinx -> Programa FPGA

2. Ejecute el programa

Haga clic en el icono "Ejecutar" y despliegue el menú -> Ejecutar como -> Iniciar en hardware

3. Terminal SDK

  • Abra el terminal SDK -> Conectar al puerto serie -> Aceptar
  • Ejecuta el programa. Si el código de demostración se ejecuta correctamente, debería ver "¡Inicialización completa!" en la terminal SDK.

Paso 19: Procesamiento de transmisión de video en Digilent ZYBO con OV7670

Archivo de archivo completo adjunto.

Paso 20: diagrama de bloques completo

Diagrama de bloques completo
Diagrama de bloques completo

Esto muestra el diagrama completo de todas las conexiones y bloques de IP en el proyecto.

Paso 21: Conecte el OV7670 al ZYBO

Conecte el OV7670 al ZYBO
Conecte el OV7670 al ZYBO

Cree una conexión para cablear el módulo ov7670 a ZYBO Pmods

Pmod de datos es Pmod D

El control Pmod es Pmod C

Además, conecte el PmodCON3 y los servos como se especifica en la primera mitad de este tutorial

Paso 22: Crear diseño de bloque

Crear diseño de bloque
Crear diseño de bloque

En Flow Navigator, haga clic en "Crear diseño de bloque", luego presione OK.

Paso 23: agregue archivos VHDL para el control y la captura de la cámara OV7670

Agregue los archivos VHDL adjuntos a este paso al proyecto

Paso 24: Agregar archivo de restricciones

Agregue el archivo de restricciones adjunto a su proyecto.

Paso 25: Agregar IP Repo para HLS IP

Agregar IP Repo para HLS IP
Agregar IP Repo para HLS IP

Tome el archivo Zip adjunto y descomprímalo en una nueva carpeta con un nombre similar en un nuevo directorio (carpeta) llamado "HLS_repo".

Agregue un repositorio de IP a su proyecto yendo al catálogo de IP y haga clic derecho seleccionando "Agregar repositorio …"

Navegue a su directorio "HLS_repo" y selecciónelo.

Opcional: ¡Cree el bloque de procesamiento de video HLS usted mismo!

Paso 26: agregue módulos e IP

Agregar módulos e IP
Agregar módulos e IP
Agregar módulos e IP
Agregar módulos e IP

Agregue los módulos ov7670_axi_stream_capture, debounce y ov7670_controller al diagrama de bloques haciendo clic derecho en el fondo y seleccionando "Agregar módulo …"

Del mismo modo, agregue las IP:

  • HLS_Video_Track
  • Escritura del búfer de fotogramas de vídeo
  • Lectura del búfer de fotogramas de vídeo
  • Controlador de tiempo de video
  • Salida AXI4-Stream to Video
  • 3 de "Slice"
  • Constante
  • 2 del temporizador AXI

Paso 27: Ajustes de configuración de IP

Ajustes de configuración de IP
Ajustes de configuración de IP
Ajustes de configuración de IP
Ajustes de configuración de IP
Ajustes de configuración de IP
Ajustes de configuración de IP

Como se muestra en las imágenes

Paso 28: Agregar y configurar el bloque de IP de PS

Agregar y configurar el bloque de IP de PS
Agregar y configurar el bloque de IP de PS
Agregar y configurar el bloque de IP de PS
Agregar y configurar el bloque de IP de PS

Agregue el sistema de procesamiento ZYNQ7 al diagrama de bloques

editar la configuración:

  • Configuración PS-PL

    • HP

      • Habilitar S HP 0
      • Habilitar S HP 1
  • Configuración del reloj

    • Relojes de tela PL

      • FCLK_0 a 100 MHz
      • FCLK_1 a 25 MHz (reloj de salida)
      • FLCK_2 a 35MHz (<= 50MHz) (CameraClock)

Paso 29: Parte 1. Creación de un módulo PWM para servomotores

Saque axi_timer_0 pwm0 al nuevo puerto de salida pwm_Xaxis

Saque axi_timer_1 pwm0 al nuevo puerto de salida pwm_Zaxis

Paso 30: Conexiones laterales de entrada de video (aclk resaltado)

Conexiones laterales de entrada de video (aclk resaltado)
Conexiones laterales de entrada de video (aclk resaltado)

Conecte los bloques de IP del lado de entrada de video correctamente

(* estas conexiones deben crearse seleccionando las opciones correctas durante la automatización de la conexión) "aclk" de axi_stream_capture va a:

  • ap_clk en la escritura del búfer de fotogramas de vídeo
  • ap_clk en el bloque de procesamiento de flujo de video HLS
  • * aclk en AXI smartconnect IP desde la escritura del búfer de fotogramas de video al S_AXI_HP0
  • * aclk correspondiente a los canales de la IP de interconexión AXI para los canales S_AXI del bloque de procesamiento de video HLS y el búfer de cuadro de video escribir S_AXI_HP0_ACLK en el bloque PS

La señal de flujo de video simplemente se conecta en serie desde el bloque de captura a la interfaz de memoria Zynq.

  • El video pasa del bloque de captura al bloque de procesamiento HLS.
  • El video procesado del bloque HLS va al bloque de escritura del búfer de tramas.
  • * El bloque de escritura del búfer de tramas se conecta a la interfaz HP0 en el bloque Zynq PS.
  • La señal m_axis_tuser de la salida del bloque de captura se conecta manualmente tanto a la señal de entrada video_in_TUSER en el bloque de procesamiento HLS como a la señal ap_start en el mismo bloque.

La señal TUSER (tuser) es utilizada por el protocolo de flujo de video AXI para indicar el inicio de un cuadro del video. AP_Start le dice al bloque HLS que comience a procesar. Por lo tanto, estamos usando tuser para activar el bloque HLS para procesar cada cuadro a medida que se procesa. entra. Al conectar una sola señal de un bus y dividirla de esta manera es necesario conectarla también al punto de terminación normal del resto del bus. Vivado asume que si estás conectando la señal manualmente quieres desconectar lo que normalmente se conectaría.

Ajustes de configuración de bloques de IP:

Escritura del búfer de fotogramas de vídeo:

Formatos de video: RGB8

1 muestra por reloj Máximo de columnas: 1280 (> = 640) Máximo de filas: 960 (> = 480) Ancho máximo de datos: 8

Paso 31: Conexiones a OV7670

Conexiones a OV7670
Conexiones a OV7670

En el bloque ov7670_axi_stream_capture

  • Haga que todas las entradas sean externas (haga clic con el botón derecho en un pin y seleccione del menú, o haga clic con el botón izquierdo-> ctrl + T)
  • Deja los nombres como están

En el bloque ov7670_controller

  • Hacer que todas las salidas del bloque sean externas
  • Cambie el nombre del puerto config_finished a led0
  • conecte clk al CameraClock (<= 50MHz) (FCLK_2)

En el bloque antirrebote

  • conecte la entrada button1 a un puerto de entrada externo llamado btn0
  • conecte el out1 a la línea de reenvío en el bloque de IP ov7670_controller
  • conecte la entrada button2 a un puerto de entrada externo llamado btn3
  • conecte el out2n a la entrada ext_reset_in en la IP de reinicio del sistema del procesador para el dominio del reloj de captura de video. (* Es posible que deba hacer esto después de que se genere esa IP *)
  • conecte clk al CameraClock (<= 50MHz) (FCLK_2)

Paso 32: Conexiones en el lado de salida de video

Conexiones en el lado de salida de video
Conexiones en el lado de salida de video
Conexiones en el lado de salida de video
Conexiones en el lado de salida de video
Conexiones en el lado de salida de video
Conexiones en el lado de salida de video
Conexiones en el lado de salida de video
Conexiones en el lado de salida de video

Conexiones para bloques Video Timing Controller (VTC), AXI4-Stream to Video Out y cortes

  • Utilice un reloj de 25 MHz (FCLK_1) para vid_io_out_clk y VTC clk
  • Use un reloj de 100MHz (FCLK_0) para aclk en AXI4-Stream to Video Out
  • vtiming_out a vtiming_in
  • Lectura del búfer de fotogramas de video m_axis_video va a AXI4-Stream to Video Out video_in
  • vtg_ce va a gen_clken
  • Ate VTC clken, aclken, vid_io_out_ce a Constant dout [0: 0]
  • Lleve vid_hsync y vid_vsync a los puertos de salida externos vga_hs y vga_vs, respectivamente. (no en la foto)

Rebanadas:

  • Las rebanadas deben configurarse como se muestra en las imágenes adjuntas.

    • cambiar el nombre de los bloques a slice_red, slice_green y slice_blue
    • configurar rangos de corte como se muestra en las imágenes por el nombre del bloque
    • conecte cada salida de segmento a una salida de puerto externo como se muestra en la imagen.
  • vid_data [23: 0] se conecta a las entradas para cada segmento (Din [23: 0])

Paso 33: Ejecute la automatización de bloques y conexiones

Ejecutar automatización de bloques y conexiones
Ejecutar automatización de bloques y conexiones
Ejecutar automatización de bloques y conexiones
Ejecutar automatización de bloques y conexiones
Ejecutar automatización de bloques y conexiones
Ejecutar automatización de bloques y conexiones

Ejecute Block Automation para conectar las cosas del bloque ZYNQ7 PS. Como se muestra en la imagen.

Ejecute la automatización de conexión para crear todas las IP de interconexión. Preste mucha atención a todas las opciones en cada imagen.

En el bloque antirrebote, conecte out2n al dominio de reloj de captura de video. Procesador. Reinicio del sistema. Entrada ext_reset_in.

Paso 34: Genere el contenedor HDL

Generar envoltura HDL
Generar envoltura HDL

Genere la envoltura HDL para el diseño de su bloque.

Configúrelo como el módulo superior.

Paso 35: Genere Bitstream, exporte hardware a SDK, inicie SDK desde Vivado

Asegúrese de incluir bitstream en la exportación.

La generación de flujo de bits puede llevar mucho tiempo.

Luego inicie SDK

Paso 36: SDK (sin FreeRTOS)

SDK (sin FreeRTOS)
SDK (sin FreeRTOS)

Esta versión hace todo sin usar FreeRTOS, condensando el código muy bien.

Cree un BSP independiente basado en el diseño del hardware. Las opciones predeterminadas deberían estar bien. Asegúrese de que se hayan generado fuentes BSP.

Cree la aplicación como se muestra en la imagen. (aplicación vacía)

Elimine el archivo principal generado automáticamente e importe los archivos adjuntos.

Paso 37: Implementación de FreeRTOS

Implementación de FreeRTOS
Implementación de FreeRTOS

Esta versión utiliza FreeRTOS. Cree un BSP FreeRTOS901 basado en el diseño del hardware. Las opciones predeterminadas deberían estar bien. Asegúrese de que se hayan generado fuentes BSP.

Cree la aplicación como se muestra en la imagen. (aplicación vacía)

Elimine el archivo principal generado automáticamente e importe los archivos adjuntos.

Paso 38: Instrucciones de uso

Este proyecto es un poco complicado de poner en marcha. Siga los pasos en orden.

Asegúrese de que su ZYBO no se cargue automáticamente cuando se encienda. Esto significa que el LED Done no debería encenderse. Una forma de hacerlo es configurar el puente de origen de inicio en JTAG.

Abra el proyecto (FreeRTOS o no) que desea programar desde SDK

  1. Encienda su ZYBO. El LED Done no debería encenderse.
  2. Programe la FPGA con el archivo de bits. El LED Done debería encenderse. Led0 no debe encenderse.
  3. Ejecute el código (recuerde pasar el punto de interrupción de inicio si está haciendo eso).

En este punto, debería obtener una salida en su pantalla VGA.

Para reiniciar (si falla o lo que sea): toque rápidamente el botón PS-SRST o apague el ZYBO y vuelva a encenderlo. Continúe desde el paso 2.

Detener el procesador con el depurador hará que la cámara se mantenga en posición en lugar de moverse. La transmisión de video continuará de todos modos.

Paso 39: referencias y enlaces

Guías de referencia y documentación de Xilinx:

  • PG044 - AXI-Stream a salida de video
  • PG278 - Lectura / escritura del búfer de fotogramas de video

Otros enlaces:

  • Blog de Lauri - entrada VDMA
  • Blog de Lauri: salida OV7670 a VGA usando BRAM
  • Wiki de Hamsterworks, por Mike Fields, la fuente original del código OV7670
  • Hoja de datos que muestra las especificaciones básicas de sincronización

Recomendado: