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).
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario