En el nivel más bajo, considera algo como microcódigo . De eso estaba hablando Wouter cuando mencionó las arquitecturas de palabras de instrucción muy largas.
Una CPU es una colección de buses, registros, memorias y unidades lógicas aritméticas (ALU). Cada uno de estos hace cosas simples y finitas. Cualquier instrucción de nivel superior es un conjunto coordinado de acciones entre todos los bloques. Por ejemplo, las operaciones de bajo nivel para agregar un valor de ubicación de memoria en el acumulador podrían ser:
- Habilite la dirección del operando en el bus de dirección de memoria. Supongamos que la memoria está siempre en modo de lectura cuando no se está escribiendo explícitamente.
- Habilite el acumulador en la entrada ALU 1.
- Habilite el bus de datos de memoria en la entrada ALU 2.
- Establezca la operación de ALU en adición.
- Espere el número mínimo de tics de reloj para que sepa que la salida de la ALU se ha resuelto. En este caso, incluye el tiempo de lectura de la memoria, el tiempo de propagación de ALU y cualquier tiempo de propagación de la ruta de datos intermedia.
- Enganche la salida de ALU en el acumulador.
Cuando lo desglosas en las operaciones básicas de hardware, observas que organizar una instrucción consiste principalmente en enrutar datos a los lugares correctos en la secuencia correcta. Si esto se implementara con lógica descrita, el # 1 estaría afirmando una línea de habilitación de salida única de un búfer de tres estados que controla el bus de direcciones de memoria. Los # 2 y # 3 también requieren la afirmación de una sola línea. # 4 es un poco diferente, ya que la ALU suele ser un bloque lógico fijo en sí mismo y, a menudo, tiene un conjunto de líneas que codifican la operación. Por ejemplo, 000 podría pasar la entrada 1 a la salida, 001 agregar ambas entradas a la salida, 010 lógicas Y ambas entradas a la salida, etc.
El punto es que, en el nivel descrito anteriormente, cada instrucción solo afirma un determinado conjunto de líneas de control en secuencia, posiblemente con tiempos de espera mínimos entre algunas acciones. Una CPU reducida podría simplemente vincular cada bit en la palabra de instrucción a una de estas líneas de control. Eso sería simple y altamente flexible, pero un inconveniente es que la palabra de instrucción debería ser bastante amplia para contener todas las líneas de control necesarias y un campo de dirección de operando. La memoria de instrucciones se usa muy ineficientemente.
Hace muchos años, había máquinas con arquitectura microcodificada. Funcionaron como lo describí en el nivel bajo, pero estas microinstrucciones no eran lo que usted escribió cuando programó la máquina. Cada instrucción de nivel de usuario esencialmente inició una pequeña rutina de microcódigo. Las instrucciones para el usuario ahora serían más compactas con menos información redundante en ellas. Esto fue bueno porque podría haber muchos de ellos y la memoria era limitada. Pero el control de bajo nivel real del hardware se realizó desde microcódigo. Esto se almacenó en una memoria especial, amplia, rápida y, por lo tanto, costosa, pero no tenía que ser muy grande porque solo había unas pocas instrucciones de microcódigo para cada código de operación de nivel de usuario.
Hoy en día, las máquinas relativamente simples como los microcontroladores no tienen microcódigo. El conjunto de instrucciones se ha hecho un poco más simple y más regular para que pueda ser descodificado directamente por el hardware, aunque ese hardware puede tener una especie de secuenciador o máquina de estados que no es exactamente un motor de microcódigo pero que hace ese trabajo con lógica combinatoria con etapas de tubería donde las cosas se retrasan esperando en los bordes del reloj. Esta es una de las razones, por ejemplo, que los PIC más pequeños tienen un reloj de CPU que es 4 veces el reloj de instrucciones. Eso permite 4 bordes de reloj por instrucción, lo que es útil para administrar los retrasos de propagación a través de la lógica. Parte de la documentación del PIC incluso le indica en qué bordes Q qué operaciones se realizan.
Por lo tanto, si desea poner en marcha algo muy básico, intente implementar solo una máquina de microcódigo. Es posible que necesite una palabra de instrucción de 24 bits o más ancha, pero para la demostración y el aprendizaje está bien. Cada bit controla un solo reloj flip flop, habilita la línea o lo que sea. También necesitará alguna forma de secuenciar a través de las instrucciones y hacer la bifurcación condicional. Una forma de fuerza bruta es poner una nueva dirección para un posible uso, dependiendo del resultado de alguna operación condicional directamente en la palabra de microcódigo.