Articulo de referencia

Unidad aritmético-lógica

Representación simbólica de una ALU y sus señales de entrada y salida, indicadas por flechas que apuntan hacia dentro o hacia fuera de la ALU, respectivamente. Cada flecha repre...

Representación simbólica de una ALU y sus señales de entrada y salida, indicadas por flechas que apuntan hacia dentro o hacia fuera 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; el flujo de datos va de arriba hacia abajo.

En informática , una unidad aritmético-lógica ( ALU ) es un circuito digital combinacional que realiza operaciones aritméticas y bit a bit sobre números binarios enteros . [ 1 ] [ 2 ] Esto contrasta con una unidad de punto flotante (FPU), que opera con números de punto flotante . Es un componente fundamental de muchos tipos de circuitos informáticos, incluyendo la unidad central de procesamiento (CPU) de las computadoras, las FPU y las unidades de procesamiento gráfico (GPU). [ 3 ]

Las entradas de una ALU son los datos sobre los que se va a operar, llamados operandos , y un código que indica la operación a realizar ( opcode ); 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 cuenta con diversas redes de entrada y salida , que son los conductores eléctricos utilizados para transmitir señales digitales entre la ALU y los circuitos externos. Cuando una ALU está en funcionamiento, los circuitos externos aplican señales a sus entradas 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 cuenta con tres buses de datos paralelos , cada uno compuesto por 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. Por lo general, el ancho de los buses A, B e Y (el número de señales que componen cada bus) es idéntico y coincide con el tamaño de palabra nativo del circuito externo (por ejemplo, la CPU 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 que la ALU debe realizar. El tamaño del código de operación (el ancho de su bus) determina el número máximo de operaciones distintas que la ALU puede realizar; por ejemplo, un código de operación de cuatro bits puede especificar hasta dieciséis operaciones diferentes de la ALU. Generalmente, un código de operación de la ALU no es lo mismo que una instrucción en lenguaje máquina , aunque en algunos casos puede estar codificado directamente como un campo de bits dentro de dichas instrucciones.

Estado

Salidas

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

  • Acarreo de salida , 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 , lo que indica que todos los bits de Y son lógicos cero.
  • Negativo , que indica que el resultado de una operación aritmética es negativo.
  • Desbordamiento , 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 son lógicos uno.

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 "acarreo de entrada", que corresponde al acarreo de salida almacenado de una operación anterior de la ALU.

Funcionamiento del circuito

El circuito lógico combinacional del circuito integrado 74181 , una ALU de cuatro bits temprana, con puertas lógicas

Una ALU es un circuito lógico combinacional , lo que significa que sus salidas cambian de forma asíncrona en respuesta a los cambios de entrada. En 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 del circuito de la ALU, el resultado de la operación aparece en las salidas de la ALU. El circuito externo conectado a la ALU se encarga de garantizar la estabilidad de las señales de entrada durante toda la operación y de permitir que las señales se propaguen a través del circuito de la ALU antes de muestrear las salidas de la ALU.

En general, los circuitos externos controlan una ALU aplicando señales a sus entradas. Normalmente, estos circuitos emplean lógica secuencial para generar las señales que controlan el funcionamiento de la ALU. La lógica secuencial externa se sincroniza mediante una señal de reloj de frecuencia suficientemente baja para garantizar que las salidas de la ALU tengan tiempo suficiente para estabilizarse en las peores condiciones (es decir, condiciones que resultan en el máximo retardo de propagación posible).

Por ejemplo, una CPU inicia una operación de suma enrutando los operandos desde sus fuentes (normalmente registros del procesador ) a las entradas de operandos de la ALU, mientras aplica simultáneamente un valor a la entrada de código de operación de la ALU que la configura para realizar la suma. Al mismo tiempo, la CPU habilita el registro de destino para almacenar la salida de la ALU (la suma resultante de la operación de suma) una vez finalizada la operación. Las señales de entrada de la ALU, que se mantienen estables hasta el siguiente ciclo de reloj, se propagan a través de la ALU hasta el registro de destino mientras la CPU espera el siguiente ciclo. Cuando llega el siguiente ciclo, el registro de destino almacena el resultado de la ALU y, dado que la operación de la ALU ha finalizado, las entradas de la ALU pueden configurarse para la siguiente operación.

Funciones

Las ALU suelen admitir varias funciones aritméticas básicas y lógicas a nivel de bits. Las ALU básicas de propósito general suelen incluir estas operaciones en sus repertorios: [ 1 ] [ 2 ] [ 4 ]

Operaciones aritméticas

  • Suma : A y B se suman y la suma aparece en Y y se lleva.
  • Suma con acarreo : A, B y el acarreo de entrada se suman y la suma aparece en Y y el acarreo de salida.
  • Resta : B se resta de A (o viceversa) y la diferencia aparece en Y y en el acarreo de salida. Para esta función, el acarreo de salida es, en efecto, un indicador de "préstamo". Esta operación también puede usarse para comparar las magnitudes de A y B; en tales casos, el procesador puede ignorar la salida Y, ya que solo le interesan los bits de estado (en particular, cero, negativo y acarreo) que resultan de la operación.
  • Resta con préstamo : B se resta de A (o viceversa) con préstamo (llevar hacia adentro) y la diferencia aparece en Y y llevar hacia afuera (llevar hacia afuera).
  • Complemento a dos : El negativo de A (o B) aparece en Y en forma de complemento a dos.
  • Incremento : A (o B) se incrementa en uno y el valor resultante aparece en Y.
  • Decremento : A (o B) se disminuye en uno y el valor resultante aparece en Y.

operaciones lógicas bit a bit

  • AND : la operación AND bit a bit de A y B aparece en Y. AND también puede usarse para probar bits. En este caso, el resultado no se almacenaría; solo se registrarían los bits de estado (en particular, cero y negativo).
  • OR : la operación OR bit a bit de A y B aparece en Y.
  • OR exclusivo : la operación XOR bit a bit de A y B aparece en Y.
  • Complemento a uno : todos los bits de A (o B) se invierten y aparecen en Y.

Operaciones de desplazamiento de bits

Las operaciones de desplazamiento de la ALU provocan 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 generalmente solo pueden desplazar el operando una posición de bit, mientras que las ALU más complejas emplean desplazadores de barril que les permiten desplazar el operando un número arbitrario de bits en una sola operación. En todas las operaciones de desplazamiento de un solo bit, el bit desplazado fuera del operando aparece en la salida de acarreo; el valor del bit desplazado dentro del operando depende del tipo de desplazamiento.

Otras operaciones

  • Paso directo : todos los bits de A (o B) aparecen sin modificar en Y. Esta operación se utiliza normalmente para determinar la paridad del operando, es decir, si es cero o negativo, o para copiar el operando a un registro del procesador.

Aplicaciones

Estado de uso

Una unidad aritmético-lógica y su registro de estado asociado. El acarreo de salida almacenado está conectado al acarreo de entrada para facilitar una propagación eficiente del acarreo.

Al finalizar cada operación de la ALU, las señales de estado de salida de la ALU se almacenan generalmente en registros externos para que estén disponibles para futuras operaciones de la ALU (por ejemplo, para implementar aritmética de precisión múltiple ) y para controlar bifurcaciones condicionales . Los registros de bits que almacenan las señales de estado de salida suelen tratarse colectivamente como un único registro multibit, al que se denomina "registro de estado" o "registro de código de condición".

Dependiendo de la operación que se realice en la ALU, algunos bits del registro de estado pueden modificarse y otros pueden permanecer sin cambios. Por ejemplo, en operaciones lógicas bit a bit como AND y OR, el bit de estado de acarreo normalmente no se modifica, ya que no es relevante para dichas operaciones.

En las CPU, la señal de acarreo de salida almacenada suele estar conectada a la red de acarreo de entrada de la ALU. Esto facilita la propagación eficiente de acarreos (que pueden representar acarreos de suma, préstamos de resta o desbordamientos de desplazamiento) al realizar operaciones de precisión múltiple, ya que elimina la necesidad de gestionar por software la propagación del acarreo (mediante bifurcaciones condicionales, basadas en el bit de estado del acarreo).

Rutas de datos de operandos y resultados

Diagrama de bloques de una CPU de ejemplo que muestra las rutas de datos para las fuentes de operandos de la ALU y los destinos de los resultados. Los operandos de la ALU pueden provenir de la memoria, de los registros del banco de registros o de la instrucción que se está ejecutando. El resultado de la ALU puede almacenarse en la memoria o en un registro del procesador.

Las fuentes de operandos de la ALU y los destinos de sus resultados dependen de la arquitectura del procesador que la encapsula y de la operación que se realiza. Si bien las arquitecturas de procesador varían considerablemente, en las CPU de propósito general, la ALU suele operar junto con un banco de registros (un conjunto de registros del procesador) o un registro acumulador , que la ALU utiliza frecuentemente como fuente de operandos y destino de resultados. Para admitir otras fuentes de operandos, se suelen utilizar multiplexores para seleccionar el banco de registros o fuentes alternativas de operandos de la ALU según lo requiera cada instrucción de máquina.

Por ejemplo, la arquitectura que se muestra a la derecha emplea un banco de registros con dos puertos de lectura, lo que permite que los valores almacenados en dos registros cualesquiera (o en el mismo registro) sean operandos de la ALU. Alternativamente, permite que cualquiera de los operandos de la ALU provenga de un operando inmediato (un valor constante codificado directamente en la instrucción de máquina [ 5 ] ) o de la memoria. El resultado de la ALU puede escribirse en cualquier registro del banco de registros (a través del puerto de escritura del banco de registros) o en la memoria.

Aritmética de precisión múltiple

En los cálculos aritméticos de enteros, la aritmética de precisión múltiple es un algoritmo que opera con enteros mayores que el tamaño de palabra de la ALU. Para ello, el algoritmo trata cada entero como una colección ordenada de fragmentos del tamaño de la ALU, ordenados del 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 0x123456se trataría como una colección de tres fragmentos de 8 bits: 0x12(MS), 0x34y 0x56(LS). Dado que el tamaño de un fragmento coincide exactamente con el tamaño de palabra de la ALU, esta puede operar directamente sobre este "fragmento" de operando.

El algoritmo utiliza la ALU para operar directamente sobre fragmentos de operandos específicos y generar así un fragmento correspondiente (un "parcial") del resultado de precisión múltiple. Cada parcial, una vez generado, se escribe en una región de almacenamiento asociada, designada para dicho resultado. Este proceso se repite para todos los fragmentos de operandos, generando así una colección completa de parciales, que constituye el resultado de la operación de precisión múltiple.

En las operaciones aritméticas (por ejemplo, suma, resta), el algoritmo comienza invocando una operación ALU sobre los fragmentos LS de los operandos, generando así un parcial LS y un bit de acarreo. El algoritmo escribe el parcial en la memoria designada, mientras que la máquina de estados del procesador suele almacenar el bit de acarreo en un registro de estado de la ALU. A continuación, el algoritmo avanza al siguiente fragmento de la colección de cada operando e invoca una operación ALU sobre estos fragmentos junto con el bit de acarreo almacenado de la operación ALU anterior, generando así otro parcial (más significativo) y un bit de acarreo. Como antes, el bit de acarreo se almacena en el registro de estado y el parcial se escribe en la memoria designada. Este proceso se repite hasta que se hayan procesado todos los fragmentos de los operandos, lo que da como resultado una colección completa de parciales en la memoria, que conforman el resultado aritmético de precisión múltiple.

En las operaciones de desplazamiento de precisión múltiple, el orden de procesamiento de los fragmentos de operandos depende de la dirección del desplazamiento. En las operaciones de desplazamiento a la izquierda, los fragmentos se procesan primero en el bit menos significativo (LS), ya que el bit LS de cada parcial —que se transmite a través del bit de acarreo almacenado— debe obtenerse del bit más significativo (MS) del operando menos significativo que se desplazó previamente a la izquierda. Por el contrario, en las operaciones de desplazamiento a la derecha, los operandos se procesan primero en el bit MS, ya que el bit MS de cada parcial debe obtenerse del bit LS del operando más significativo que se desplazó previamente a la derecha.

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

Suma y resta binaria de punto fijo

Los valores binarios de punto fijo se representan mediante números enteros. Por consiguiente, para cualquier factor de escala de punto fijo (o posición de punto decimal implícita), una ALU puede sumar o restar directamente dos operandos de punto fijo y producir un resultado de punto fijo. Esta capacidad se utiliza habitualmente tanto en la suma como en la resta de punto fijo y de punto flotante.

En la suma y resta de punto flotante, la mantisa del operando menor se desplaza a la derecha para que su factor de escala de punto fijo coincida con el del operando mayor. La ALU suma o resta las mantisas alineadas para obtener una mantisa de resultado. Junto con los demás elementos del operando, la mantisa de resultado se normaliza y redondea para obtener el resultado de punto flotante.

Operaciones complejas

Si bien es posible diseñar ALUs que puedan realizar funciones complejas, esto suele ser poco práctico debido al consiguiente aumento en la complejidad del circuito, el consumo de energía, el retardo de propagación, el costo y el tamaño. Por consiguiente, las ALUs generalmente se limitan a funciones simples que pueden ejecutarse a velocidades muy altas (es decir, con retardos de propagación muy cortos), mientras que las funciones más complejas son responsabilidad del software o de circuitos externos. Por ejemplo:

  • En los casos sencillos en los que una CPU contiene una única ALU, la CPU suele implementar una operación compleja orquestando una secuencia de operaciones de la ALU de acuerdo con un algoritmo de software.
  • Las arquitecturas más especializadas pueden utilizar múltiples ALU para acelerar operaciones complejas. En estos sistemas, las ALU suelen estar segmentadas , con los resultados intermedios pasando a través de ellas como en una cadena de producción . El rendimiento mejora notablemente con respecto al de una sola ALU, ya que todas operan simultáneamente y la sobrecarga de software se reduce significativamente.

Unidades de procesamiento gráfico

Las unidades de procesamiento gráfico (GPU) suelen contener cientos o miles de ALU que pueden operar simultáneamente. Dependiendo de la aplicación y la arquitectura de la GPU, las ALU pueden utilizarse para procesar simultáneamente datos no relacionados o para operar en paralelo sobre datos relacionados. Un ejemplo de esto último es la renderización gráfica, en la que varias ALU realizan la misma operación en paralelo sobre un grupo de píxeles, operando cada ALU sobre un píxel dentro de una escena. [ 6 ]

Implementación

Una ALU se suele implementar como un circuito integrado (CI) independiente , como el 74181 , o como parte de un CI más complejo. En este último caso, una ALU se instancia normalmente sintetizándola a partir de una descripción escrita en VHDL , Verilog u otro lenguaje de descripción de hardware . Por ejemplo, el siguiente código VHDL describe una ALU muy simple de 8 bits :

entity alu is port ( -- las conexiones de alu a circuitos externos: A : in signed ( 7 downto 0 ); -- operando A B : in signed ( 7 downto 0 ); -- operando B OP : in unsigned ( 2 downto 0 ); -- opcode Y : out signed ( 7 downto 0 )); -- resultado de la operación end alu ;Architecture Behavioral of ALU is begin case OP is -- decodificar el código de operación y realizar la operación: when "000" => Y <= A + B ; -- sumar when "001" => Y <= A - B ; -- restar when "010" => Y <= A - 1 ; -- decrementar when "011" => Y <= A + 1 ; -- incrementar when "100" => Y <= not A ; -- complemento a uno when "101" => Y <= A and B ; -- AND bit a bit when "110" => Y <= A or B ; -- OR bit a bit when "111" => Y <= A xor B ; -- XOR bit a bit when others => Y <= ( others => 'X' ); end case ; end behavioral ;

Historia

El matemático John von Neumann propuso el concepto de ALU en 1945 en un informe sobre los fundamentos de una nueva computadora llamada EDVAC . [ 7 ]

Durante los inicios de la era de la información , el costo, el tamaño y el consumo de energía de los circuitos electrónicos eran relativamente altos . Por consiguiente, todos los primeros ordenadores contaban con una ALU serial que procesaba un bit de datos a la vez, aunque a menudo presentaban un tamaño de palabra mayor a los programadores. El primer ordenador con múltiples circuitos ALU discretos paralelos de un solo bit fue el Whirlwind I de 1951 , que empleaba dieciséis de estas "unidades matemáticas" para poder operar con palabras de 16 bits.

En 1967, Fairchild presentó el primer dispositivo similar a una ALU implementado como un circuito integrado, el Fairchild 3800, que consistía en una unidad aritmética de ocho bits con acumulador. Solo admitía sumas y restas, pero no funciones lógicas. [ 8 ]

Pronto surgieron las ALU de circuito integrado completo, incluidas las de cuatro bits como la Am2901 y la 74181. Estos dispositivos solían ser capaces de " dividir bits ", lo que significa que tenían señales de "adelanto de acarreo" que facilitaban el uso de múltiples chips ALU interconectados para crear una ALU con un tamaño de palabra mayor. Estos dispositivos se popularizaron rápidamente y se utilizaron ampliamente en minicomputadoras de división 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 veces el espacio en el chip era insuficiente 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 máquina. Ejemplos de esto incluyen el popular Zilog Z80 , que realizaba sumas de ocho bits con una ALU de cuatro bits. [ 9 ] Con el tiempo, las geometrías de los transistores se redujeron aún más, siguiendo la ley de Moore , y se hizo factible construir ALU más anchas en los microprocesadores.

Los transistores de los circuitos integrados (CI) modernos son mucho más pequeños que los de los primeros microprocesadores, lo que permite integrar unidades aritmético-lógicas (ALU) muy complejas en los CI. Hoy en día, muchas ALU modernas cuentan con anchos de palabra amplios y mejoras arquitectónicas como desplazadores de barril y multiplicadores binarios que les permiten realizar, en un solo ciclo de reloj, operaciones que en las ALU anteriores habrían requerido múltiples operaciones.

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

Véase también

Referencias

  1. 1 2 Atul P. Godse; Deepali A. Godse (2009). "3" . Diseño de lógica digital . Publicaciones técnicas. págs. 9–3 . ISBN  978-81-8431-738-1.
  2. 1 2 Atul P. Godse; Deepali A. Godse (2009). «Apéndice». Circuitos lógicos digitales . Publicaciones técnicas. págs. C–1. ISBN  978-81-8431-650-6.
  3. "1. Introducción a la arquitectura de computadoras: diseño de hardware embebido, 2.ª edición [ Libro ] " . www.oreilly.com . Consultado el 3 de septiembre de 2020 .
  4. Horowitz, Paul ; Winfield Hill (1989). "14.1.1". El arte de la electrónica (2.ª ed.). Cambridge University Press. págs. 990–. ISBN   978-0-521-37095-0.
  5. Barry, Peter; Crowley, Patrick (2012). Computación embebida moderna . ISBN 978-0-12-391490-3.
  6. Smith, Ryan. "Antecedentes: Cómo funcionan las GPU" . AnandTech. Archivado del original el 28 de febrero de 2014. Consultado el 14 de enero de 2025 .
  7. Philip Levis (8 de noviembre de 2004). "Jonathan von Neumann y EDVAC" (PDF) . cs.berkeley.edu . págs. 1, 3. Archivado del original (PDF) el 23 de septiembre de 2015. Recuperado el 20 de enero de 2015 . 
  8. Shirriff, Ken. "Dentro del chip ALU 74181: fotos del chip e ingeniería inversa" . Blog de Ken Shirriff . Consultado el 7 de mayo de 2024 .
  9. Shirriff, Ken. "El Z-80 tiene una ALU de 4 bits. Así es como funciona." 2013, righto.com
  10. Reif, John H. (2009), "Computación mecánica: la complejidad computacional de los dispositivos físicos" , en Meyers, Robert A. (ed.), Enciclopedia de la complejidad y la ciencia de sistemas , Nueva York, NY: Springer, pp. 5466–5482 , doi : 10.1007/978-0-387-30440-3_325 , ISBN  978-0-387-30440-3, consultado el 3 de septiembre de 2020
  11. Lin, Chun-Liang; Kuo, Ting-Yu; Li, Wei-Xian (2018-08-14). "Síntesis de la unidad de control para la futura biocomputadora" . Journal of Biological Engineering . 12 (1): 14. doi : 10.1186/s13036-018-0109-4 . ISSN 1754-1611 . PMC 6092829. PMID 30127848 .   
  12. Gerd Hg Moe-Behrens. "El microprocesador biológico, o cómo construir un ordenador con partes biológicas" .
  13. Das, Biplab; Paul, Avijit Kumar; De, Debashis (16 de agosto de 2019). "Diseño y computación de una unidad aritmético-lógica no convencional en autómatas celulares cuánticos de actina" . Microsystem Technologies . 28 (3): 809–822 . doi : 10.1007/s00542-019-04590-1 . ISSN 1432-1858 . S2CID 202099203 .  

Lecturas adicionales

  • Hwang, Enoch (2006). Lógica digital y diseño de microprocesadores con VHDL . Thomson. ISBN 0-534-46593-5.
  • Stallings, William (2006). Organización y arquitectura de computadoras: Diseño para el rendimiento (7.ª  ed.). Pearson Prentice Hall. ISBN 0-13-185644-8.