Llevo un tiempo aprendiendo sobre la arquitectura de las CPUs y he diseñado con éxito un par de ellas. Siempre se basaron en el microcódigo para manejar las líneas de control de la CPU.
El microcódigo se almacena en un chip ROM y se direcciona componiendo una dirección de (1 = LSB):
- Banco
- Estados de las banderas de la CPU
- Instrucción
- Estado T
Tomemos mi última CPU como ejemplo de cómo se construye la dirección:
- Banco (3 bits) - Hay 48 líneas de control en mi CPU, así que necesito 6 bytes para almacenar todos los estados de las líneas de control. La parte del banco de la dirección me permite direccionar 6 bytes en la ROM del microcódigo.
- Estados de bandera de la CPU (3 bits) - He reducido mis banderas a cero , llevar y comparar . Se necesitan 3 bits para abordar todas las combinaciones
- Instrucción (8 bits) - El conjunto de instrucciones requiere más de 127 op-code, por lo que opto por 8 bits.
- T-state (5 bits) - Algunas instrucciones tardan más de 16 t-states en completarse (las más complejas como las condicionales CALL / RETURN) por lo que con 5 bits tengo espacio suficiente para hasta 32 t-states
El ejemplo final de la dirección ROM del microcódigo sería algo así:
[flags][instruction][t-state][bank]
[000][00000000][00000][000]
Ahora mi pregunta: En el ejemplo anterior, parece que he llegado al límite de lo que puedo hacer con este enfoque. La dirección de mi microcódigo ROM es de 19 bits y he encontrado un chip que lo soporta ( 29C040
) pero parece que no tengo muchas opciones si quiero una dirección grande.
Estoy pensando en mi próxima CPU que necesitará más banderas ( negativo , desbordamiento , paridad ), y quién sabe, tal vez incluso algunas líneas de control más o un poco más para los estados T.
¿Cuál sería un mejor enfoque para almacenar y direccionar mi microcódigo en ese caso?
Lo único que se me ocurre ahora es:
- Añadir más chips de ROM (sólo liberaría 1 bit extra por chip no parece un buen enfoque)
- Limitar el conjunto de instrucciones (además, sólo me daría 1 - quizás 2 - bits extra)
- Limitar el número de líneas de control, pero eso permitiría un menor control sobre la CPU...
Me pregunto cómo se resuelve esto en las CPUs profesionales basadas en microcódigos y qué me estoy perdiendo aquí.