Video Sync

for more visit: www.fpgalover.com

If you like my FREE FPGA tutorials, buy me a coffee, or a biscuit or whatever you like.

Written by: Holguer A Becerra

Nota: Esta practica fue realizada basada en la plataforma DE0-NANO, en este caso usted usara la plataforma DE2-115 y debera adaptarla a esta

En esta practica vamos a construir un sincronizador de Video VGA (Video Graphics Array), para esto debemos entender como funciona y de esta forma llegar un modulo en verilog que sea capaz de controlar un monitor con entrada tipo VGA.

Siga las instrucciones paso a paso:

  • Primero se debe identificar, para esto vamos a ver la siguiente figura en donde usted entenderá como se conecta una FPGA a un conector VGA usando solo resistencias.

En la Fig 1, tenemos el conector VGA “HD-DB15” con una serie de conexiones que van directamente hacia la una FPGA por medio de resistencias de precisión de diferentes calibres.

El pin 1, 2, 3 corresponden al conjunto de colores que podemos enviar a la pantalla, en este caso RGB, por cada componente tenemos un 4 bits de resolución, lo que nos da 16 colores diferentes por color, dándonos una diversa serie de combinación de colores si juntamos las 3 componentes R,G y B.

En la conexión, la conexión de colores no son lo mas importante que debemos ver, hay dos pines llamados VGA_VSYNC y VGA_ HSYNC, estos dos se encargan de sincronizar cada pixel de imagen que mandemos hacia la pantalla, estos son los encargados de decirle a la pantalla en que posición de esta vamos a dibujar, con estos 2 pines nos dispondremos ha entender el modulo VGA que implementaremos en este manual.

    • Ahora como se entiende la conexión al puerto VGA se debe pasar a entender como actúan las señales de VGA_VSYNC y VGA_H_SYNC para lograr sincronizar la pantalla VGA.

la entrada al puerto VGA tiene una sincronización Horizontal(H_sync) se encarga de indicarle a la pantalla que se ha terminado de enviar una linea horizontal completa a la pantalla y una sincronización Veritical indicarle a la pantalla que ha terminado de enviar a la pantalla un frame de video de un alto determinado(V_sync), en las figuras siguientes se puede ver en detalle el comportamiento de estas señales (Gráficas del libro de PONG CHU cap 13).

    • La pregunta ahora es como calcular el reloj que controle el modulo de sincronización VGA, en el caso de las figuras anteriores se tiene la descripción de las señales de un modulo de 680x480 pixeles a una tasa de 60Hz, esto quiere decir que se esta sincronizando la pantalla VGA para enviar una imagen de tamaño 640x480 cada 1/60 segundos(Vea que el H_SYNC se mantiene en alto por un tiempo 640 flancos de reloj despues de un left border y antes de un retrace).

      • Observe que es el Retrace, Right Porch, Top Border... etc...

    • Los cálculos para saber cual es el reloj que debemos utilizar para crear este tipo de sincronización teniendo en cuenta que lo único que se tendrán en el diseño serán simples contadores y comparadores que generan H_SYNC y V_SYNC de acuerdo a las zonas que se muestran en la figura 13.4 y 13.5 del libro de PONG CHU.

    • Los cálculos que se hicieron en con la formula anterior dicen que para diseñar un sicronizador VGA basado en contadores se debe usar un reloj de 25MHz.

    • Haga los cálculos para las siguientes resoluciones para ver si Pixel Clock coincide con los calculos.

    • Puede encontrar otras resoluciones en http://tinyvga.com/vga-timing.

    • Ahora empecemos con el diseño del modulo de sincronización VGA, cree en Verilog un modulo llamado "mi_vga" con las siguientes entradas y salidas.

      • CLK==> 1 bit entrada.

      • h_sync==> 1 bit salida.

      • v_sync==> 1 bit salida.

      • video_on ==> 1 bit salida

      • pixel_x ==> configurable a N bits de salida.

      • pixel_y ==> configurable a N bits de salida.

    • Dentro del modulo declare un contador de N bits llamado "counter_x" y otro llamado "counter_y".

    • ahora declare los los parámetros locales siguientes en el modulo

    • ahora añada a la descripción un logica secuencial que modifique el "counter_x" y "counter_y", para que cada vez que counter_x llegue a un valor máximo de (HD+HF+HB+HR-1) haga que "counter_y" incremente 1 y "counter_x" se reinicie en 0, y que si en el caso de "counter_y" llegue al máximo (VD+VF+VB+VR-1) se reinicie en 0.

    • Ahora añada un registro que se llame h_sync_reg y otro que se llame v_sync_reg y cree una lógica como la siguiente.

    • Ahora instancia el chip en la plantilla principal para probarlo de la siguiente manera, agregue al diseño un PLL que en base del CLOCK_50 genere una frecuencia de salida con respecto a la formula de sincronización VGA que dice PONG CHU, es mejor usar un PLL en vez de dividir el reloj con un divisor de frecuencia para que de esta forma se mantenga la FASE del sincronizador VGA, lo cual es algo muy importante.

    • Haga un circuito que aparece en la Fig 1 al inicio de esta practica y conéctelo de acuerdo a la descripción realizada en el Top Module, luego genere el archivo .SOF y programe la FPGA, si todo va bien la pantalla deberá iluminar toda en ROJO.

      • Solución modulo "mi_vga.v"

    • Ahora agregue/modifique la siguiente descripción al circuito principal y responda:

      • ¿Que aparece en la pantalla?

    • Ahora agregue/modifique la siguiente descripción al circuito principal y responda:

      • ¿Que aparece en la pantalla y por qué?

    • Ahora vamos agregar una imagen al diseño, para esto debemos descargar el siguiente script en matlab que convertirá una imagen de formato BMP-24 a formato MIF(Memory Initialization File).

    • Descargue la siguiente imagen que esta en formato BMP-24 y contiene la imagen de una figura de acción, y utilice el script en maltab para convertirla a formato "image.mif".

    • Abra el archivo .mif y verifique que este de la siguiente forma

    • Copie el Archivo "image.mif" a la carpeta de la plantilla.

    • En el proyecto Quartus vaya al megawizard y cree una memoria ROM de 12 bits "WIDTH" y de tamaño "8200" words "DETPH" e tome a "imagen.mif" como el archivo de inicialización de la memoria ROM y por ultimo genere la memoria ROM.

    • Ahora instancie la ROM en el top de la plantilla principal de la siguiente manera, sin modificar lo que ya hizo anteriormente, si lo hace bien deberá aparecer la imagen que se convirtió con el script en matlab en la pantalla (Solución con imagen).

      • Analice el script en matlab y el código verilog.

      • llegue a sus conclusiones.

    • Ahora convierta la siguiente imagen "render.bmp" a formato .mif y modifique la memoria ROM de acuerdo al archivo MIF generado, y modifique la descripción de hardware para que se vea como lo siguiente(Solución .sof).

    • Ahora modifique la descripción de hardware para crear una pequeña animación con la imagen "render" que tenemos guardada en memoria.

si lo hizo de manera correcta deberá aparecer una animación(solución) en la pantalla en base a la imagen "render" que esta guardada en la memoria ROM, ahora entienda la lógica del circuito y modifique para que el CHAN(Muñeco) se mueva en la pantalla como lo hace la caja azul(blue box).

Modificando la descripción de la siguiente forma obtendra el movimiento y agregara un efecto de alpha_blending a la imagen variando los SW[3:0] (Solución con movimiento).

La transparencia se logra gracias a la siguiente formula de alpha blending, donde LayerA es la capa superior que se quiere mezclar con LayerB que seria la capa inferior y done LayerAlpha seria el nivel de transparencia de la capa A sobre la capa B.

    • Analice y entienda la descripción y haga cambios sobre ella.

Plantilla de Solución Final(Solo para guiarse) a esto deberá llegar el final de esta practica.

Ahora:

  • En base al archivo "mi_vga.v" modifiquelo para crear un sincronizador VGA(WXGA) de 1280x800 a 60Hz teniendo en cuenta la siguiente información (solución)

General timing

Screen refresh rate

Vertical refresh

Pixel freq.

60 Hz

49.678571428571 kHz

83.46 MHz

Horizontal timing (line)

Polarity of horizontal sync pulse is negative.

Vertical timing (frame)

Polarity of vertical sync pulse is positive.

  • En base al archivo "mi_vga.v" modifiquelo para crear un sincronizador VGA(SXGA) de 1280x1024 a 60Hz teniendo en cuenta la siguiente información

General timing

Screen refresh rate

Vertical refresh

Pixel freq.

60 Hz

63.981042654028 kHz

108.0 MHz

Horizontal timing (line)

Polarity of horizontal sync pulse is negative.

Vertical timing (frame)

Polarity of vertical sync pulse is positive.

  • En base al archivo "mi_vga.v" modifiquelo para crear un sincronizador VGA(WUXGA) de 1920x1200 a 60Hz teniendo en cuenta la siguiente información

General timing

Screen refresh rate

Vertical refresh

Pixel freq.

60 Hz

74.521604938272 kHz

193.16 MHz

Horizontal timing (line)

Polarity of horizontal sync pulse is negative.

Vertical timing (frame)

Polarity of vertical sync pulse is positive.

  1. Ahora cree un modulo que se pueda configurar en tiempo real mientras esta sobre la DE0-NANO que le brinde al usuario todas las resoluciones posibles disponibles utilizando el mismo modulo de sincronización.

EXTRA BONUS:

  • Descargue lo siguiente es el juego BreakOut basado en el juego de PONG CHU funcionando en la DE0-NANO, y pruebe jugando con el KEY[1:0].

    • Descargue una pequeña versión de Mario, para la DE0-NANO.

    • Descargue los Sources de una paqueña animación en base a esta practica.

for more visit: www.fpgalover.com

If you like my FREE FPGA tutorials, buy me a coffee, or a biscuit or whatever you like.