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.
Diferentes ULA's
- mcleod_ideafix
- Mensajes: 831
- Registrado: 27 Sep 2015, 00:14
- Ubicación: Jerez de la Frontera
- Contactar:
Re: Diferentes ULA's
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.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.
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
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
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA
Re: Diferentes ULA's
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.
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.
Re: Diferentes ULA's
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.jepalza escribió:No es mi intención ahora tocar una ULA que ha quedado preciosa, metiendo cosas "non" estándar.
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.