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 . [1] [2] [3] 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). [4]
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 de 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 de 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 se almacenan generalmente 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 varios 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
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 pasado 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 permitir el 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: [1] [2] [3] [5]
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
Tipo | Izquierda | Derecha |
---|---|---|
Desplazamiento aritmético | ||
Cambio lógico | ||
Girar | ||
Girar a través del transporte |
Operaciones de desplazamiento ALU causan operando A (o B) de desplazamiento a la izquierda o la derecha (según el código de operación) y la desplazado operando aparece en Y. ALUs simple típicamente pueden cambiar el operando por sólo una posición de bit, mientras que ALUs emplean más complejas de desplazamiento reconfigurable 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. Esto se usa 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 0x123456
tratarí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 pasan 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 :
la entidad alu es el puerto ( - las conexiones alu a la circuitería externa: A : con signo ( 7 downto 0 ); - operando A B : in firmado ( 7 downto 0 ); - operando B OP : in unsigned ( 2 downto 0) ); - código de operación Y : salida con signo ( 7 hacia abajo a 0 )); - operación resultado final alu ;el comportamiento de la arquitectura de alu es begin case OP is - decodifica el código de operación y realiza la operación: cuando "000" => Y <= A + B ; - agregar cuando "001" => Y <= A - B ; - restar cuando "010" => Y <= A - 1 ; - decremento cuando "011" => Y <= A + 1 ; - incremento cuando "100" => Y <= no A ; - Complemento de 1 cuando "101" => Y <= A y B ; - bit a bit AND cuando "110" => Y <= A o B ; - OR bit a bit cuando "111" => Y <= A xor B ; - XOR bit a bit cuando otros => Y <= ( otros => 'X' ); caso final ; final conductual ;
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 . [6]
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. [7] 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. [8] 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 anchos 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 [9] [ verificación fallida ] y, en los últimos años, se han llevado a cabo investigaciones sobre ALU biológicas [10] [11] (por ejemplo, basadas en actina ). [12]
Ver también
- Adder (electrónica)
- Unidad de generación de direcciones
- Unidad de carga y almacenamiento
- Multiplicador binario
- Unidad de ejecución
Referencias
- ^ a b A.P. Godse; DAGodse (2009). "3". Diseño de lógica digital . Publicaciones técnicas. págs. 9–3. ISBN 978-81-8431-738-1.
- ^ a b Educación y capacitación en liderazgo (LET) 2: Texto programado . Cuartel General, Departamento del Ejército. 2001. págs. 371–.
- ^ a b APGodse; DAGodse (2009). "Apéndice". Circuitos lógicos digitales . Publicaciones técnicas. págs. C – 1. ISBN 978-81-8431-650-6.
- ^ "1. Introducción a la arquitectura informática - Diseño de hardware integrado, 2ª edición [Libro]" . www.oreilly.com . Consultado el 3 de septiembre de 2020 .
- ^ Horowitz, Paul ; Winfield Hill (1989). "14.1.1". El arte de la electrónica (2ª ed.). Prensa de la Universidad de Cambridge. págs. 990-. ISBN 978-0-521-37095-0.
- ^ Philip Levis (8 de noviembre de 2004). "Jonathan von Neumann y EDVAC" (PDF) . cs.berkeley.edu . pp. 1, 3. Archivado desde el original ( PDF ) el 23 de septiembre de 2015 . Consultado el 20 de enero de 2015 .
- ^ Lee Boysel (12 de octubre de 2007). "Making Your First Million (y otros consejos para aspirantes a emprendedores)" . U. Mich. Presentación EECS / Grabaciones ECE . Archivado desde el original el 15 de noviembre de 2012.
- ^ Ken Shirriff. "El Z-80 tiene una ALU de 4 bits. Así es como funciona". 2013, righto.com
- ^ Reif, John H. (2009), Meyers, Robert A. (ed.), "Computación mecánica: la complejidad computacional de los dispositivos físicos" , Enciclopedia de complejidad y ciencia de sistemas , Nueva York, NY: Springer, págs. 5466–5482 , doi : 10.1007 / 978-0-387-30440-3_325 , ISBN 978-0-387-30440-3, consultado el 2020-09-03
- ^ Lin, Chun-Liang; Kuo, Ting-Yu; Li, Wei-Xian (14 de agosto de 2018). "Síntesis de la unidad de control para el futuro biocomputador" . Revista de Ingeniería Biológica . 12 (1): 14. doi : 10.1186 / s13036-018-0109-4 . ISSN 1754-1611 . PMC 6092829 . PMID 30127848 .
- ^ Gerd Hg Moe-Behrens. "El microprocesador biológico, o cómo construir una computadora con partes biológicas" .
- ^ Das, Biplab; Paul, Avijit Kumar; De, Debashis (16 de agosto de 2019). "Un diseño de unidad lógica aritmética no convencional y computación en actina Quantum Cellular Automata" . Tecnologías de microsistemas . doi : 10.1007 / s00542-019-04590-1 . ISSN 1432-1858 .
Otras lecturas
- Hwang, Enoch (2006). Diseño de microprocesador y lógica digital con VHDL . Thomson. ISBN 0-534-46593-5.
- Stallings, William (2006). Organización y Arquitectura de Computadoras: Diseño para el Desempeño (7ª ed.). Pearson Prentice Hall. ISBN 0-13-185644-8.