¿Cómo realiza operaciones en grandes números utilizando una ALU de ancho fijo pequeño?

2

Estoy deseando diseñar una calculadora simple como la que encontrarías en la tienda del dólar. Algo como esto:

Este pequeño individuo puede mostrar un número de 8 dígitos, lo que significa que 99999999 es el número más grande que se puede mostrar en este formato.

Estoy familiarizado con cómo una ALU simple funciona con dos registros como entrada.

Ahora, si utilizo un registro de 32 bits para los cálculos, entonces todo estaría bien, ya que el registro puede contener 99999999 bien. Sin embargo, quiero entender el proceso de usar dos registros más pequeños para acumular números más grandes y cómo funciona con una ALU.

    
pregunta Jake Robinson

2 respuestas

8

Puedes manipular números arbitrariamente anchos utilizando una ALU de ancho finito. Sin embargo, se requieren múltiples operaciones cuando el número es más ancho que la ALU.

Para ilustrar esto, usaré un PIC 18 como ejemplo. Esta arquitectura solo puede manipular directamente números de 8 bits. Para agregar las cantidades de 8 bits VAR1 y VAR2 y colocar el resultado en SUM, se tomará un código como este (suponiendo que no se necesita la banca o que el banco ya está configurado correctamente):

         movf    var1, w     ;get VAR1 into accumulator
         addwf   var2, w     ;add VAR2 to it
         movwf   sum         ;save the result

Si, en cambio, VAR1, VAR2 y SUM fueran variables de 32 bits, el código sería:

         movf    var1+0, w   ;make byte 0 (low byte)
         addwf   var2+0, w
         movwf   sum+0
         movf    var1+1, w   ;make byte 1
         addwfc  var2+1, w
         movwf   sum+1
         movf    var1+2, w   ;make byte 2
         addwfc  var2+2, w
         movwf   sum+2
         movf    var1+3, w   ;make byte 3 (high byte)
         addwfc  var2+3, w
         movwf   sum+3

Cada byte se maneja por separado. Tenga en cuenta el uso de ADDWFC en lugar de ADDWF para todos menos el primer byte. Esta instrucción agrega los dos bytes, pero también agrega el acarreo de la operación ALU anterior.

Esperamos que pueda ver que este enfoque se puede usar para agregar dos números arbitrariamente grandes. La aritmética amplia es posible, solo que toma más tiempo y requiere varios viajes a través de la ALU para realizar la operación completa.

Las operaciones como AND, OR, XOR, etc., son independientes a nivel de bits. Cada bit de salida se puede calcular dados solo los bits de entrada correspondientes. Dichas operaciones se escalan linealmente con el ancho de los valores que se procesan. La adición requiere los dos bits de entrada, pero también el resultado del acarreo del siguiente bit inferior. Eso requiere que se mantenga un bit de estado entre operaciones sucesivas, pero aún se escala linealmente con el ancho del número.

Multiplica las escalas con el cuadrado del ancho del número, ya que cada fragmento de un número debe multiplicarse por todos los fragmentos del otro número. Multiplicar dos números de 32 bits, que pueden producir un resultado de hasta 64 bits, toma mucho más que 8 x 8 en una ALU de 8 bits, pero todo es posible.

    
respondido por el Olin Lathrop
4

Por lo general, haría una calculadora de este tipo con una ALU de 4 bits (un dígito BCD) y haría todos los cálculos en BCD un dígito a la vez, por lo que su registro de almacenamiento sería de 8 dígitos x 4 bits = 32 bits en total.

Incluso con una frecuencia de reloj baja, eso es más que lo suficientemente rápido para la interacción humana, y minimizará el hardware.

Para agregar, simplemente agregue un dígito a la vez, de derecha a izquierda, hasta que haya completado los 8 (teniendo en cuenta los acarreos). La resta es similar.

La multiplicación y la división son básicamente sumas o restas repetidas y se pueden hacer de manera similar (es posible que tenga que agregar 9 * 9 * 8 veces con una ALU de 4 bits para realizar la multiplicación de 8 dígitos x 8 dígitos - el peor de los casos - 99999999 * 1 , por ejemplo.

El resultado, al estar en BCD, se puede enviar casi directamente a la pantalla LCD (a pesar de la codificación de 7 segmentos y quizás de la conducción de la pantalla LCD triple).

Por supuesto, puede hacer este tipo de cosas más fácilmente en estos días usando una ALU de 32 bits y escribiendo código usando la codificación manual de ensamblador de las matemáticas, se duplica en C, etc., pero no es así como funcionan las calculadoras baratas.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas