Unidad aritmética lógica - Arithmetic logic unit

Una representación simbólica de una ALU y sus señales de entrada y salida, indicadas por flechas que apuntan hacia adentro o hacia afuera de la ALU, respectivamente. Cada flecha representa una o más señales. Las señales de control entran por la izquierda y las señales de estado salen por la derecha; los datos fluyen de arriba hacia abajo.

En informática , una unidad lógica aritmética (ALU) es un circuito digital combinacional que realiza operaciones aritméticas y bit a bit en números binarios enteros . Esto contrasta con una unidad de punto flotante (FPU), que opera con números de punto flotante . Es un bloque de construcción fundamental de muchos tipos de circuitos informáticos, incluida la unidad central de procesamiento (CPU) de las computadoras, las FPU y las unidades de procesamiento de gráficos (GPU).

Las entradas a una ALU son los datos sobre los que se operará, llamados operandos , y un código que indica la operación a realizar; La salida de la ALU es el resultado de la operación realizada. En muchos diseños, la ALU también tiene entradas o salidas de estado, o ambas, que transmiten información sobre una operación anterior o la operación actual, respectivamente, entre la ALU y los registros de estado externos .

Señales

Una ALU tiene una variedad de redes de entrada y salida , que son los conductores eléctricos que se utilizan para transmitir señales digitales entre la ALU y los circuitos externos. Cuando una ALU está funcionando, los circuitos externos aplican señales a las entradas de la ALU y, en respuesta, la ALU produce y transmite señales a los circuitos externos a través de sus salidas.

Datos

Una ALU básica tiene tres buses de datos paralelos que constan de dos operandos de entrada ( A y B ) y una salida de resultado ( Y ). Cada bus de datos es un grupo de señales que transmite un número entero binario. Normalmente, los anchos de bus A, B e Y (el número de señales que comprenden cada bus) son idénticos y coinciden con el tamaño de palabra nativa del circuito externo (por ejemplo, la CPU de encapsulación u otro procesador).

Código de operación

La entrada del código de operación es un bus paralelo que transmite a la ALU un código de selección de operación, que es un valor enumerado que especifica la operación aritmética o lógica deseada que debe realizar la ALU. El tamaño del código de operación (su ancho de bus) determina el número máximo de operaciones diferentes que puede realizar la ALU; por ejemplo, un código de operación de cuatro bits puede especificar hasta dieciséis operaciones ALU diferentes. Generalmente, un código de operación ALU no es lo mismo que un código de operación en lenguaje máquina , aunque en algunos casos puede estar codificado directamente como un campo de bits dentro de un código de operación en lenguaje máquina.

Estado

Salidas

Las salidas de estado son varias señales individuales que transmiten información complementaria sobre el resultado de la operación actual de la ALU. Las ALU de uso general suelen tener señales de estado como:

  • Ejecución , que transmite el acarreo resultante de una operación de suma, el préstamo resultante de una operación de resta o el bit de desbordamiento resultante de una operación de desplazamiento binario.
  • Cero , que indica que todos los bits de Y son cero lógico.
  • Negativo , que indica que el resultado de una operación aritmética es negativo.
  • Overflow , que indica que el resultado de una operación aritmética ha excedido el rango numérico de Y.
  • Paridad , que indica si un número par o impar de bits en Y es uno lógico.

Una vez completada cada operación de ALU, las señales de salida de estado generalmente se almacenan en registros externos para que estén disponibles para futuras operaciones de ALU (por ejemplo, para implementar aritmética de precisión múltiple ) o para controlar la bifurcación condicional . La colección de registros de bits que almacenan las salidas de estado a menudo se trata como un registro único de múltiples bits, que se denomina "registro de estado" o "registro de código de condición".

Entradas

Las entradas de estado permiten que la ALU disponga de información adicional al realizar una operación. Normalmente, se trata de un único bit de "transferencia" que es la transferencia almacenada de una operación de ALU anterior.

Operación de circuito

El circuito lógico combinacional del circuito integrado 74181 , que es una ALU simple de cuatro bits

Una ALU es un circuito lógico combinacional , lo que significa que sus salidas cambiarán de forma asincrónica en respuesta a los cambios de entrada. En el funcionamiento normal, se aplican señales estables a todas las entradas de la ALU y, cuando ha transcurrido el tiempo suficiente (conocido como " retardo de propagación ") para que las señales se propaguen a través de los circuitos de la ALU, el resultado de la operación de la ALU aparece en la ALU. salidas. Los circuitos externos conectados a la ALU son responsables de garantizar la estabilidad de las señales de entrada de la ALU durante toda la operación y de dar tiempo suficiente para que las señales se propaguen a través de la ALU antes de muestrear el resultado de la ALU.

En general, los circuitos externos controlan una ALU aplicando señales a sus entradas. Por lo general, los circuitos externos emplean lógica secuencial para controlar la operación de la ALU, que está marcada por una señal de reloj de una frecuencia suficientemente baja para asegurar el tiempo suficiente para que las salidas de la ALU se estabilicen en las peores condiciones.

Por ejemplo, una CPU comienza una operación de adición de ALU enrutando operandos desde sus fuentes (que generalmente son registros) a las entradas de operando de la ALU, mientras que la unidad de control aplica simultáneamente un valor a la entrada del código de operación de la ALU, configurándola para realizar la suma. Al mismo tiempo, la CPU también enruta la salida del resultado de ALU a un registro de destino que recibirá la suma. Las señales de entrada de la ALU, que se mantienen estables hasta el siguiente reloj, pueden propagarse a través de la ALU y al registro de destino mientras la CPU espera el siguiente reloj. Cuando llega el siguiente reloj, el registro de destino almacena el resultado de la ALU y, dado que la operación de la ALU se ha completado, las entradas de la ALU pueden configurarse para la siguiente operación de la ALU.

Funciones

Las ALU suelen admitir varias funciones aritméticas básicas y lógicas bit a bit. Las ALU básicas de propósito general generalmente incluyen estas operaciones en sus repertorios:

Operaciones aritmeticas

  • Suma : A y B se suman y la suma aparece en Y y se lleva a cabo.
  • Agregar con acarreo : A, B y acarreo se suman y la suma aparece en Y y acarreo.
  • Restar : B se resta de A (o viceversa) y la diferencia aparece en Y y se lleva a cabo. Para esta función, el llevar a cabo es efectivamente un indicador de "préstamo". Esta operación también puede usarse para comparar las magnitudes de A y B; en tales casos, la salida Y puede ser ignorada por el procesador, que solo está interesado en los bits de estado (particularmente cero y negativos) que resultan de la operación.
  • Restar con pedir prestado : B se resta de A (o viceversa) con pedir prestado (arrastre) y la diferencia aparece en Y y llevar a cabo (pedir prestado).
  • Complemento a dos (negado) : A (o B) se resta de cero y la diferencia aparece en Y.
  • Incremento : A (o B) se incrementa en uno y el valor resultante aparece en Y.
  • Decremento : A (o B) se reduce en uno y el valor resultante aparece en Y.
  • Pasar a través : todos los bits de A (o B) aparecen sin modificar en Y. Esta operación se usa típicamente para determinar la paridad del operando o si es cero o negativo, o para cargar el operando en un registro de procesador.

Operaciones lógicas bit a bit

  • AND : el AND bit a bit de A y B aparece en Y.
  • OR : el OR bit a bit de A y B aparece en Y.
  • O exclusivo : el XOR bit a bit de A y B aparece en Y.
  • Complemento de unos : todos los bits de A (o B) están invertidos y aparecen en Y.

Operaciones de cambio de bit

Ejemplos de desplazamiento de bits para una ALU de ocho bits
Tipo Izquierda Derecha
Desplazamiento aritmético Rotar a la izquierda logically.svg Girar aritméticamente a la derecha.svg
Cambio lógico Rotar a la izquierda logically.svg Rotar a la derecha logically.svg
Girar Girar a la izquierda.svg Girar a la derecha.svg
Girar a través del transporte Gire a la izquierda a través de carry.svg Gire a la derecha a través de carry.svg

Las operaciones de desplazamiento de ALU hacen que el operando A (o B) se desplace hacia la izquierda o hacia la derecha (según el código de operación) y el operando desplazado aparece en Y.Las ALU simples normalmente pueden cambiar el operando en una posición de solo un bit, mientras que las ALU más complejas emplean desplazadores de barril que les permite cambiar el operando por un número arbitrario de bits en una operación. En todas las operaciones de desplazamiento de un solo bit, el bit desplazado fuera del operando aparece en la ejecución; el valor del bit desplazado al operando depende del tipo de desplazamiento.

  • Desplazamiento aritmético : el operando se trata como unentero en complemento a dos , lo que significa que el bit más significativo es un bit de "signo" y se conserva.
  • Desplazamiento lógico : se desplaza un cero lógico al operando. Se utiliza para desplazar enteros sin signo.
  • Rotar : el operando se trata como un búfer circular de bits, por lo que sus bits menos y más significativos son efectivamente adyacentes.
  • Rotar mediante acarreo : el bit de acarreo y el operando se tratan colectivamente como un búfer circular de bits.

Aplicaciones

Aritmética de precisión múltiple

En los cálculos aritméticos de números enteros, la aritmética de precisión múltiple es un algoritmo que opera con números enteros que son más grandes que el tamaño de la palabra ALU. Para hacer esto, el algoritmo trata cada operando como una colección ordenada de fragmentos de tamaño ALU, ordenados desde el más significativo (MS) al menos significativo (LS) o viceversa. Por ejemplo, en el caso de una ALU de 8 bits, el entero de 24 bits se 0x123456trataría como una colección de tres fragmentos de 8 bits: 0x12(MS) 0x34, y 0x56(LS). Dado que el tamaño de un fragmento coincide exactamente con el tamaño de la palabra ALU, la ALU puede operar directamente en esta "pieza" de operando.

El algoritmo utiliza la ALU para operar directamente en fragmentos de operandos particulares y generar así un fragmento correspondiente (un "parcial") del resultado de precisión múltiple. Cada parcial, cuando se genera, se escribe en una región de almacenamiento asociada que se ha designado para el resultado de precisión múltiple. Este proceso se repite para todos los fragmentos de operando para generar una colección completa de parciales, que es el resultado de la operación de precisión múltiple.

En operaciones aritméticas (por ejemplo, suma, resta), el algoritmo comienza invocando una operación ALU en los fragmentos LS de los operandos, produciendo así tanto un parcial LS como un bit de ejecución. El algoritmo escribe el almacenamiento parcial en designado, mientras que la máquina de estado del procesador normalmente almacena el bit de ejecución en un registro de estado de ALU. Luego, el algoritmo avanza al siguiente fragmento de la colección de cada operando e invoca una operación ALU en estos fragmentos junto con el bit de acarreo almacenado de la operación ALU anterior, produciendo así otro parcial (más significativo) y un bit de ejecución. Como antes, el bit de acarreo se almacena en el registro de estado y el parcial se escribe en el almacenamiento designado. Este proceso se repite hasta que se han procesado todos los fragmentos de operandos, lo que da como resultado una colección completa de parciales almacenados, que comprenden el resultado aritmético de precisión múltiple.

En operaciones de desplazamiento de precisión múltiple, el orden de procesamiento de los fragmentos de operando depende de la dirección de desplazamiento. En las operaciones de desplazamiento a la izquierda, los fragmentos se procesan LS primero porque el bit LS de cada parcial, que se transporta mediante el bit de acarreo almacenado, debe obtenerse del bit MS del operando menos significativo previamente desplazado a la izquierda. A la inversa, los operandos se procesan MS primero en operaciones de desplazamiento a la derecha porque el bit MS de cada parcial debe obtenerse del bit LS del operando más significativo previamente desplazado a la derecha.

En operaciones lógicas bit a bit (por ejemplo, AND lógico, OR lógico), los fragmentos de operando pueden procesarse en cualquier orden arbitrario porque cada parcial depende solo de los fragmentos de operando correspondientes (se ignora el bit de acarreo almacenado de la operación ALU anterior).

Operaciones complejas

Aunque una ALU puede diseñarse para realizar funciones complejas, la mayor complejidad del circuito, el costo, el consumo de energía y el mayor tamaño resultantes hacen que esto no sea práctico en muchos casos. En consecuencia, las ALU a menudo se limitan a funciones simples que se pueden ejecutar a velocidades muy altas (es decir, retrasos de propagación muy cortos), y el circuito del procesador externo es responsable de realizar funciones complejas orquestando una secuencia de operaciones de ALU más simples.

Por ejemplo, calcular la raíz cuadrada de un número puede implementarse de varias formas, dependiendo de la complejidad de la ALU:

  • Cálculo en un solo reloj : una ALU muy compleja que calcula una raíz cuadrada en una operación.
  • Pipeline de cálculo : un grupo de ALU simples que calcula una raíz cuadrada en etapas, con resultados intermedios que pasan por ALU dispuestos como una línea de producción de una fábrica. Este circuito puede aceptar nuevos operandos antes de terminar los anteriores y produce resultados tan rápidos como la ALU muy compleja, aunque los resultados se retrasan por la suma de los retardos de propagación de las etapas de la ALU. Para obtener más información, consulte el artículo sobre canalización de instrucciones .
  • Cálculo iterativo : una ALU simple que calcula la raíz cuadrada a través de varios pasos bajo la dirección de una unidad de control .

Las implementaciones anteriores hacen la transición de las más rápidas y costosas a las más lentas y menos costosas. La raíz cuadrada se calcula en todos los casos, pero los procesadores con ALU simples tardarán más en realizar el cálculo porque se deben realizar varias operaciones de ALU.

Implementación

Una ALU generalmente se implementa como un circuito integrado (IC) independiente , como el 74181 , o como parte de un IC más complejo. En el último caso, una ALU se crea típicamente sintetizándola a partir de una descripción escrita en VHDL , Verilog o algún otro lenguaje de descripción de hardware . Por ejemplo, el siguiente código VHDL describe una ALU de 8 bits muy simple :

entity alu is
port (  -- the alu connections to external circuitry:
  A  : in signed(7 downto 0);   -- operand A
  B  : in signed(7 downto 0);   -- operand B
  OP : in unsigned(2 downto 0); -- opcode
  Y  : out signed(7 downto 0));  -- operation result
end alu;

architecture behavioral of alu is
begin
 case OP is  -- decode the opcode and perform the operation:
 when "000" =>  Y <= A + B;   -- add
 when "001" =>  Y <= A - B;   -- subtract
 when "010" =>  Y <= A - 1;   -- decrement
 when "011" =>  Y <= A + 1;   -- increment
 when "100" =>  Y <= not A;   -- 1's complement
 when "101" =>  Y <= A and B; -- bitwise AND
 when "110" =>  Y <= A or B;  -- bitwise OR
 when "111" =>  Y <= A xor B; -- bitwise XOR
 when others => Y <= (others => 'X');
 end case; 
end behavioral;

Historia

El matemático John von Neumann propuso el concepto ALU en 1945 en un informe sobre las bases de una nueva computadora llamada EDVAC .

El costo, tamaño y consumo de energía de los circuitos electrónicos fue relativamente alto durante la infancia de la era de la información . En consecuencia, todas las computadoras en serie y muchas de las primeras, como la PDP-8 , tenían una ALU simple que operaba en un bit de datos a la vez, aunque a menudo presentaban un tamaño de palabra más amplio para los programadores. Una de las primeras computadoras en tener múltiples circuitos ALU discretos de un solo bit fue el Whirlwind I de 1948 , que empleó dieciséis de tales "unidades matemáticas" para permitirle operar con palabras de 16 bits.

En 1967, Fairchild presentó el primer ALU implementado como circuito integrado, el Fairchild 3800, que consiste en un ALU de ocho bits con acumulador. Pronto surgieron otras ALU de circuito integrado, incluidas las ALU de cuatro bits como Am2901 y 74181 . Estos dispositivos eran típicamente capaces de " cortar bits ", lo que significa que tenían señales de "llevar adelante" que facilitaban el uso de múltiples chips ALU interconectados para crear una ALU con un tamaño de palabra más amplio. Estos dispositivos se hicieron populares rápidamente y se utilizaron ampliamente en miniordenadores de segmentos de bits.

Los microprocesadores comenzaron a aparecer a principios de la década de 1970. Aunque los transistores se habían vuelto más pequeños, a menudo no había espacio suficiente para una ALU de ancho de palabra completo y, como resultado, algunos de los primeros microprocesadores empleaban una ALU estrecha que requería múltiples ciclos por instrucción de lenguaje de máquina. Ejemplos de esto incluyen el popular Zilog Z80 , que realizó adiciones de ocho bits con una ALU de cuatro bits. Con el tiempo, las geometrías de los transistores se redujeron aún más, siguiendo la ley de Moore , y se volvió factible construir ALU más anchas en microprocesadores.

Los transistores de circuito integrado (IC) modernos son órdenes de magnitud más pequeños que los de los primeros microprocesadores, lo que hace posible la instalación de ALU altamente complejas en los IC. Hoy en día, muchas ALU modernas tienen anchos de palabra amplios y mejoras arquitectónicas como cambiadores de barril y multiplicadores binarios que les permiten realizar, en un solo ciclo de reloj, operaciones que habrían requerido múltiples operaciones en ALU anteriores.

Las ALU pueden realizarse como circuitos mecánicos , electromecánicos o electrónicos y, en los últimos años, se han llevado a cabo investigaciones sobre ALU biológicas (por ejemplo, basadas en actina ).

Ver también

Referencias

Otras lecturas

enlaces externos