jepalza escribió:Hay líneas de código que ahora sobran a porrones (aún no las he tocado, por que no sabía si harían falta al final). Por ejemplo, las que se encargan de la parte superior de la RAM (los 32k del modelo de 48k). Si elimino todo eso, gano espacio, a ver si consigo que el modelo de 16k al menos me muestre el mensaje famoso "1982 Sinclair Research Ltd".
El sintetizador de Xilinx es bastante inteligente. Si en tu descripción hay un elemento que no está conectado, no se genera lógica para él, y por tanto no ocupa nada en la FPGA. De hecho, ésta es una de las causas de error más comunes cuando se empieza a diseñar lógica con FPGA's.
Por ejemplo, pongamos que tienes un fabuloso diseño para un biestable D disparado por flanco positivo, tal que éste:
Código: Seleccionar todo
module biestable_d (
input clk,
input d,
output q,
output q_n
);
reg flipflop = 0;
assign q = flipflop;
assign q_n = !flipflop;
always @(posedge clk)
flipflop <= d;
endmodule
Y que dicho diseño lo quieres usar dentro de otro, tal que así:
Código: Seleccionar todo
module otracosa (
input masterclk,
input entrada,
output salida,
... (mas cosas)...
);
...
...
biestable_d mibiestable (
.clk(master_clk),
.d(entrada),
.q(salida),
.q_n()
);
...
...
endmodule
Cuando este circuito se sintetice, el biestable no se generará. La razón es que nos hemos equivocado al conectar la señal de reloj del biestable. Debería ir conectado a la señal "masterclk", pero por un lapsus, hemos "renombrado" esa señal y en el biestable la hemos llamado "master_clk". El sintetizador no dará un error de "variable no encontrada", sino que interpretará que "master_clk" es una señal nueva.
Ahora bien, la nueva señal "master_clk" no tiene ningún valor, ni por supuesto, existe ningún circuito en nuestro diseño que dirija el comportamiento de sea señal. El sintetizador detecta esto y en consecuencia, elimina todo aquello que tenga que ver con dicha señal. Como "master_clk" está conectada al "clk" del biestable, resulta que todo lo que haya en el diseño del biestable que tenga que ver con "clk" se elimina. Así, tenemos que el "always" se elimina porque estaba dirigido por un evento: que "clk" suba de 0 a 1 ("posedge", es decir, flanco positivo). Como "clk" no existe, ese evento nunca se dará, así que el "always" desaparece, y con él, la línea en la que el contenido del registro "flipflop" se actualiza con el valor de "d". Como esa línea ya no existe, y "flipflop" nunca se actualizará, su valor siempre será 0 (su valor inicial), y como las salidas "q" y "q_n" están conectadas a "flipflop", sus valores siempre serán 0 y 1 respectivamente. "q_n" no está conectado a ninguna señal, así que el "assign q_n" desaparece, y en cuanto a "q", está conectado a "salida", y como "q" siempre vale 0, pues ahora resulta que "salida" siempre valdrá 0.
El sintetizador por tanto, traduce esta parte del diseño ignorando "entrada" y dándole a "salida" directamente el valor 0. Esa parte del diseño queda por tanto así:
Código: Seleccionar todo
module otracosa (
input masterclk,
input entrada,
output salida,
... (mas cosas)...
);
...
...
assign salida = 0;
...
...
endmodule
Traducido a un diseño como el tuyo: si por ejemplo, se te olvida conectar la señal de reloj del procesador, harás que el sintetizador elimine por completo toooooda la descripción del Z80 de tu diseño. Si, por ejemplo, tienes descrita una memoria, pero no conectas su bus de datos, o la entrada CS de dicha memoria, el sintetizador muy probablemente se dé cuenta de que ese módulo no está interviniendo en el circuito, y desaparezca del resultado de la síntesis.
Cuando estés sintetizando, vigila la ventana de "messages" (creo que se llama así) y la de "warnings". Si el sintetizador "se carga" un módulo tuyo, te avisará ahí.