¿Cómo le dice el Código de instrucción a un sumador automático qué hacer? (Charles Petzold Code book, Capítulo 17 Automatización)

1

Estoy leyendo el Capítulo 17 del Código del libro de Charles Petzold (que es excelente) y en él describe un sumador automático al que agrega diferentes Códigos de Operación o Códigos de Instrucciones.

En el diagrama, tiene una salida para un pestillo de 8 bits que dice "Código", pero no se conecta a ninguna otra cosa.

Me pregunto cómo el código Op. instruye / le dice al sumador qué hacer (agregar / restar / saltar / detener / etc).

Supongo que debe cambiar las señales de control para diferentes partes del sumador, pero ¿cómo reconoce cada código de operación?

¿Son muchas puertas AND e inversores? ¿Que se conectan a las entradas de señal de control de las otras partes?

Gracias y, por cierto, soy un novato que trata de entender y aún no tengo transistores, chips o cualquier otra cosa, ¡así que es posible que no entienda nada más que la explicación de un lego! Y disculpe si esta pregunta es un poco básica.

    
pregunta Ystan

3 respuestas

1

No tengo este libro.

El "decodificador" transforma los códigos de operación en señales para controlar las distintas unidades de ejecución (alu, rama, ...) y seleccionar los registros.

Las CPU RISC tradicionales tienen codificaciones relativamente simples en las que hay campos casi fijos para seleccionar las operaciones. Esto es mucho menos cierto en CPU como x86.

(Ejemplo, algunas instrucciones de MIPS: enlace )

Luego, para la parte aritmética / lógica, no hay sumador, restador, y, o bloques separados seleccionados con multiplexores. Muchas operaciones se combinan en circuitos multipropósito, por ejemplo, sumador / restador / negar.

    
respondido por el TEMLIB
0

No tengo el libro 'Código' de Charles Petzold.

Leyendo su pregunta, no parece que el libro haya comunicado el concepto básico de una unidad de lógica aritmética (también conocida como ALU).

Si busca en la web la Unidad de lógica aritmética, o ALU, encontrará muchas explicaciones útiles, por ejemplo wikipedia Arithmetic_logic_unit

Todas las unidades centrales de procesamiento (CPU) tienen una o más ALU. La ALU funciona con valores binarios de múltiples bits, por ejemplo, de 8 bits (bytes), 16 o 32 bits de palabras. La ALU implementa las operaciones de 'procesamiento de datos' como sumar, restar, negar, etc., utilizando los valores de múltiples bits para representar números binarios. La ALU implementa operaciones booleanas a modo de bits como y , o , no (complemento de bits), utilizando los valores de múltiples bits como grupos de pedacitos La ALU puede cambiar el valor de múltiples bits a la izquierda de la derecha (generalmente a través de algún bit interno); El cambio es importante para multiplicar y dividir operaciones, entre otros usos. La ALU también se utiliza para probar valores de bits múltiples para valores cero o negativos, o comparar dos valores de bits múltiples para igualdad, menor que, mayor que etc.

La CPU decodifica las instrucciones para seleccionar la función apropiada de la ALU. Puede pensar en su configuración dinámica de las capacidades de las ALU. La ALU es capaz de aplicar un rango de combinaciones lógicas booleanas a sus datos de entrada (operandos). La ALU funciona con uno o dos valores de múltiples bits, más unos pocos bits internos de estado que representan operaciones anteriores (estos bits se mantienen en el registro de estado. La CPU puede usar esos bits de estado, por ejemplo, para controlar la bifurcación condicional.

El decodificador de CPU está utilizando algunos de los bits de la instrucción para crear un conjunto de señales (el 'patrón de bits' de la señal de control de la ALU), lo que hará que la ALU aplique la función lógica correcta a sus datos (operandos). / p>

Puede consultar una hoja de datos para Texas Instruments de 4 bits de ancho SN74181 ALU para la Para ver cómo funciona esto. Es un chip muy antiguo, diseñado para ser utilizado para hacer una CPU, antes de la llegada de los microprocesadores. Por ejemplo, la Tabla 1 muestra todas las funciones que la ALU puede aplicar a sus operandos, junto con sus señales de control.

    
respondido por el gbulmer
0

Bueno, TENGO el libro :)

Si echa un vistazo a las instrucciones cubiertas en el Capítulo 17, y enumera los códigos de operación en forma binaria, son los siguientes:

I I I I   I I I I
7 6 5 4   3 2 1 0

0 0 0 1   0 0 0 0  LOD         !I7 !I6 !I5  I4  !I3 !I2 !I1 !I0
0 0 0 1   0 0 0 1  STO         !I7 !I6 !I5  I4  !I3 !I2 !I1  I0

0 0 1 0   0 0 0 0  ADD         !I7 !I6  I5 !I4  !I3 !I2 !I1 !I0
0 0 1 0   0 0 0 1  SUB         !I7 !I6  I5 !I4  !I3 !I2 !I1  I0
0 0 1 0   0 0 1 0  ADC         !I7 !I6  I5 !I4  !I3 !I2  I1 !I0
0 0 1 0   0 0 1 1  SBB         !I7 !I6  I5 !I4  !I3 !I2  I1  I0

0 0 1 0   0 1 x x  future ALU  !I7 !I6  I5 !I4  !I3  I2   x   x
0 0 1 0   1 0 x x  future ALU  !I7 !I6  I5 !I4   I3 !I2   x   x
0 0 1 0   1 1 x x  future ALU  !I7 !I6  I5 !I4   I3  I2   x   x

0 0 1 1   0 0 0 0  JMP         !I7 !I6  I5  I4  !I3 !I2 !I1 !I0
0 0 1 1   0 0 0 1  JZ          !I7 !I6  I5  I4  !I3 !I2 !I1  I0
0 0 1 1   0 0 1 0  JC          !I7 !I6  I5  I4  !I3 !I2  I1 !I0  
0 0 1 1   0 0 1 1  JNZ         !I7 !I6  I5  I4  !I3 !I2  I1  I0

1 1 1 1   1 1 1 1  HLT          I7  I6  I5  I4   I3  I2  I1  I0

En el byte de instrucciones, los 4 bits más a la izquierda (I7 a I4) determinan el tipo de instrucción principal (1xh para carga / almacenamiento, 2xh para sumar / restar, 3xh para saltos y FFh para detener) y los cuatro bits más a la derecha ( I3 a través de I0) sirven como modificadores. (Ix significa bit x del byte de instrucción). Estoy usando la convención de libros de un sufijo 'h' para hex, en lugar de un prefijo 0x como se usa en C y otros idiomas.

En el diagrama del libro, la salida de los enclavamientos de 8 bits (etiquetados como "Código") para los 8 bits superiores de la instrucción de 24 bits se debería haber mostrado al entrar en un circuito de decodificación. Y tiene razón, en la forma más simple es solo un montón de compuertas AND inversores (por lo tanto, los dos sentidos de cada bit están disponibles).

Como se muestra a la derecha para cada código de operación, el byte de instrucciones se puede decodificar utilizando los AND de 8 entradas, junto con los inversores según sea necesario. ! I7 es lo mismo que \ $ \ small \ overline {\ text {I7}} \ $, pero descubrí que no puedo usar barras en tablas como esta.

Pero si tiene una línea que va hacia la ALU que dice hacer una suma o una resta, es probable que desee descodificar solo los 6 bits más a la izquierda:

0 0 1 0   0 0 x 0  any ADD/SUB !I7 !I6  I5 !I4  !I3 !I2   x  x

y úselo para indicar a la ALU que realice una operación de suma / resta; luego ejecute I0 en el cable ALU que le indica si debe hacer una suma (0) o restar (1); y ejecute I1 en el cable ALU que indica si se debe usar carry / borrow (1) o no (0).

Del mismo modo, también descodificarías parcialmente los 6 bits de la izquierda para un salto:

0 0 1 1   0 0 x x  any JMP     !I7 !I6  I5  I4  !I3 !I2   x   x

y luego deje que los dos bits más a la derecha (I0 e I1) determinen el tipo utilizando un decodificador de 2 a 4. Por lo tanto, no es necesario que siempre decodifique los 8 bits del byte de instrucciones por separado para cada código de operación.

Note que decodifiqué los bits I3 e I2 como 0 para los opcodes de suma y resta, aunque no son necesarios en este momento; esto deja 12 códigos de operación más posibles (un total de 16) para el grupo de instrucciones 2xh, marcado como "futuro" en la tabla anterior. Es probable que estos se utilicen para operaciones adicionales en la ALU, como operaciones lógicas (AND, OR, XOR, NOT) y turnos. Lo mismo se podría hacer para el grupo de salto (3xh).

Si observa otra de mis respuestas aquí , donde analizo los circuitos para un segmento de 1 bit. de la ALU para el 8085, verá que no hay líneas específicas para operaciones como AND, OR, XOR o incluso ADD y SUB dentro de la ALU. En su lugar, hay una serie de líneas de control especiales con nombres como select_op1 y force_ncarry_1 que determinan cómo la ALU procesa las entradas y produce un resultado. Varias combinaciones de estas líneas especiales se habilitan según sea necesario por cada código de operación que se ejecuta (consulte la tabla en la respuesta vinculada).

Otra forma de extender las instrucciones de la clase 2xh es agregar un modo inmediato. Petzold no entra en esto en su libro, pero un modo de direccionamiento inmediato simplemente significa usar el valor del operando de la instrucción directamente (en este caso, los 16 bits más bajos), en lugar de usar el operando como un 16 dirección de bit en RAM.

Comparando los dos:

ADD A, [4000h]         adds the contents of memory location 4000h to the accumulator A

ADD A, #4000h          adds the value 4000h to the accumulator A

Para manejar este segundo modo de direccionamiento, podemos (como ejemplo) usar el bit I3 para identificar el direccionamiento inmediato: I3 = 0, dirección de memoria, I3 = 1, direccionamiento inmediato. Así que ahora las instrucciones ALU se ven así:

0 0 1 0   0 0 0 0  ADD         !I7 !I6  I5 !I4  !I3 !I2 !I1 !I0
0 0 1 0   0 0 0 1  SUB         !I7 !I6  I5 !I4  !I3 !I2 !I1  I0
0 0 1 0   0 0 1 0  ADC         !I7 !I6  I5 !I4  !I3 !I2  I1 !I0
0 0 1 0   0 0 1 1  SBB         !I7 !I6  I5 !I4  !I3 !I2  I1  I0

0 0 1 0   0 1 x x  future ALU  !I7 !I6  I5 !I4  !I3  I2   x   x

0 0 1 0   1 0 0 0  ADD#        !I7 !I6  I5 !I4  !I3 !I2 !I1 !I0
0 0 1 0   1 0 0 1  SUB#        !I7 !I6  I5 !I4  !I3 !I2 !I1  I0
0 0 1 0   1 0 1 0  ADC#        !I7 !I6  I5 !I4  !I3 !I2  I1 !I0
0 0 1 0   1 0 1 1  SBB#        !I7 !I6  I5 !I4  !I3 !I2  I1  I0

0 0 1 0   1 1 x x  future ALU# !I7 !I6  I5 !I4   I3  I2   x   x

He marcado las nuevas instrucciones con un # después del mnemónico.

Esto reduce el número máximo de códigos de operación de ALU únicos en el grupo 2xh de 16 a 8, pero esto aún deja espacio para AND, OR y XOR, incluidas sus contrapartes inmediatas. NOT (que solo funciona en el acumulador) no tiene operandos y, por lo tanto, no tiene una versión inmediata.

    
respondido por el tcrosley

Lea otras preguntas en las etiquetas