La versión que tengo de BombJack (bueno, LAS versiones) , una de ellas ya lleva el llamado "bootstrap" que copia las ROMS que quieras en SRAM y las trata como si fueran ROMS. Pero el problema es que esa parte SI funciona, la parte que falla es la que sincroniza la velocidad del hardware con la salidad de datos de las ROMS emuladas en SRAM. Un solo bit de desfase, y se va desfasando poco a poco, hasta que se corrompe.neuro_999 escribió:Y usar como hacen los cores de mister que usan una memoria core de doble canal? Igual asi te funcioma. El dpram tipico que usa sorgileg. Justo he visto que te han enlazado al core de sorgileg. Solo te faltaria el cargador del bloque de las roms a la sram antes de que empiece a ejecutarse. Puedes ver el crazy kong que tiene cargador a sram.
Enviado desde mi ONE A2003 mediante Tapatalk
Esto no es invento mio. Lo puede comprobar tú mismo. Coge uno de esos cores que llevan "bootstrap" a SRAM, cambia los pines UCF y la velocidad, y verás que funciona, pero se acaba corrompiendo por problemas de sincronización.
Y a mi se me escapa ese tema de meter desfases en relojes para sincronizar los datos.
Mira, dejo adjunto la parte que emula SRAM como ROM y verás que lleva una secuencia calculada exclusivamente para un tipo de FPGA concreta con una SRAM a una velocidad concreta. Si algo no cuadra, los tiempos no se cumplen:
Código: Seleccionar todo
-- perform a SRAM read from a specific address depending on which state we're currently in
ram_read : process
begin
wait until falling_edge(clk_sram);
case ram_state_ctr is
when "000000" => -- 00
user_A <= sel_4P & o_rom_4P_addr;
when "000001" => -- 01
if o_rom_4P_ena ='1' then bla-bla <= (others => '0'); end if;
when "000010" => -- 02
when "000011" => -- 03
when "000100" => -- 04
when "000101" => -- 05
when "000110" => -- 06 /MDL latches data into 6F
when "000111" => -- 07
when "001000" => -- 08
when "001001" => -- 09
when "001010" => -- 0a
when "001011" => -- 0b
when "001100" => -- 0c
when "001101" => -- 0d
when "001110" => -- 0e /SL1 latches data into 5L
when "001111" => -- 0f
when "010000" => -- 10
when "010001" => -- 11
when "010010" => -- 12
when "010011" => -- 13
when "010100" => -- 14
when "010101" => -- 15
when "010110" => -- 16 /CDL latches data into 6E
when "010111" => -- 17
when "011000" => -- 18
when "011001" => -- 19
when "011010" => -- 1a
when "011011" => -- 1b
when "011100" => -- 1c
when "011101" => -- 1d
when "011110" => -- 1e /SL2 latches data into 4L and 6S
when "011111" => -- 1f
when "100000" => -- 20
user_A <= sel_4P & o_rom_4P_addr;
when "100001" => -- 21
if o_rom_4P_ena ='1' then bla-bla <= (others => '0'); end if;
when "100010" => -- 22
when "100011" => -- 23
when "100100" => -- 24
when "100101" => -- 25
when "100110" => -- 26 /VPL latches data into 5H
when "100111" => -- 27
when "101000" => -- 28
when "101001" => -- 29
user_A <= sel_8R & o_rom_8RNL_addr;
when "101010" => -- 2a
if o_rom_8RNL_ena ='1' then bla-bla <= (others => '0'); end if;
user_A <= sel_8N & o_rom_8RNL_addr;
when "101011" => -- 2b
if o_rom_8RNL_ena ='1' then i_rombla-bla ) <= (others => '0'); end if;
user_A <= sel_8L & o_rom_8RNL_addr;
when "101100" => -- 2c
if o_rom_8RNL_ena ='1' then i_rom_8bla-bla = (others => '0'); end if;
user_A <= sel_8K & o_rom_8KHE_addr;
when "101101" => -- 2d
if o_rom_8KHE_ena ='1' then i_rom_8Kbla-bla <= (others => '0'); end if;
user_A <= sel_8H & o_rom_8KHE_addr;
when "101110" => -- 2e
if o_rom_8KHE_ena ='1' then i_rom_8Kbla-bla <= (others => '0'); end if;
user_A <= sel_8E & o_rom_8KHE_addr;
when "101111" => -- 2f
if o_rom_8KHE_ena ='1' then ibla-bla <= (others => '0'); end if;
user_A <= sel_7J & o_rom_7JLM_addr;
when "110000" => -- 30
i_rom_7JLM_data(23 downto 16) <= user_Din;
user_A <= sel_7L & o_rom_7JLM_addr;
when "110001" => -- 31
i_rom_7JLM_data(15 downto 8) <= user_Din;
user_A <= sel_7M & o_rom_7JLM_addr;
when "110010" => -- 32
i_rom_7JLM_data( 7 downto 0) <= user_Din;
when "110011" => -- 33
when "110100" => -- 34
when "110101" => -- 35
when "110110" => -- 36
when "110111" => -- 37
when "111000" => -- 38
when "111001" => -- 39
when "111010" => -- 3a
when "111011" => -- 3b
when "111100" => -- 3c /SLOAD latches data into shifters
when "111101" => -- 3d
when "111110" => -- 3e
when "111111" => -- 3f
when others => null;
end case;
end process;