for more visit: www.fpgalover.com
If you like my FREE FPGA tutorials, buy me a coffee, or a biscuit or whatever you like.
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(Use IP Catalog para agregar el PLL y llamelo pll_vga).
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" y solucion plantilla.
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:
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)
En base a la información http://tinyvga.com/vga-timing.
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.
En base al archivo "mi_vga.v" modifiquelo para crear un sincronizador VGA(WUXGA) de 1920x1440 a 60Hz teniendo en cuenta la información http://tinyvga.com/vga-timing/1920x1440@60Hz.
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.
for more visit: www.fpgalover.com
If you like my FREE FPGA tutorials, buy me a coffee, or a biscuit or whatever you like.