¿Cómo interpreta un chip los diferentes códigos de operación?

3

Aprendí en la escuela sobre los códigos de operación y cómo funciona con la ALU para agregar números, y por eso, ahora es mi pregunta cómo la computadora puede entender esto, porque son códigos y la computadora necesita algo para traducir eso a haciendo eso, ¿no? (corrígeme si me equivoco por favor) También quiero, cuando entiendo eso, hacer mi propio procesador para poder aprender la computadora de abajo hacia arriba y convertirme en un buen ingeniero informático.

    
pregunta user1009013

4 respuestas

6

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:

  1. 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.

  2. Habilite el acumulador en la entrada ALU 1.

  3. Habilite el bus de datos de memoria en la entrada ALU 2.

  4. Establezca la operación de ALU en adición.

  5. 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.

  6. 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.

    
respondido por el Olin Lathrop
4

Cualquier traducción de un conjunto de códigos a otro conjunto de códigos puede hacerse mediante una lógica simple (conceptualmente). Una ROM, por ejemplo, hará. Un procesador simple (sin canalización ni microprogramado) traduce (partes de) las instrucciones a bits que controlan las distintas partes de hardware dentro de la CPU, como la función ALU, la selección de registros y las líneas de control para búferes, multiplexores, selecciones de lectura / escritura, etc. .

Un caso interesante es el tipo de arquitectura de palabras de instrucción muy largas, donde no hay tal traducción: los bits en la instrucción controlan directamente las funciones dentro de la CPU.

    
respondido por el Wouter van Ooijen
3

Solo agregando a las respuestas de Wouter .

Para mantener las cosas simples, imagine que un código de operación representa las señales de control reales dentro de un chip. Para un procesador imaginario, un código de operación para ADD, R1, R2, R3 puede ser:

1111 0001 0010 0011

El primer '1111' puede representar la operación AGREGAR y puede usarse como una señal de control directo a la ALU para seleccionar la operación de adición. Para este procesador imaginario, es 1111, pero los procesadores del mundo real deberán consultar el documento de Arquitectura de conjunto de instrucciones (ISA) para los bits reales.

Los otros tres representan los operandos: R1, R2 y R3. Todas estas señales se pueden conectar directamente a las unidades de función internas del procesador. Si se necesita una traducción entre el código de operación y las señales de control, algo tan simple como una ROM hará.

    
respondido por el sybreon
1

Aunque no voy a repetir lo mismo discutido en varios lugares, estoy compartiendo un enlace a una publicación que encontré en el intercambio de pila de "Programadores". Aquí una respuesta de Lie Ryan para la pregunta anterior se discute en detalle Con aspectos eléctricos y de programación.

    
respondido por el Ela

Lea otras preguntas en las etiquetas