Hola, zassssss no estaba leyendo/escribiendo tan bien la memoria como pensaba

.
Me he hecho una maquina de estados de 4 estados. El reloj asociado es de 200Mhz, luego realizamos una lectura cada 20ns (50Mhz). Es una sram de 10ns. He tratado de cumplir con los tiempos que muestra en el pdf de la IS61LV25616 (256kx16).
Estos son los estados que a mi parecer hace el programa que he escrito:
[

Este es el trozo de codigo fuente relacionado:
fsm_sram: process(clk_ram, reset, mem_cycle, acc_copia, hcnt)
begin
if reset = '0' then
mem_cycle <= nop;
do_xsram <= "00000000";
-- inicilizamos dibujo
-- AKI INICIALIZO 'DIBUJO' que seria una imagen de 64x16 pixel
elsif clk_ram'event and clk_ram = '1' then
case mem_cycle is
when write1 => mem_cycle <= write2;
when write2 => mem_cycle <= write3;
when write3 => mem_cycle <= nop;
when read1 => mem_cycle <= read2;
when read2 => mem_cycle <= read3;
when read3 => mem_cycle <= nop;
when nop =>
if enable = '1' then
--addr <= "00000000000" & vcnt(8 downto 6) & hcnt(9 downto 6);
addr <= vcnt(7 downto 0) & hcnt;
mem_cycle <= read1;
elsif acc_copia ='1' then -- boton = '1' es apretado
mem_cycle <= write1;
addr <= dir_y(7 downto 0) & dir_x;
pixel_dibujo <= dibujo1(conv_integer(dir_y(3 downto 0)));
do_xsram <= "0000000" & pixel_dibujo(conv_integer(dir_x(5 downto 0)));
--do_xsram <= "00000" & dir_x(2 downto 0);
end if;
end case;
end if;
end process;
output_fsm_sram: process(mem_cycle)
begin
case mem_cycle is
when write1 => we_auxi <= '0'; oe_auxi <= '1'; ce1_auxi <= '0'; ce2_auxi <= '1';
when write2 => we_auxi <= '0'; oe_auxi <= '1'; ce1_auxi <= '0'; ce2_auxi <= '1';
when write3 => we_auxi <= '1'; oe_auxi <= '1'; ce1_auxi <= '0'; ce2_auxi <= '1';
when read1 => we_auxi <= '1'; oe_auxi <= '0'; ce1_auxi <= '0'; ce2_auxi <= '1';
when read2 => we_auxi <= '1'; oe_auxi <= '0'; ce1_auxi <= '0'; ce2_auxi <= '1';
when read3 => we_auxi <= '1'; oe_auxi <= '0'; ce1_auxi <= '0'; ce2_auxi <= '1';
when others => we_auxi <= '1'; oe_auxi <= '1'; ce1_auxi <= '1'; ce2_auxi <= '1';
end case;
end process;
we <= we_auxi;
oe <= oe_auxi;
ce1 <= ce1_auxi;
ce2 <= ce2_auxi;
data <= do_xsram when mem_cycle <= write2 and mem_cycle <= write3 else (others => 'Z');
di_xsram <= data when mem_cycle = read2 else di_xsram;
r_auxi <= di_xsram(2);
g_auxi <= di_xsram(1);
b_auxi <= di_xsram(0);
Breve explicacion: es la parte del codigo relacionada...
- di_xsram almacena la lectura de la sram
- do_xsram almacena el valor que vamos a grabar en la sram
- data es el bus exterior (inout)
- enable = 1 cuando se esta dibujando en pantalla y vale 0 en los descansos (sincronismos). Cuando es 1, lee de sram y dibujo en pantalla (a 50Mhz ambas cosas). Cuando es 0, aprovecho para copiar en la misma ram el 'dibujo'.
En otra maquina de esta con la signal acc_copia le digo cuando y donde debe grabar en la memoria.
La cuestion es que el dibujo no sale bien definido (como lecturas erroneas aleatorias). PEROOOO si le bajo la frecuencia de reloj al acceso a la sram (100Mhz) entonces si me lee y escribe perfecto. Como cada pixel es a 50Mhz y el acceso a sram es 25Mhz, solo lee un pixel de ram cada 2 (repite en pantalla de 2 en 2 pixels), pero la imagen sale como debe ser (lo que supuestamente he grabado en ram).
El problema lo tenemos cuando la intento mover a 50Mhz (20ns cada lectura/escritura): Supuestamente es de 10ns, y me he fijado en los tiempos del pdf para hacer mi maquina de estados. Creo que los cumple

Cual puede ser mi problema? lo estoy probando en la spartan 3 kit. Si alguien quiere el codigo para probarlo, me lo dice.
Yo seguire dandole vueltas, que posiblemente haya algun fallo tonto (a veces me esta pasando que no hace lo que yo pienso que debia hacer y es que no estoy muy acostumbrado a este lenguaje y son cosas de concepto).
Un saludo. Dani.