Placas Spartan 6 XC6SLX16

Otras placas, clones o aparatos basados en FPGA / Oher FPGA based clones/devices/boards
Avatar de Usuario
jepalza
Mensajes: 613
Registrado: 02 Oct 2015, 18:52

Re: Placas Spartan 6 XC6SLX16

Mensaje por jepalza » 11 Ene 2018, 21:03

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
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.
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;

Avatar de Usuario
neuro_999
Mensajes: 692
Registrado: 06 Oct 2015, 10:14

Re: Placas Spartan 6 XC6SLX16

Mensaje por neuro_999 » 11 Ene 2018, 21:35

Yo era por darte ideas, porque de eso sabes mas que yo. La sram siempre me da dolor de cabeza, para muestra los dos cores que la usan som los que tienen un pequeño glich en la ultima linea que no consigo quitar. (bagman y crazy kong).
Pero bueno yo por mi parte seguire investigando. :) que es lo que me divierte.
Tg que probar el defender que tg portado y no cabe en la 6, a ver si en esta otra si cabe. Aunque es tan tocho que no se yo... :)

Enviado desde mi ONE A2003 mediante Tapatalk

hikoki
Mensajes: 307
Registrado: 21 Feb 2016, 01:38

Re: Placas Spartan 6 XC6SLX16

Mensaje por hikoki » 11 Ene 2018, 22:00

Si no os importa, voy a googlear Bombjack otra vez. Sabemos que un tal Hampster lo tiene resuelto para la fpga del zxuno :)

Primer googleo: leed el comentario de este video y sucesivos : https://m.youtube.com/watch?v=1s_xv6EvWeo
Dice
Turned out I needed to invert the 12Mhz clock to a BRAM so that the rising edge of the clock was delayed (or advanced, depending on your point of view) compared to the components around it running at 6Mhz giving the signals time to settle.

hikoki
Mensajes: 307
Registrado: 21 Feb 2016, 01:38

Re: Placas Spartan 6 XC6SLX16

Mensaje por hikoki » 11 Ene 2018, 22:19

Segundo googleo. Hamster compartía el core en este hilo por privado : https://forum.digilentinc.com/topic/29- ... on-basys3/
Este hombre es un gurú de fpga con en que Jepalza intentó contactar en twitter. Al mnos dejó una pista:
The only changes required were to replace the DCM_CLOCKGEN with a MMCM, and to look into some weird timing problems as old arcade games did not us a fully synchronous design.
Cambios sobre qué? El código de Papilio me supongo..

hikoki
Mensajes: 307
Registrado: 21 Feb 2016, 01:38

Re: Placas Spartan 6 XC6SLX16

Mensaje por hikoki » 11 Ene 2018, 22:29

Tercer googleo. Otra vez de la mano de Hamster podríamos encontrarnos con el core! Seguid el link a github que dejó en este post: https://forum.digilentinc.com/topic/469 ... ment=18936
apostaría que ahí está su core de Bombjack

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

Re: Placas Spartan 6 XC6SLX16

Mensaje por jepalza » 11 Ene 2018, 22:31

Esos vídeos son viejos, son anteriores al ZXUNO. Y la solución de la que habla, es la de meter todo en BRAM, y en el ZXUNO no entra todo, como ya he dicho, tenemos 72k y se necesitan 112k, y solo las LX25 y LX45 pueden.

Y la única versión que conozco de FPGA como la nuestra (la LX9) que funciona mediante SRAM y BRAM (50% a cada mas o menos) está implementada en un Papilio PLUS, que solo se vendieron unas pocas unidades, por que los de HamsterStudios se colaron en el diseño y dejaron atados los dos buses de datos de SRAM, y en la siguiente versión dejaron de usar SRAM y meter DRAM, que es la famosa papilio pro (que no plus).
O sea, que solo hay (que yo sepa) una version de BombJack para nuestra FPGA, que es la del fracasado Papilio PLus, y esa versión, de la que tengo copia, tampoco funciona, por la forma en la que cada tipo de SRAM se maneja, por temas de velocidades.

Edito: hikoki, estamos escribiendo a la par, y veo que ya te he contestado de antemano a lo del tema del core para el LX9. Resumo diciendo, que lo que comentas en los anteriores hilos a este, ya lo conocía, y es lo que tengo guardad y probado, y que en el ZXUNO no funciona y en cambio en el LX45 sí lo hace. ¿diferencia tiempos? lo desconozco.

hikoki
Mensajes: 307
Registrado: 21 Feb 2016, 01:38

Re: Placas Spartan 6 XC6SLX16

Mensaje por hikoki » 11 Ene 2018, 22:42

No están aquí los cambios de Hamster que solucionan los timings extraños de Bombjack ?
https://github.com/bhamadicharef/bombja ... gen_source
Puede ser que la versión que Jepalza probó no temía estos cambios..

y por ultimo Hamster y Vlait (no es vlait un miembro de este foro?) comentan los timing extraños de Bombjack en este hilo: http://forum.gadgetfactory.net/topic/17 ... dventures/

hikoki
Mensajes: 307
Registrado: 21 Feb 2016, 01:38

Re: Placas Spartan 6 XC6SLX16

Mensaje por hikoki » 12 Ene 2018, 01:18

Entonces vienes a decir que por falta de Bram hay problemas de velocidad al acceder a la memoria.
¿Podrías hacer algo para ahorrar Bram o poner buffers para que se acceda más rápido y liberar recursos?
Aquí comentan que recurren a algoritmos para ahorrar Bram : https://www.fpgarelated.com/showthread/ ... 0258-1.php
En este foro de atari : http://www.atari-forum.com/viewtopic.ph ... 78#p320737
Sorgelig dice
MiST is not abandoned. There are many cores on MiST board t enjoy it. But at the same time many cores hit the limits and cannot be improved beyond current state. In most cases the big problem is lack of FPGA's Block RAM. As you can see it's hard to fix the FPGAGen due to lack of BRAM. Same goes to arcade cores. Basically any multi-CPU system has separate blocks of RAM chips and in most cases you cannot put them together into one SDRAM chip due to timings.
Edito:

Buscando por "save bram" me he encontrado con un trabajo academico sobre Donkey Kong en verilog.
http://web.mit.edu/6.111/www/f2006/proj ... Report.pdf
Explican herramientas de Xilinx para detectar problemas de timings, cómo ahorrar Bram adaptándose a la lógica del juego y otras estrategias cómo observar el juego hasta que falle y entonces cambiar la precedencia de los circuitos,etc
Aquí dicen que utilizar srl fifos en vez de bram fifos puede mejorar problemas de timing : https://forums.xilinx.com/t5/Embedded-D ... 28202?db=5
Fifo me suena a payaso de la tele, debe ser algun bufer de memoria? :) Saludos

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

Re: Placas Spartan 6 XC6SLX16

Mensaje por jepalza » 12 Ene 2018, 05:57

hikoki escribió:No están aquí los cambios de Hamster que solucionan los timings extraños de Bombjack ?
Puede ser que la versión que Jepalza probó no temía estos cambios..
Eso que comentas es para GENERAR los BRAM y que no de errores al compilar. No tiene nada que ver con el juego ni con el problema de la SRAM en la version Papilio. El ejemplo mas simple que te puedo poner, es como hacer un programa BASIC que te genere los DATA de una ROM para incrustar esos DATA en un programa tuyo.
Y precisamente, la version con BRAM es la que no da error, que es la que menos me proocupa
hikoki escribió: y por ultimo Hamster y Vlait (no es vlait un miembro de este foro?) comentan los timing extraños de Bombjack en este hilo:
Demasiada parrafada para mi, necesito un día para entender todo lo que ahí se habla, pero sigo pensando que el fallo no va por ahí.

Piensa que TODOS los cores que tengo del BombJack funcionan, en su hardware, pero funcionan. Aquí solo hay un problema, y es la versión del Papilio PLus con SRAM, que en el papilio funciona, y en el ZXUNO no, teniendo ambos un LX9, pero por diferencias de velocidades en SRAM, los tiempos que se calcularon en la versión papilio, no coinciden con los del ZXUNO, simplemente es eso, ni mas ni menos.

No tiene nada que ver toda la info sobre hacer el core que puedas encontrar, el fallo es únicamente al portarlo al ZXUNO, que tiene una SRAM mas rápida y los tiempos de ejecución se calcularon para una mas lenta.


En cuanto a lo que me comentas aqui --> viewtopic.php?f=32&t=1944&p=20912#p20911
Decirte, que la BRAM no se puede ahorrar cuando se habla de ROMS. No puedes comprimir una ROM, no es lógico. No es un PC que te permite tener archivos metidos en un RAR y con un programa ir cogiendo de ahí. Las ROM deben estar siempre accesibles a la CPU y completas, sino, la CPU solo verá datos falsos.
Lo de la velocidad de BRAM que dices, tampoco van por ahí los tiros, no tiene nada que ver con la BRAM, sino con la SRAM.

A ver si lo explico de forma sencilla, cosa difícil:
Hay dos versiones actualmente del core, una que mete todas las ROM en BRAM que fue la primera de todas, y es la que funciona, pero te obliga a tener una FPGA con al menos 112k de BRAM cuando el zxuno solo tiene 72k.
La otra versión es la que se llevó al Papilio PLus, por Hsmter, o como se diga, que como el LX9 (mismo fpga que zxuno) solo tiene 72k, lo que hizo fue meter, digamos 64k en BRAM, que es la parte que funciona, y el resto en SRAM.

El core que funciona a la primera sin hacer nada, necesita una fpga de buena capacidad, y el LX9 no sirve.
El core que usa SRAM funciona, pero funciona en el Papilio Plus por que su autor hizo un invento para "emular" ROMS a la velocidad que necesita la CPU y que coja los datos de la SRAM a la velocidad exacta a la que necesita mostrarlos en VGA.
Pero el ZXUNO lleva una SRAM diferente, mas rápida, y para mas "inri", en el ZXUNO las señales CS y OE van fijas, cuando en el Papilio las contrla la FPGA.
El core SRAM divide los tiempos de acceso a memoria en 64 unidades, y el señor que lo programó, hizo sus calculos en SU FPGA para que cada tiempo entregue un dato necesario a tiempo, para lo cual depuró en SU hardware.
Digamos que el tiempo-0 es para el primer dato de la primera rom, el segundo para la segunda rom, pero...... y aquí viene el problema, el tercer dato de la ROM NO corresponde con el tercer tiempo de ejecución, sino con el 12 creo recordar, y luego el cuarto dato, corresponde con el tiempo-32. A partir de ahí, entre el 32 y el 40 me parece, coinciden todos, y luego, del 41 al 64 son "pausas".

para que lo veas escrito:
0-rom0
1-rom1
2 a 12 pausas
13-rom3
14 a 31 pausas
32 a 40 restos de roms
41 a 64 pausas.

Para adaptar esos tiempos al ZXUNO hay que depurar cada rom por separado, para ver cuando la CPU accede a ella, y colocarla en el tiempo que necesite. (por ejemplo, la rom0 en el tiempo 3, etc)

Ese es a mi modo de ver el problema.

Ni que decir tiene que no es imposible, no es difícil, pero no seré yo quién lo haga, por que lleva un tiempo del que no dispongo. Prefiero dedicarme a otras cosas que a perder el tiempo dias y días buscando el sitio que corresponde a cada acceso a rom. Total, ya lo tengo funcionando, en el LX45.

¿que se me cruzan los cables y un día lo reviso y encuentro la solución? aleluya, pero de momento, ya me ha vuelto lo suficientemente loco con este core como para dedicarle mas tiempo. Ya vendrá alguno con la mente mas fresca y dará con el fallo que yo no veo con mi mente adormilada.


Por cierto, en esta zona está el cómo accede a las rom en el tiempo concreto en el que se necesita el dato, para que veas que no tiene un orden sencillo, que no es rom0-tiempo0, rom1-tiempo1, etc:
https://github.com/bhamadicharef/bombja ... p.vhd#L477
Está calculado de tal modo, que a la velocidad de la SRAM del papilio, la CPU pasa justo en el tiempo que le corresponde sobre el dato.
Si uno de esos tiempo se desfasa por velocidad, adios a la información (ejemplo, cuando el audio de un video se desfasa de la imagen, y en la mitad de la peli es tanto el desfase, que mejor dejar de verla)

hikoki
Mensajes: 307
Registrado: 21 Feb 2016, 01:38

Re: Placas Spartan 6 XC6SLX16

Mensaje por hikoki » 12 Ene 2018, 10:19

Gracias por el esfuerzo!!

Según comenta aquí alguien que ha portado BJ a una FPGA Altera, el código original de Papilio tiene implementado las EPROMS para usar en RAM interna solo que comentadas : http://rosenborg.homelinux.org/WP/?p=210

En este video de un port de BJ a Altera
https://m.youtube.com/watch?v=6u2O4z_Ccp4
hay un comentario de quien subió el video de BJ Xilinx :
Did you fix the RAM04 problem? If you look in my source code at the top of bombjack.vhd I also had that problem and fixed it:

"fixed: RAM4 fails self test, clock timing issue with 6L,M had to double clock frequency"

If you have this problem it may be because when you ported the game to a different platform you may have changed the timing to the 6L and 6M RAMs. You need to look closely at the clock and signal timing to these RAMs to find you problem, perhaps use a simulator if Altera has one.

Responder