Diferentes ULA's

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

Diferentes ULA's

Mensaje por jepalza » 08 Oct 2015, 12:00

La pregunta va dirigida a ti, Mcleod_Ideafix:
He encontrado por la red, una ULA de 2012 en un repositorio (en concreto, el de Jozsef Laszlo) para una version anterior (o eso creo) del Core del Spectrum con salida HDMI. Esta ULA, hecha por ti también, tiene salidas de video descompuestas (Hsync y VSync), al contrario que la ULA actual, la que tenemos en OPENCORES, que solo lleva la salida compuesta (Csync).

¿alguna razón para ello? (una y otra versión) ¿cuál es mejor? Entiendo que la "nueva" la de Opencores, la otra es de 2012, pero por preguntar que no quede.

Para hacer pruebas con la salida VGA y HDMI es mejor la "vieja" ULA, por que ya tiene los sincronismos separados, que es lo que necesita el HDMI (y la VGA) como entrada.

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

Re: Diferentes ULA's

Mensaje por mcleod_ideafix » 09 Oct 2015, 00:56

jepalza escribió:La pregunta va dirigida a ti, Mcleod_Ideafix:
He encontrado por la red, una ULA de 2012 en un repositorio (en concreto, el de Jozsef Laszlo) para una version anterior (o eso creo) del Core del Spectrum con salida HDMI. Esta ULA, hecha por ti también, tiene salidas de video descompuestas (Hsync y VSync), al contrario que la ULA actual, la que tenemos en OPENCORES, que solo lleva la salida compuesta (Csync).

¿alguna razón para ello? (una y otra versión) ¿cuál es mejor? Entiendo que la "nueva" la de Opencores, la otra es de 2012, pero por preguntar que no quede.
No sé muy bien si he entendido la pregunta. Josef cogió la descripción de la ULA de OpenCores e imagino que la modificó para sacar sincronismo separado (que por cierto, en la ULA del ZX-Uno es muy sencillo de hacer). Así, la ULA con salidas separadas es una versión suya basada en mi ULA, pero yo no he tenido nada que ver con esa versión.

Sobre qué versión es la mejor, la respuesta es: la que tenemos en el ZX-Uno. La ULA del ZX-Uno es una versión completamente refactorizada, usando el modelo datapath+controlador, que se amolda muy bien a cómo funciona una FPGA, y además soporta todo lo soportable en la ULA, y más ;)

Para convertir la ULA del ZX-Uno en una ULA con sincronismos separados, haz esto:

- Busca el fichero pal_sync_generator_sinclair.v, que tiene esta pinta:

Código: Seleccionar todo

module pal_sync_generator_sinclair (
    input wire clk,
    input wire timming,
    input wire [2:0] ri,
    input wire [2:0] gi,
    input wire [2:0] bi,
    output wire [8:0] hcnt,
    output wire [8:0] vcnt,
    output reg [2:0] ro,
    output reg [2:0] go,
    output reg [2:0] bo,
    output reg csync
    );

    parameter
      END_COUNT_H_48K  = 447,
      END_COUNT_V_48K  = 311,
      END_COUNT_H_128K = 455,
      END_COUNT_V_128K = 310,
      BHBLANK          = 320,
      EHBLANK          = 415,
      BHSYNC           = 344,
      EHSYNC           = 375,
      BVPERIOD         = 248,
      EVPERIOD         = 255,
      BVSYNC           = 248,
      EVSYNC           = 251;

	reg [8:0] hc = 9'h000;
	reg [8:0] vc = 9'h137;  // linea 311

	assign hcnt = hc;
	assign vcnt = vc;
	
	always @(posedge clk) begin
		if ( (hc == END_COUNT_H_48K && !timming) || (hc == END_COUNT_H_128K && timming) ) begin
			hc <= 0;
			if ( (vc == END_COUNT_V_48K && !timming) || (vc == END_COUNT_V_128K && timming) )
				vc <= 0;
			else
				vc <= vc + 1;
		end
		else
			hc <= hc + 1;
	end

    always @* begin
        ro = ri;
        go = gi;
        bo = bi;
        csync = 1'b1;
        if ( (hc>=BHBLANK && hc<=EHBLANK) || (vc>=BVPERIOD && vc<=EVPERIOD) ) begin
            ro = 3'b000;
            go = 3'b000;
            bo = 3'b000;
            if ( (hc>=BHSYNC && hc<=EHSYNC) || (vc>=BVSYNC && vc<=EVSYNC) ) begin
                csync = 1'b0;
            end
        end
     end
        
endmodule
Y cámbialo por esto:

Código: Seleccionar todo

module pal_sync_generator_sinclair (
    input wire clk,
    input wire timming,
    input wire [2:0] ri,
    input wire [2:0] gi,
    input wire [2:0] bi,
    output wire [8:0] hcnt,
    output wire [8:0] vcnt,
    output reg [2:0] ro,
    output reg [2:0] go,
    output reg [2:0] bo,
    output reg hsync,
    output reg vsync
    );

    parameter
      END_COUNT_H_48K  = 447,
      END_COUNT_V_48K  = 311,
      END_COUNT_H_128K = 455,
      END_COUNT_V_128K = 310,
      BHBLANK          = 320,
      EHBLANK          = 415,
      BHSYNC           = 344,
      EHSYNC           = 375,
      BVPERIOD         = 248,
      EVPERIOD         = 255,
      BVSYNC           = 248,
      EVSYNC           = 251;

	reg [8:0] hc = 9'h000;
	reg [8:0] vc = 9'h137;  // linea 311

	assign hcnt = hc;
	assign vcnt = vc;
	
	always @(posedge clk) begin
		if ( (hc == END_COUNT_H_48K && !timming) || (hc == END_COUNT_H_128K && timming) ) begin
			hc <= 0;
			if ( (vc == END_COUNT_V_48K && !timming) || (vc == END_COUNT_V_128K && timming) )
				vc <= 0;
			else
				vc <= vc + 1;
		end
		else
			hc <= hc + 1;
	end

    always @* begin
        ro = ri;
        go = gi;
        bo = bi;
        hsync = 1'b1;
        vsync = 1'b1;
        if ( (hc>=BHBLANK && hc<=EHBLANK) || (vc>=BVPERIOD && vc<=EVPERIOD) ) begin
            ro = 3'b000;
            go = 3'b000;
            bo = 3'b000;
            if (hc>=BHSYNC && hc<=EHSYNC)
                hsync = 1'b0;
            if (vc>=BVSYNC && vc<=EVSYNC)
                vsync = 1'b0;
        end
     end
        
endmodule
Obviamente, en los módulos superiores (ula_radastan, zxuno, tld) tendrás que eliminar la referencia a csync y usar en su lugar las dos señales hsync y vsync. Es más: la señal csync original puede generarse a partir de estas dos como el AND lógico de ambas.
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: Diferentes ULA's

Mensaje por jepalza » 09 Oct 2015, 06:04

Has entendido bien la pregunta y has respondido mejor. Es lo que quería saber. O sea, que esa ULA es modificación suya que circula por la red.

Lo de modificar la ULA, para diversión está bien, y es lo que haré esta tarde, por que a eso es a lo que yo llamo "cacharreo" (lo divertido del ZXUNO y de las FPGA es poder trastear y tocarlo todo, para ver resultados).

No es mi intención ahora tocar una ULA que ha quedado preciosa, metiendo cosas "non" estándar. :llamarada:

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

Re: Diferentes ULA's

Mensaje por Radastan » 09 Oct 2015, 08:44

jepalza escribió:No es mi intención ahora tocar una ULA que ha quedado preciosa, metiendo cosas "non" estándar. :llamarada:
Pero McLeod te ha dado una solución muy elegante: modificas el código como dice y generas la señal csync con un AND para no tener que tocar el resto. Nada cambia, pero tu tienes la señales hsync y vsync que necesitas para la VGA y el HDMI.

Es más, debería estar de serie dicha modificación, se use o no, porque así facilitamos el desarrollo posterior de salidas de vídeo y apenas tiene impacto en el diseño.

Responder