Tabla de contenido:
- 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
- Paso 3: Crear un módulo PWM: crear un archivo de proyecto
- Paso 4: Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (I)
- Paso 5: Creación de un módulo PWM: diseño de bloques y configuración de archivos de restricciones (II)
- Paso 6: Creación de un módulo PWM: configuración de archivos de restricción y diseño de bloques (III)
- Paso 7: Creación de un módulo PWM: diseño de bloques y configuración de archivos de restricciones (IV)
- Paso 8: Creación de un módulo PWM: configuración de archivo de restricción y diseño de bloques (V)
- Paso 9: Creación de un módulo PWM: instalación de hardware
- Paso 10: Creación de un módulo PWM: genere Bitstream y ejecute SDK
- Paso 11: Creación de un módulo PWM: cree una nueva aplicación en Xilinx SDK
- Paso 12: Creación de un módulo PWM: descripción general del Explorador de proyectos (I)
- Paso 13: Creación de un módulo PWM: descripción general del Explorador de proyectos (II)
- Paso 14: Creación de un módulo PWM: descripción general del Explorador de proyectos (III)
- Paso 15: Creación de un módulo PWM: función de resumen de PWM (I)
- Paso 16: Creación de un módulo PWM: función de resumen de PWM (II)
- Paso 17: Creación de un módulo PWM: función de resumen de PWM (III)
- Paso 18: Creación de un módulo PWM: ¡hágalo funcionar
- Paso 19: Procesamiento de transmisión de video en Digilent ZYBO con OV7670
- Paso 20: diagrama de bloques completo
- Paso 21: Conecte el OV7670 al ZYBO
- Paso 22: Crear diseño de bloque
- Paso 23: agregue archivos VHDL para el control y la captura de la cámara OV7670
- Paso 24: Agregar archivo de restricciones
- Paso 25: Agregar IP Repo para HLS IP
- Paso 26: agregue módulos e IP
- Paso 27: Ajustes de configuración de IP
- Paso 28: Agregar y configurar el bloque de IP de PS
- Paso 29: Parte 1. Creación de un módulo PWM para servomotores
- Paso 30: Conexiones laterales de entrada de video (aclk resaltado)
- Paso 31: Conexiones a OV7670
- Paso 32: Conexiones en el lado de salida de video
- Paso 33: Ejecute la automatización de bloques y conexiones
- Paso 34: Genere el contenedor HDL
- Paso 35: Genere Bitstream, exporte hardware a SDK, inicie SDK desde Vivado
- Paso 36: SDK (sin FreeRTOS)
- Paso 37: Implementación de FreeRTOS
- Paso 38: Instrucciones de uso
- Paso 39: referencias y enlaces
Video: Cámara ZYBO OV7670 con control de giro / inclinación: 39 pasos (con imágenes)
2024 Autor: John Day | [email protected]. Última modificación: 2024-01-30 08:44
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
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
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)
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)
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)
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)
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)
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
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
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)
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)
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)
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)
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)
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)
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
Esto muestra el diagrama completo de todas las conexiones y bloques de IP en el proyecto.
Paso 21: 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
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
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
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
Como se muestra en las imágenes
Paso 28: 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)
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
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 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
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
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)
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
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
- Encienda su ZYBO. El LED Done no debería encenderse.
- Programe la FPGA con el archivo de bits. El LED Done debería encenderse. Led0 no debe encenderse.
- 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:
Tricóptero con motor de inclinación frontal: 5 pasos (con imágenes)
Tricóptero con motor de inclinación frontal: ¿Entonces este es un pequeño experimento, que con suerte conducirá a un tricóptero / girocóptero híbrido? Así que no hay nada realmente nuevo en este tricóptero, es básicamente lo mismo que mi tricóptero normal como se muestra en este instructivo. Sin embargo ha sido largo
Manténgase seguro con este Bikelight con señales de giro: 5 pasos (con imágenes)
Manténgase seguro usando este Bikelight con señales de giro: Me encanta andar en bicicleta, por lo general la uso para ir a la escuela. En invierno, la mayoría de las veces todavía está oscuro afuera y es difícil para otros vehículos ver las señales de giro de mi mano. Por lo tanto, es un gran peligro porque es posible que los camiones no vean lo que quiero
Mecanismo de giro e inclinación para lapsos de tiempo de DSLR: 7 pasos (con imágenes)
Mecanismo de giro e inclinación para lapsos de tiempo de DSLR: tenía algunos motores paso a paso por ahí y realmente quería usarlos para hacer algo genial. Decidí que haría un sistema Pan and Tilt para mi cámara DSLR para poder crear lapsos de tiempo geniales. Elementos que necesitará: 2x motores paso a paso -htt
Cabezal de giro e inclinación con control remoto: 7 pasos
Cabezal de giro e inclinación con control remoto: siempre quise un cabezal de giro e inclinación con control remoto. Tal vez fue por mi cámara de video, un tirador de goma o un apuntador de pistola de agua. Realmente no importa lo que pongas en la cubierta superior (siempre que no sea demasiado pesado), con este pequeño proyecto yo
Luz trasera de bicicleta con un giro: 9 pasos (con imágenes)
Luz trasera de bicicleta con un giro: seamos realistas. Las luces traseras son aburridas. En el mejor de los casos, hacen 'parpadear, parpadear, mírame! Estoy parpadeando - woohoo 'todo el tiempo. Y siempre son rojos. Muy creativo. Podemos hacerlo mejor que eso, tal vez no mucho, pero aún mejor que simplemente "parpadear, parpadear". Era