ZXUNO con salida VGA en el Spectrum

Avatar de Usuario
jepalza
Mensajes: 613
Registrado: 02 Oct 2015, 18:52

ZXUNO con salida VGA en el Spectrum

Mensaje por jepalza » 08 Oct 2015, 19:54

He conseguido sacar VGA al ZXUNO para el core del Spectrum, pero tengo un problema, y es que no me queda, ni centrado, ni adecuado. En la imágen se aprecian sincronismos horizontales perdidos (en el borde negro de abajo), y ademas, no debería verse ese borde negro, y por la derecha no queda centrado por mucho.

Es un avance, no es gran cosa, pero ya va. No os emocionéis muy rápido ( @radastan , date por aludido por ahora :roll: ) por que de momento es una trmapa gigantesca la que me he currado. Estoy empleando una ULA trampeada para que haga el trabajo de sacar HSYNC y VSYNC ella sola, sin que lo tenga que hacer fuera de ella, y ademas, para no comerme la cabeza, estoy usando un Spectrum ultra-simple, el mas básico posible, en el cual solo tengo 17k de RAM (estoy usando la BRAM de la FPGA) y no tiene SD, solo se puede cargar por cinta. Esto lo hago así para agilizar tanto la síntesis (mas rápida al tener menos elementos) como para eliminar errores, al no preocuparme de módulos extras. Ademas, la ROM la he integrado directa en la FPGA, para no tener que cargarla aparte. Por ahora es solo para probar y divertirme aprendiendo.

Imagen

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por mcleod_ideafix » 08 Oct 2015, 21:02

jepalza escribió:He conseguido sacar VGA al ZXUNO para el core del Spectrum, pero tengo un problema, y es que no me queda, ni centrado, ni adecuado.
Ese offset existe en la ULA original. Forma parte de cómo genera la pantalla. Probablemente lo que estés viendo es el "paper" muy echado a un lado (derecha o izquierda, ahora no recuerdo).

Si quieres hacer algo divertido, haz que cuando la parte de VGA pinta por segunda vez el scanline, lo haga pero con los colores más oscuros, es decir, de cada componente de color de 3 bits, desplázalo a la derecha para dividirlo entre dos y sácalo así. Habrás conseguido un efecto scanline muy chulo :)
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
jepalza
Mensajes: 613
Registrado: 02 Oct 2015, 18:52

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por jepalza » 08 Oct 2015, 21:28

Lo pruebo mañana, ahora tengo que dejarlo de momento. Gracias. :chocala!:

Avatar de Usuario
Radastan
Mensajes: 389
Registrado: 05 Oct 2015, 14:39

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por Radastan » 09 Oct 2015, 08:39

Jepalza, sólo llegar a esto ya me haces sonreir de oreja a oreja. Es lo que me separa de poner a piñón fijo el ZX Uno en el monitor (uno 4:3) y poder disfrutar del ZX Uno como si no hubiera un mañana. La capturadora no hace justicia a la calidad de imagen. Idem mi televisor/monitor Samsung. Y poner el televisor de tubo me da una perece impresionante porque tengo poco espacio y cada vez que lo saco tengo que recogerlo en poco tiempo.

Te falta "ná".

Yo voy preparando la cámara...

Avatar de Usuario
jepalza
Mensajes: 613
Registrado: 02 Oct 2015, 18:52

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por jepalza » 09 Oct 2015, 23:00

Necesito ayuda (una vez mas, para variar):
Ya he conseguido meter la VGA, usando la modificación de Mcleod_Ideafix sobre la ULA de Radastan.
Para poder luego mostrar esa imágen con HSYNC+VSYNC en la pantalla VGA, he empleado una rutina que cogí del repositorio de la placa de desarrollo "papistrello" de Jozsef Laszlo y la he retocado un poco para ponerla acorde al verilog del zxuno.
Y realmente funciona, pero la imágen que me sale es esta:

Imagen

¿alguien ve el problema? SI os dáis cuenta, en vertical está perfecto, pero en horizontal me sale el doble de grande.

Y el código este, a ver si alguno véis el error de duplicado de tamaño horizontal:


EDITO!!: Olvidaros de todo lo anterior (he borrado el código que puse), el fallo era de mi monitor, que no quería centrar la imagen de modo automático, y hasta que no lo he hecho de modo manual no he podido ajustar). Ya tenemos VGA

Imagen

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por mcleod_ideafix » 10 Oct 2015, 10:06

Porfa porfa porfa... pon alguna demo de las que hacen virguerías con la temporización de la pantalla, tal como la segunda parte de la Shock Megademo
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
jepalza
Mensajes: 613
Registrado: 02 Oct 2015, 18:52

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por jepalza » 10 Oct 2015, 14:19

Supongo que te refieres a la que usa el borde a la par que el paper para dibujar lineas a trapo:
Imagen

aqui ampliado, pero la cámara no ha captado la velocidad y se ve borrosa, pero lo importa se aprecia, que coge todo a la par, sin pérdidas.
Imagen

De todos modos, hay que pulir mucho el conversor de escaneado que uso, por que falla mucho. El monitor de PC que véis en la foto (marca "nisupu") sufre con los sincronismos, y se me descentra contínuamente, por eso se ven bordes negros en la pantalla, por que cada vez que reseteo, se me pierde el ajuste y debo volver a centrarlo.
En cambio en la TV Samsung, lo coge a la primera, pero es tele no puedo usar, es en la que vemos la tele.

Otro fallo, son los ajustes en modo 128, que se ven tal que así:
Imagen

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por mcleod_ideafix » 10 Oct 2015, 14:50

Lo que te pasa en modo 128K es probablemente porque los timmings de 128K son ligeramente diferentes a los de 48K, y por tanto habría que volver a recalibrar el monitor (lo de darle a AUTO para que coja bien la imagen).

¿Funciona bien la ULAplus? Puedes probar la demo HAM8x1, sobre todo la primera imagen, que muestra la carta de colores de ULAplus, y en la que se pueden llegar a ver los 256 colores posibles.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Avatar de Usuario
jepalza
Mensajes: 613
Registrado: 02 Oct 2015, 18:52

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por jepalza » 10 Oct 2015, 17:14

Si que funciona, al menos, para mi gusto, no veo fallos. Otro ojo mas entrenado no dirá lo mismo.

Imagen

Imagen


Lo de los timmings del 128, lo suponía, pero no imaginaba que a efectos VGA afectara. Lo de autoajustar, no sirve en mi monitor, pasa de mi. Si le doy a autiajustar, se me descentra, y luego tengo que llevarlo a mano la centro.
Eso, tú que entiendes mas que yo de vídeo, podrás ajustarlo algún día y dejarlo pulido.
Ademas, habrá que hacer pruebas con muchos monitores, no solo con los tres mios.

Avatar de Usuario
mcleod_ideafix
Mensajes: 831
Registrado: 27 Sep 2015, 00:14
Ubicación: Jerez de la Frontera
Contactar:

Re: ZXUNO con salida VGA en el Spectrum

Mensaje por mcleod_ideafix » 10 Oct 2015, 20:18

jepalza escribió:Lo de los timmings del 128, lo suponía, pero no imaginaba que a efectos VGA afectara. Lo de autoajustar, no sirve en mi monitor, pasa de mi. Si le doy a autiajustar, se me descentra, y luego tengo que llevarlo a mano la centro.
La solución la conocemos: consiste en usar varios relojes y conmutar a uno u otro según estemos en 48K o 128K. Si quieres hacer la prueba manualmente de cómo quedarían los timmings de 128K con el reloj correcto, haz lo siguiente:

Abre en el ISE el fichero cuatro_relojes_maestros.v . Ese es el fichero que contiene la definición de los cuatro relojes, que como podrás ver, son 28MHz y sus tres primeros submúltiplos. Pues bien. Habría que cambiar esos relojes para que ahora sean todos submúltiplos de la frecuencia de 28.5MHz, que sería la nueva frecuencia maestra para 128K. (NOTA: en realidad, y por aquello de hacer el sistema un poquito más compatible con VGA desde el principio, cambié la frecuencia a 28.125MHz)

Pero resulta que 28.5MHz es una frecuencia un tanto puñetera de generar con el PLL, ya que los valores del multiplicador y divisor se van de madre, y aunque sí podríamos generarla, sería más complicado generar sus submúltiplos. Además, en VGA, si la frecuencia es un poco mayor, en realidad es mejor, ya que aumentamos la frecuencia de refresco vertical, y así nos alejamos de la zona "inestable" de los monitores VGA. Así que probemos con una frecuencia pelín mayor: 28.571MHz, que requiere de un multiplicador 4 y un divisor 7.

Así que si puedes, prueba esto: donde aparece...

Código: Seleccionar todo

  PLL_BASE
  #(.BANDWIDTH              ("OPTIMIZED"),
    .CLK_FEEDBACK           ("CLKFBOUT"),
    .COMPENSATION           ("SYSTEM_SYNCHRONOUS"),
    .DIVCLK_DIVIDE          (1),
    .CLKFBOUT_MULT          (9),
    .CLKFBOUT_PHASE         (0.000),
    .CLKOUT0_DIVIDE         (16),
    .CLKOUT0_PHASE          (0.000),
    .CLKOUT0_DUTY_CYCLE     (0.500),
    .CLKOUT1_DIVIDE         (32),
    .CLKOUT1_PHASE          (0.000),
    .CLKOUT1_DUTY_CYCLE     (0.500),
    .CLKOUT2_DIVIDE         (64),
    .CLKOUT2_PHASE          (0.000),
    .CLKOUT3_DIVIDE         (128),
    .CLKOUT3_PHASE          (0.000),
    .CLKOUT2_DUTY_CYCLE     (0.500),
    .CLKIN_PERIOD           (20.0),
    .REF_JITTER             (0.010))
Cámbialo por:

Código: Seleccionar todo

  PLL_BASE
  #(.BANDWIDTH              ("OPTIMIZED"),
    .CLK_FEEDBACK           ("CLKFBOUT"),
    .COMPENSATION           ("SYSTEM_SYNCHRONOUS"),
    .DIVCLK_DIVIDE          (1),
    .CLKFBOUT_MULT          (7),
    .CLKFBOUT_PHASE         (0.000),
    .CLKOUT0_DIVIDE         (7),
    .CLKOUT0_PHASE          (0.000),
    .CLKOUT0_DUTY_CYCLE     (0.500),
    .CLKOUT1_DIVIDE         (14),
    .CLKOUT1_PHASE          (0.000),
    .CLKOUT1_DUTY_CYCLE     (0.500),
    .CLKOUT2_DIVIDE         (28),
    .CLKOUT2_PHASE          (0.000),
    .CLKOUT3_DIVIDE         (56),
    .CLKOUT3_PHASE          (0.000),
    .CLKOUT2_DUTY_CYCLE     (0.500),
    .CLKIN_PERIOD           (20.0),
    .REF_JITTER             (0.010))
Como referencia, éste es el programa en C que uso para averiguar los mejores valores para el multiplicador M y el divisor D cuando hay que sintetizar una nueva frecuencia partiendo de los 50MHz:

Código: Seleccionar todo

#include <stdio.h>

#define abs(a) (((a)>(0))?(a):(-a))

int main(void) 
{
	float m,d;
	float cm=50;  // frecuencia del reloj de la placa
	float cd=28;  // frecuencia principal que queremos generar
	float c;
	float cx=0;
	
	for (d=2;d<128;d++)
	{
		for (m=2;m<128;m++)
		{
			c = cm*m/d;
			if (abs(c-cd)<abs(cx-cd))
			{
				cx = c;
				printf ("M = %3.0f  D = %3.0f  CLOCK = %6.3f\n", m, d, cx);
			}
		}
	}
	
	return 0;
}
Proyecto completo listo para ejecutar en:
http://www.tutorialspoint.com/compile_c ... Xp2cTI2cjQ

Puedes jugar con estas cuatro frecuencias, siempre y cuando se cumpla que haya una principal, y las demás sean sus submúltiplos. Los valores permitidos para M y D son desde 2 hasta 127, si mal no recuerdo, así que evita usar valores de la frecuencia principal deseada que exijan un valor de D alto, ya que para generar los siguientes submúltiplos de esa frecuencia tendrás que doblar el valor de D, y fácilmente se te puede ir de rango.

Tampoco puedes irte a frecuencias muy por encima de 28MHz, ya que el gestor de memoria que multiplexa los accesos de la ULA y el Z80 a la memoria SRAM empezará a no tener tiempo para completar los accesos. En la práctica no creo que esto sea problema, ya que tendrías que irte a una frecuencia principal de más de 50MHz para que esto ocurriera.
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA

Responder