Si fuera yo, lo que haría es centrarme primero en la parte grafica ¿por que? Porque es la parte más importante y costosa de implementar y la eleccion del procesador y el resto de componentes, depender de esto.
Realmente, teniendo el chip grafico, la consola se montará casi sola, sobre todo si la diseñais como os describo:
En teoría la consola está destinada a juegos 2D, de forma que los aficionados puedan desarrollarlos con cierta facilidad.
teniendo en cuenta el tema de la memoria de vídeo y estos detalles, yo creo que utilizar una resolucion de 320x200 (aquivalente al Modo X en los PC) es la mejor opcion, utilizando paleta.
320x200 a 8 bits, consume exactamente 64000 bytes y la paleta puede almacenarse tambien en esta memoria, en tan solo 768 bytes (3 valores para cada componente RGB) o 1024 bytes si preferimos alinear a 4 bytes.
Es decir, en tan solo 64KB podemos tener nuestra area de visualizacion de 320x200
Ahora lo que deberiamos plantearnos, es si nos interesa utilizar tecnica de doble buffer (para evitar parpadeos), si queremos utilizar una memoria de video independiente o si queremos acelerar los sprites con el hard de video.
De esto ultimo, dependerá (y mucho) la potencia del procesador necesaria para mover un juego.
Por ejemplo, yo tuve un Atari 520ST con un procesador 68000 a 8Mhz, y movia los juegos a esa resolucion sin necesitar de ninguna aceleracion con resultados muy satisfactorios. Si ahora se plantea utilizar un 68000 a 20Mhz, para una configuracion así, va sobrado.
Si utilizaramos aceleracion de sprites, de tal forma que el procesador cargase los sprites en la VRAM al inicio, y el hardware de video se ocupase de leer cierta area de video y componer un sprite en pantalla, utilizando el color 0 como 'transparencia ' , seguramente con un simple Z80 ya estamos servidos.
Sin embargo, hay que tener en cuenta otra cosa tambien: se necesita un circuito controlador de memoria en la consola, sobre todo si la idea es utilizar memorias que son mas rapidas que los procesadores que vamos a utilizar.
Utilizar un controlador de memoria y memoria rapida, nos permite, por un lado, adaptar la velocidad de acceso de dicha memoria a la del procesador, pero tambien dos cosas mas:
1) Si utilizamos el metodo de memoria compartida entre procesador de video y procesador principal, se pueden utilizar los ciclos de reloj en los que el procesador principal (mas lento) no accede a la RAM para que lo haga el procesador de video. La idea entonces, sería que el controlador de ram leyese el valor de RAM que pide el procesador y lo conservase en un latch que es lo que leería realmente la CPU a fin de dejar libre el acceso a la GPU. Con esto conseguimos que el procesador no se ralentice cuando la GPU accede a la RAM y se puede utilizar un bloque de memoria unificada.
2) El controlador de memoria puede ocuparse de mover bloques de memoria de forma mucho mas rapida (DMA) ya que puede ir al maximo de la velocidad de memoria.
Pongamos el ejemplo de una memoria que puede trabajar a 200MHZ y nuestra CPU de 20MHZ. Obviamente, si la CPU accede mediante el controlador de memoria, el dato seria leido a 200Mhz y suministrado a la CPU a los 20MHZ de bus mediante el latch (eso significa que el controlador de memoria, una vez leido o escrito el dato en RAM, debería liberar las lineas de la RAM, claro)
El controlador podria utilizar un contador, de forma que en el primer paso se ocupara de los accesos de la GPU y en el segundo, de la CPU. Eso nos daria una velocidad maxima de acceso de 100MHZ en el caso propuesto. Luego la GPU podria leer esa memoria a 100MHZ como poco y la CPU otros 100MHZ, siendo su acceso real a 20MHZ, lo cual nos deja margen, con un poco de maña para implementar canales DMA utilizando un sistema de memoria unificada y compartida, sin que se provoquen ralentizaciones de ningún tipo.
Un canal DMA con una velocidad menor de acceso, podria ocuparse del sonido: un simple loop en memoria y un volcado directo hacia un DAC para producirlo (no es esencial que utilice las frecuencias de audio habituales, podria ser una simple division de la frecuencia de reloj del sistema)
Todo esto se podria implementar desde una fpga de las que hablais:
logica de dma:
int flag; // registro de flags
byte * addr_s; // registro direccion fuente
byte * addr_d; // registro direccion destino
int size_x; // registro bytes a mover
int skip; // registro bytes a saltar
int size_y; // numero de repeticiones (usado en sprites)
int temp_x; // registro temporal
if(flag & 1) // DMA activa
{
while(size_y!=0) // si size_y distinto de cero buclea
{
temp_x=size_x;
while(temp_x!=0)
{
if(flag & 2) // sprite, usa el valor 0 como transparencia
{ if(addr_src[0]!=0) addr_dst[0]=addr_src[0];
}
else addr_dst[0]=addr_src[0];
addr_dst+=1;
addr_src+=1;
temp_x--;
}
addr_dst+=skip;
size_y--;
}
flag=0; // se terminó
}
Llevando a cabo una rutina asi, se puede hacer un desplazamiento desde memoria a memoria de video y representar un sprite en pantalla de forma correcta, ya que dispone de todo lo necesario para dibujar un cuadrado en pantalla byte a byte, usando el valor 0 como valor de transparencia. Esto hecho por logica programable facilita mucho las cosas y no es tan necesario una CPU potente.