domingo, 24 de mayo de 2009

Bloque sincronismo interfaz VGA

Empezaremos por la definición de las constantes. Como ya explicamos en los fundamentos de funcionamiento del monitor VGA, tanto la línea horizontal como la vertical se dividen en 4 zonas: zona activa, pórtico anterior, retorno y pórtico posterior. Cada una ocupa un número determinado de los 800 píxeles que contiene cada línea horizontal y de las 520 líneas (cambiamos este valor de 525 a 520 para que la tasa de píxel fuera exactamente 25 MHz) que contiene cada línea vertical. Por tanto, lo primero que hacemos es definir estas constantes.


constant HD: integer:=640; --h.datos
constant HF: integer:=16; --h.pórtico_anterior
constant HB: integer:=48; --h.pórtico_posterior
constant HR: integer:=96; --h.retorno
constant VD: integer:=480; --v.datos
constant VF: integer:=9; -- v.pórtico_anterior
constant VB: integer:=29; -- v.pórtico_posterior
constant VR: integer:=2; -- v.retorno

Nuestro siguiente paso será generar el reloj de píxel, y lo haremos a partir de impulsos del reloj del sistema. Como el reloj general es de 100 MHz y el de 25 MHz, en lugar de implementar un reloj independiente (solución que obviamente deteriora el sincrionismo o lo dificulta), modelamos un contador módulo cuatro, de forma que generaremos una señal que permanezca a nivel alto o bajo cuatro ciclos del reloj del sistema.

En cuanto a la construcción de las líneas de sincronismo, partiremos en el momento en que ambas señales se ponen a nivel alto (píxel 751 y línea 491). Por tanto, en este punto las señales de pixel_x y pixel_y tomarán estos valores, mientras que las señales sinc_hor y sinc_ver pasan de nivel bajo al alto. Esta será la situación a la que se vuelve tras pulsar un RESET.





A continuación, iremos incrementando los valores de pixel_x en cada flanco ascendente del reloj de pixel y de pixel_y cada vez que pixel_x llega a 799 (en este caso en vez de incrementarse se pone de nuevo a cero). Por su parte, pixel_y ser reinicia a cero cuando está en el valor 519 y debe actualizarse. Cuando pixel_x llegue a 655 (todos estos valores están controlados en el código por las constantes, para poder cambiarlas sin cambiar el código), se cambia sinc_hor a nivel bajo. Si todo ha ido bien, el tiempo que habrá transcurrido desde que sinc_hor se puso a nivel alto serán 28.16 us.








Del mismo modo, la señal volverá a activarse cuando pixel_x llegue de nuevo a 751, debiendo haber transcurrido un tiempo a nivel bajo de 3,84 us (tiempo total de una línea 28.16 + 3.18 = 32 us = 800/25 MHz.





De la misma forma, la bajada de sinc_ver se produce cuando pixel_y alcanza el valor 489, estando a nivel alto durante 16.736 ms.








Subirá de nuevo cuando pixel_y valga 491, habiendo transcurrido 0.064 ms mientras estaba a nivel bajo (tiempo de un barrido de pantalla 16.576 + 0.064 = 16.64 ms = 800*520 / 25 MHz.






De esta forma se consiguen las señales de sincronismo necesarias para el monitor. La señal de activo se pone a 1 solo cuando pixel_x está entre 0 y 639 y pixel_y está entre 0 y 479 (ambas condiciones a la vez).

No hay comentarios:

Publicar un comentario