Cómo minimizar la complejidad del microcódigo en una CPU casera de 8 bits

tldr; Construí y luego amplié la computadora de tablero de 8 bits Ben Eaters. Después de la compilación inicial, integré un contador de programa de 16 bits y registros de direcciones de memoria, rediseñé el conjunto de instrucciones y logré acceder a 64 kB de RAM. En el futuro, agregué registros X e Y de 8 bits como registros de contador comparables a X e Y del 6502/10. Con estos 2 registros adicionales, la organización del microcódigo y el tamaño necesario de la ROM ya son incómodamente grandes. ¿Cómo puedo manejar mejor la organización del microcódigo?

Detalles: En el diseño actual ya tengo 7 registros de 8 bits (A, B, ALU, salida, registro de instrucciones, contadores X e Y). Además, tengo 2 registros de 16 bits (contador de programa, registro de dirección de memoria) y un registro de banderas de 2 bits.

Actualmente uso 3 ROM para microcódigo, cada una con un ancho de dirección de 11 bits, por lo tanto, 2 kB cada una y 6 kB en total. Las ROM actualmente decodifican la salida de 18 señales de control para manejar la entrada y salida de todo el hardware conectado al bus único de 8 bits.

Los 11 bits de entrada para las ROM del decodificador están formados por 6 bits de la instrucción (lo que me deja con solo 64 instrucciones como máximo), 2 bits de banderas y 3 bits de un contador de subpasos de instrucción.

El diseño funciona de maravilla, pero me pregunto cómo puedo seguir administrando el microcódigo, si extiendo el diseño aún más. Planeo tener más buses (datos, direcciones, ALU separadas), más banderas, más registros. Me temo que la gran cantidad de bits de entrada necesarios para las ROM de instrucciones aumentará su tamaño con bastante rapidez. Por otro lado, la necesidad de líneas de control también crece con bastante rapidez.

Posibles soluciones que veo: Mi diseño actual tiene la ventaja de que todas las instrucciones son súper rápidas y necesitan entre 2 y 6 ciclos como máximo. Podría, por ejemplo, deshacerme de las líneas de control reduciendo su número y usar registros de desplazamiento para formar señales de control secuencialmente. Pero esto me costó muchos ciclos por instrucción ASM y ralentizaría drásticamente la máquina. El problema de las señales de entrada está completamente sin resolver.

No tengo educación formal en ese campo, por lo tanto, perdone mi pregunta ingenua. Me gustaría entender cómo los ingenieros de hardware en los años 70 y 80 resolvieron estos problemas en CPU como la RCA 1802, la MOS 6502 o la Z80. ¿Hay conceptos de los que no soy consciente? ¿Dónde puedo aprender sobre estos? ¿Alguien puede ayudar aquí?

Tradicionalmente, estas CPU se diseñaron completamente sin microcódigo. El decodificador de instrucciones era una lógica cableada y el ISA se diseñó con mucho cuidado para minimizar la lógica involucrada. (por ejemplo, organice los formatos de instrucción para que 3 bits de la dirección de la instrucción se registren directamente) ¡Al menos eso minimiza el microcódigo! El microcódigo era una forma de manejar la complejidad del decodificador cableado... La extensión de una CPU existente conduce al Z80 (del 8080) y al x86 (del 8086). En algún momento, es mejor comenzar de nuevo con un conjunto de instrucciones limpio, pero eso pierde la compatibilidad con versiones anteriores.
Gracias @user_1818839, la compatibilidad con versiones anteriores no es un problema para mí, pero descartaría la lógica combinatoria como reemplazo de microcódigo, porque sería demasiado complejo al intentar implementarlo basado únicamente en chips ttl 74xx. Genero mi microcódigo mediante programación, pero un problema, por ejemplo, es que duplico el tamaño de la ROM de mi microcódigo con cada nueva línea de entrada, por ejemplo, una nueva bandera. Y la mayoría de las páginas de la ROM están llenas actualmente con muy pocos bytes. Estoy buscando un esquema de codificación diferente.
Esta pregunta es demasiado amplia tal como está. Pero, en general, ha sobreextendido la arquitectura básica de microcódigo que indicó. Por ejemplo, alimentar entradas de "bandera" directamente en la ROM como bits de dirección es aceptable cuando solo hay un número trivial de ellos, pero a medida que su sistema crece, necesita ampliar su arquitectura. Intente introducir sus banderas en un multiplexor controlado por unos pocos bits de salida de la ROM, y luego solo tiene una salida del mux que retroalimenta la dirección de la ROM.
Tal vez buscar una copia del 'diseño de microprocesador bitslice' de mick y brick. Además, se pueden obtener interesantes sugerencias de diseño al observar los esquemas de las computadoras antiguas. Por ejemplo, pdp11 y sus controladores de disco duro.

Respuestas (1)

Tal vez podría usar algo de multiplexación/consolidación. Tal vez puedas usar las mismas líneas para diferentes contextos. Si tiene un indicador de repetición, es probable que no sea útil para las operaciones ALU de registro a registro, por lo que para operaciones como esa, algunas de las líneas podrían hacer otra cosa. Sospecho que su ROM de microcódigo ya tiene una serie de lagunas, solo que no puede alcanzarlas.