jepalza escribió:Pero si pongo este otro código
Código: Seleccionar todo
vga_r <= (std_logic_vector(r));
vga_g <= (std_logic_vector(g));
vga_b <= ('0' & std_logic_vector(b));
Resulta que si funciona. (nota la diferencia sutil de sumar un '0' delante o detrás del color azul.
Los registros están bien direccionados, los colores se ven bien. Son de 3+3+2 bits y por eso al azul debo sumarle un bit para sacarlo hacia el ZXUNO que usa 3+3+3.
Pregunta: ¿que tiene que veer el bit del color azul delante o detrás para que el juego se congele?
Cuando un cambio pequeño hace que un diseño deje de funcionar, o funciona de forma muy diferente, a menudo es síntoma de que el sintetizador ha descubierto que cierta parte de la lógica no se usa (por ejemplo porque no está conectada a nada) y por tanto la elimina del circuito final. Este tipo de cosas suele pasar por ejemplo cuando en una CPU se te olvida conectar el reloj, que coge el sintetizador y te borra la CPU por completo del diseño.
Mira, por tanto, en un caso y en otro, si cambia de forma considerable el número de slices y LUTs que se usan, ya que ahí tendrías un indicio de que el sintetizador ha eliminado lógica.
Por supuesto, mirar también el informe de síntesis, que es donde se te indica qué se ha borrado y por qué.
Respecto a la forma de generar el color azul, yo te sugeriría otra forma: poner un 0 antes o después vale, pero no tienes el rango de colores que podrías llegar a tener. Una forma, más o menos común de solventar esto consiste en añadir a la derecha del valor, el bit más significativo de dicho valor. O sea:
(suponiendo que esto esté bien escrito en VHDL)