PRUEBAS DE VGAA todo aquel que pueda participar (poseedor de un prototipo V2 del ZX-Uno, con alguna de las dos plaquitas para VGA que se enchufan en el conector RGB/JTAG, y por supuesto, una interfaz JTAG de Xilinx).
Hay disponible en el repositorio, carpeta
cores/spectrum_v2_spartan6/vgatest1 un
core experimental para probar la VGA.
Esto
NO es un core de Spectrum. Lo único que hace este core es sacar una imagen estilo carta de ajuste en la salida VGA. No sacará nada visible en RGB o video compuesto.
Este core funciona incluso aunque no haya buena conexión entre la memoria RAM y la FPGA. De hecho sólo usa recursos internos de la FPGA.
El core funciona de la siguiente forma: una vez cargado, muestra una imagen muy similar a ésta:

La única diferencia visible entre la imagen que obtendreis y la que he puesto en la foto es que la vuestra mostrará 8 tonos de azul, en lugar de 4.
La imagen en realidad se compone de un fondo amarillo que ocupa, o debe ocupar, la totalidad del espacio destinado a la imagen en la pantalla. Esto son 800x600 puntos. Centrado en ese cuadro amarillo hay un marco de color magenta. El marco ocupa 704x576 puntos, y es ahí donde realmente estará la pantalla total del Spectrum (en el core de Spectrum, el fondo amarillo será negro).
Dependiendo de cómo funcione el autoajuste en vuestro monitor, es posible que veais las franjas amarillas arriba y abajo, pero no a izquierda y derecha, o viceversa.
Inscrito en el marco magenta (que tiene el mismo tamaño que el borde estándar del Spectrum) hay un gráfico de gradiente mostrando los tres colores primarios en sus 8 tonalidades. El core también vale para comprobar que se muestran correctamente. Este gráfico de gradiente ocupa 512x384 píxeles, que es la resolución con la que trabajaremos en el scandoubler.
Este gráfico puede visualizarse a varias frecuencias de refresco, seleccionables con el teclado, usando las teclas del 1 al 8 (fila superior del teclado alfabético). Las frecuencias de refresco vertical asociadas a cada tecla son:
1. 50Hz, timming 48K
2. 50,9Hz, timming 128K
3. 52Hz, timmings 48/128K
4. 55Hz, timmings 48/128K
5. 60Hz, timmings 48/128K <-- con esta configuración arranca el core
6. 65Hz, timmings 48/128K
7. 70Hz, timmings 48/128K
8. 75Hz, timmings 48/128K
La frecuencia de refresco horizontal en cada caso se calcula fácilmente multiplicando la frecuencia de refresco vertical por 0,625. El resultado está en kHz. Estos datos sirven para que podais comprobar, manual del monitor en mano, qué modos de pantalla se espera que funcionen y cuáles no.
En caso de que vuestra pantalla no acepte alguno de estos modos, hay dos formas de comprobar que el core sigue funcionando:
- Cada vez que se pulsa una tecla, el led de actividad luce. Cuando se suelta, se apaga.
- Por la salida de sonido suena un tono que depende de la tecla pulsada. Este tono no es más que una versión dividida de la frecuencia patrón que se está generando. Cuanto mayor es el número elegido, más agudo es el tono.
Lo que pido que comprobeis es:
- Para todos los monitores VGA que tengais a vuestro alcance (monitores de ordenador, televisores con entrada VGA, conversores de VGA a HDMI, proyectores, etc), mirad qué modos dan imagen y cuáles dan error. De los que den imagen, probad cuáles de ellos necesitan ajuste de la posición de la pantalla, cuáles de ellos aun ajustando la posición no se ven centrados, etc.
- El generador de reloj usa ahora el nuevo PLL de la Spartan 6. Esto significa que en el interior de la FPGA, y en un pequeño espacio de ésta, se generan frecuencias del orden de los 1,5GHz. Si al seleccionar alguno de los modos de pantalla el core deja de funcionar, o deja de responder el teclado y el sonido comienza a oirse como con "gallos", significa que el PLL está recibiendo demasiado ruido y no es capaz de mantener adecuadamente esa frecuencia. En ese caso, probad con algún otro tipo de fuente de alimentación para el ZX-Uno. También notareis algo que no ocurría hasta ahora en el clon: que la FPGA se calienta un poquito.
- El driver de teclado lo estoy rediseñando, para dar cabida al modo bidireccional, desde el que el host (ZX-Uno) podrá enviar comandos al teclado. En este mismo core incluiré por primera vez esos cambios (aún no están), así que cuando estén, os pediré que probeis el core con teclados USB con el adaptador sencillito éste para pasar de USB a PS/2 ya que esos deberían ya funcionar también.
Opcional, quien quiera ponerse con ello:
- Usad el ISE Webpack para cargar el código fuente del core. Hay un fichero que es
videosyncs.v que es el generador de señales de sincronismos. En forma de parámetros están todos los valores que definen el modo de pantalla que estoy usando. Popdeis experimentar tocando los valores del front porch, backporch, o cualquier otro, usando la calculadora de modos de video del enlace que aparece en el propio código fuente. Así podeis ver si tocando alguno de los parámetros conseguis obtener una imagen más estable en algún modo que se os resista. Los parámetros que aparecen ahí se usan con todos los modos. El objetivo es tener una imagen VGA estable en los modos de pantalla 1 y 2 (que son los de 50Hz). Recordad que el área activa debe ser de 800x600, y que la frecuencia de reloj varía en cada uno de los modos.
Las frecuencias base que se generan en el PLL son, para cada modo:
1. 28MHz
2. 28,5MHz
3. 29,63MHz
4. 31,35MHz
5. 34,21MHz
6. 36,9MHz
7. 40MHz
8. 43,1MHz
Todo en el core irá "acelerado" cuando se use una frecuencia que no sea la 1 (48K) o la 2 (128K). Por ejemplo, si necesitas usar la salida VGA a 60Hz, eso significa que la interrupción del retrazo vertical no irá a 50Hz, sino a 60Hz, y que por tanto la CPU irá a 3.5MHz * (34,21 / 28) = 4,2MHz. El AY-3-8912 también irá más acelerado y cuanto mayor sea la frecuencia, más se notará. En el modo 8, con 75Hz de retrazo vertical, la CPU del core irá a 5,38MHz, es decir, un 54% más rápida que en un Spectrum 48K. No sé si la memoria RAM irá bien o no a estas frecuencias, por ello sería deseable que consiguiéramos la máxima compatibilidad posible con monitores usando modos bajos (1,2 y 3 como mucho). En el core no obstante estarán disponibles todos los modos de pantalla que funcionen sin problemas con el driver de memoria RAM y que no ocasionen conflictos de timming con otras partes del core.
Las pruebas que he hecho en casa, con un monitor HP TFT planito, un HPx2301, FullHD etc etc, me da que soporta los 8 modos. En una TV LCD de Samsung, que uso habitualmente con el ZX-Uno en video compuesto, pero que tiene entrada VGA, me soporta todos los modos excepto el modo 1.
GRACIAS 