Pantalla VGA de video de cámara ov7670 basada en FPGA (incluida SDRAM)

Introducción al marco: Los datos recopilados de la cámara primero ingresarán a un búfer FIFO de escritura, luego escribirán en SDRAM, leerán los datos de SDRAM, primero se colocarán en un búfer FIFO de lectura y finalmente se enviarán a la pantalla del controlador VGA para su visualización.

Composición del módulo:
Inserte la descripción de la imagen aquí

El único equipo utilizado aquí fue el módulo de cámara OV7670 y una placa con el modelo EP4CE10F17C8, pero la pantalla VGA de esta placa se quemó.Finalmente, se agregó una placa 5CEBA4F23C7 y las dos placas utilizaron juegos de cables DuPont. Conectados juntos para completar la función de todo el sistema de video, el segundo Allegro solo se usa como una pantalla VGA, mientras que SDRAM, módulo de control de lectura y escritura y búfer de datos FIFO, etc. se implementan en la primera placa.
Equipo de hardware: dos placas de desarrollo y un módulo de cámara

Inserte la descripción de la imagen aquí

Introduzcamos las funciones implementadas por cada módulo en la estructura del diagrama de bloques anterior, respectivamente.

Antes de hablar sobre el módulo de adquisición de datos, en realidad aquí se omite una parte, es decir, la configuración de la cámara. Si una cámara quiere funcionar normalmente o cambiar su modo de trabajo, es necesario configurarla y se puede cambiar el valor del registro de modo. Ponlo en diferentes modos de trabajo. Hay dos formas de configurar el módulo de la cámara. La común se puede configurar a través del bus IIC o los nios soft core. La primera es más común y práctica. El tiempo de la configuración IIC no se ampliará aquí en vista de la longitud (el código será posterior Servidos juntos). Este proceso de configuración se puede entender simplemente como, IIC tiene un bus de datos bidireccional sda, sda primero escribe algunos datos en el registro de modo del sensor de la cámara, le dice a la cámara cómo trabajar, por lo que la configuración de la cámara finaliza y comienza a transmitir a la FPGA Datos.
Luego llegamos a nuestro módulo de adquisición de datos a continuación. La función principal de este módulo es convertir el flujo de datos de 8 bits del sensor de la cámara en un flujo de datos de 16 bits. Aquí el controlador VGA usa el formato de datos RGB565, por lo que los datos del sensor Convertido en un flujo de datos de 16 bits.
El siguiente es nuestro módulo de control de escritura. Cómo escribir este módulo depende de cómo escribe su controlador SDRAM. Aquí mi controlador SDRAM lo requiere. Cada vez que desee escribir datos en SDRAM, primero debe generar un Señal cero. Esta señal tiene dos funciones. La primera es borrar la FIFO de escritura antes de escribir datos en la SDRAM para evitar que los datos residuales en la FIFO afecten a los datos subsiguientes. La segunda es dar la dirección inicial de la SDRAM de escritura al controlador SDRAM. Esto puede entenderse simplemente como si desea escribir datos en la SDRAM, debe decirle en qué dirección de la SDRAM se escriben estos datos, y la última es la señal de dirección máxima, esta señal determina la cantidad máxima de datos que su SDRAM puede escribir Cuando se excede este valor, los datos que ingresen posteriormente a la SDRAM se escribirán desde la dirección de inicio que dio, sobrescribiendo los datos anteriores. Después de entender esto, salió nuestro módulo de control de escritura, además de la señal clara anterior, la dirección de inicio, la dirección máxima y el flujo de datos de 16 bits que recibimos del módulo de adquisición de datos y la línea sincronizada con los datos. Letra de sincronización hs_sync.

Luego, nuestro flujo de datos de 16 bits fluye al puerto de escritura del FIFO de escritura. Hay un punto que vale la pena señalar aquí. Es mejor usar FIFO asíncrono aquí, porque el extremo frontal del FIFO es el módulo de control de escritura y el extremo posterior es el módulo controlador SDRAM. Estos dos módulos son muy Puede estar en diferentes dominios de reloj. FIFO asíncrono puede tener un buen efecto de almacenamiento en búfer. Al mismo tiempo, el reloj de lectura es mejor que el reloj de escritura, por lo que la velocidad de lectura es más rápida y la escritura más lenta puede evitar que se llene la FIFO.
Luego viene el módulo controlador SDRAM. Originalmente, el principio de sincronización SDRAM es un tema muy largo. Aquí elegiré algunos puntos clave. El primer paso para escribir este controlador es la inicialización de SDRAM. El principio de almacenamiento de datos SDRAM es la capacitancia. El capacitor está cargado y descargado, y el capacitor tiene un período de tiempo desde el encendido hasta su operación estable. Por lo tanto, SDRAM tiene un proceso de inicialización de encendido. Todos los comandos de control de lectura y escritura, escritura o lectura de datos solo pueden ser Una vez completada la inicialización. El proceso de inicialización debe completar tales cosas, abrir todas las direcciones de banco y todas las direcciones de fila para la precarga, configurar el registro de modo, generalmente los tres bits inferiores son para establecer la longitud de ráfaga, puede seleccionar lectura y escritura de ráfaga de un solo byte, y viceversa La longitud de la ráfaga es 2, 4, 8, y también puede seleccionar lectura y escritura de página (lectura y escritura de página es lectura y escritura de línea), es decir, se lee y escribe una línea de datos a la vez. Aquí hay una breve charla sobre el modo de almacenamiento de SDRAM. SDRAM puede entenderse simplemente como varias páginas de papel. Cada página es un banco. Generalmente, SDARM tiene 4 bancos, por lo que, naturalmente, lo que llamamos dirección de fila y dirección de columna es como nosotros Qué fila y columna en una página de papel. Después de hablar sobre el modo de almacenamiento de SDRAM, hablemos brevemente sobre las líneas más importantes de SDRAM, incluido el bus de datos, el bus de direcciones, el bus de banco (generalmente dos bits, porque solo hay 4 bancos), la señal de selección de chip (la señal cs_n baja es válida, lo que indica Este chip está seleccionado), cke (la señal de habilitación del reloj se puede procesar simplemente para que se eleve después de la señal de reinicio), ras_n (dirección de fila estroboscópica, no importa leer o escribir, debo saber su ubicación específica en SDRAM), cas_n (dirección de columna estroboscópica, el mismo entendimiento), y finalmente hay un dqm, una máscara de datos de dos dígitos, que se usa para proteger algunos datos que no nos importan, aquí uso directamente 2'b00. También hay una señal que a menudo se llama bus de comandos, que en realidad combina {cs_n, ras_n, cas_n, we_n} Las cuatro señales de selección de chip, luz estroboscópica de fila, luz estroboscópica de columna y habilitación de escritura se combinan para emitir diferentes comandos. Los comandos de uso común incluyen no operación (NOP) y activación (es decir, dirección de banco de luz estroboscópica y dirección de fila) , Operación de lectura, operación de escritura. Después de comprenderlos, es relativamente sencillo observar el tiempo de lectura y escritura de SDRAM. Primero, necesitamos escribir datos en SDRAM. Luego, primero debemos informar a SDRAM a través del bus de comandos. La situación real es generalmente así. Se emite una solicitud de escritura externa. Luego se activa SDRAM, que consiste en seleccionar el banco y la dirección de fila (los dos en realidad están estropeados juntos), luego estropear la dirección de la columna y luego emitir el comando de escritura, y luego podemos ver la longitud de la ráfaga en el bus de datos Los datos básicos de la unidad. Asimismo, el principio de lectura de SDRAM es el mismo, cabe señalar que debido a las características eléctricas del dispositivo, existe un período de latencia entre el momento en que se emite un comando y el momento en que se ejecuta el comando. Después de hablar sobre estos conceptos básicos y la sincronización de las operaciones de lectura y escritura, se utiliza una máquina de estado grande en el nivel superior para controlar la programación de los tres estados de lectura, escritura y actualización de SDRAM. Este es un complemento al concepto de actualización. Como se mencionó anteriormente, SDRAM usa capacitores para almacenar datos. Sabemos que los capacitores continuarán perdiendo energía. Por lo tanto, para mantener los datos en SDRAM sin cambios, necesitamos cargar SDRAM regularmente para mantener Los datos permanecen sin cambios y el manual de cada dispositivo tiene instrucciones sobre la frecuencia con la que se actualiza.
Hay mucho conocimiento sobre el control de SDRAM. Lo anterior es solo una explicación simple basada en mi comprensión personal. Debe haber muchas omisiones. No es una cuestión simple ajustar bien una SDRAM y estabilizarla.
Volviendo a nuestro diagrama de marco, en este proyecto, nuestra solicitud de escritura SDRAM es escribir datos legibles FIFO mayores que 8 (la longitud de ráfaga de este proyecto es 8), es decir, siempre que el número que se puede leer en la escritura FIFO sea mayor que 8. Continuará escribiendo datos en la SDRAM, más el reloj de lectura de este FIFO. Lo configuré para que sea más rápido que el reloj de escritura, por lo que este FIFO definitivamente no estará lleno. Lo mismo ocurre con el lado de lectura FIFO, donde los datos grabables son menos de 128, así que continúo escribiendo datos en el FIFO de lectura a través de SDRAM.
El siguiente paso es el último módulo de nuestro proyecto, el módulo VGA. Este módulo es muy simple. Para controlar VGA, solo necesitamos cuatro señales hs_sync (señal de sincronización de cuadro),
vs_sync (señal de sincronización de campo), datos de datos (RGB565) y reloj de la unidad. Porque mi placa es especial ( El DAC puede estar integrado internamente, lo que convierte directamente la señal digital en una señal analógica y la envía a la pantalla VGA), y puede controlar el VGA sin un reloj de control, por lo que la última parte del código no genera clk para el VGA. Solo necesitamos usar la señal hs_sync como la habilitación de lectura de la lectura FIFO para obtener los datos y enviarlos al VGA (la hs_sync y los datos que hice aquí están estrictamente alineados, por lo que se puede usar directamente como habilitación de lectura, si su hs_sync contiene espacios en blanco Part, entonces puede generar directamente una señal válida de datos como una habilitación de lectura)

Visualización de vídeo
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/jiyishizhe/article/details/102985551
Recomendado
Clasificación