Universidad

Rey Juan Carlos

ESTRUCTURA Y TECNOLOGÍA DE
COMPUTADORES

Circuitos para multiplicación y
división de números en coma fija
Luis Rincón Córcoles
Licesio J. Rodríguez-Aragón

Circuitos para multiplicación y división de números en coma fija

Programa
Bibliografía.
1. Multiplicación binaria en coma fija.
2. Multiplicación por una constante.
3. Multiplicación por suma - desplazamiento.
4. Multiplicación por grupos solapados.
5. Circuitos para multiplicación rápida.
6. División binaria en coma fija.
7. División por una constante.
8. División con restauración.
9. Instrucciones para multiplicación y división en ensamblador.

2

Circuitos para multiplicación y división de números en coma fija

Bibliografía
 D.A. PATTERSON, J.L. HENNESSY. Estructura y Diseño de Computadores.
Reverté, 2000.
 DORMIDO, S. CANTO M.A., MIRA J., DELGADO A.E. Estructura y Tecnología
de Computadores. 2ª edición. Sanz y Torres, 2000.
 PARHAMI, B. Computer Arithmetic. Oxford University Press, 2000.
 P. DE MIGUEL. Fundamentos de los Computadores. 7ª edición. Paraninfo,
1999.
 W. STALLINGS. Organización y Arquitectura de Computadores. 5ª edición,
Prentice Hall, 2000.

3

Circuitos para multiplicación y división de números en coma fija

1. Multiplicación binaria en coma fija
 La operación de multiplicación de números en coma fija no suele estar
contemplada directamente por las UAL, sino que se suele realizar mediante
circuitos específicos:
•Construir un circuito multiplicador rápido exige una circuitería compleja, y las
UAL sólo realizan directamente las operaciones aritméticas y lógicas más
básicas.
•La multiplicación se puede realizar en la UAL mediante una secuencia de
sumas y desplazamientos controlados por la unidad de control (UC), si bien
no resulta demasiado eficiente.
•La multiplicación puede realizarse también mediante un programa en
ensamblador que conste de un bucle con una secuencia de sumas y
desplazamientos, aunque esto es mucho menos eficiente aún.

 Terminología de la multiplicación:
Mxm=P
•M: multiplicando.
•m: multiplicador.
•P: producto o resultado.
4

Circuitos para multiplicación y división de números en coma fija Multiplicación binaria en coma fija PRODUCTO A 12 1 1 0 0 multiplicando BINARIO 0 1 (×) × 6 × 1 1 0 multiplicador 0 0 0 72 0 0 0 0 B 1 0 1 1 1 0 0 Productos parciales 1 1 0 0 1 0 0 1 0 0 0 resultado 64 + 8 = 72 M × m M3 M2 M1 M0 multiplicando R × m2 m1 m0 multiplicador M3·m0 M2 ·m0 M1 ·m0 M0 ·m0 Productos M3·m1 M2 ·m1 M1 ·m1 M0 ·m1 parciales M3·m2 M2 ·m2 M1 ·m2 M0 ·m2 R6 R5 R4 R3 R2 R1 R0 resultado 5 Circuitos para multiplicación y división de números en coma fija Multiplicación binaria en coma fija  La multiplicación en coma fija es una secuencia de desplazamientos y sumas con extensión de signo. •Los operandos en complemento a 2 se rellenan a su izquierda con el bit de signo. se rellenan con ceros a la izquierda. a la derecha se rellena con ceros. •Si los operandos están en binario puro. 6 . Ejemplo: multiplicar M=101001102=16610 por m=000110012=2510 0000000010100110 M*m0*20 = M*1: M sin desplazar + 0000000000000000 M*m1*21 = 0 + 0000000000000000 M*m2*22 = 0 + 0000010100110000 M*m3*23 = M*8: M desplazado 3 lugares + 0000101001100000 M*m4*24 = M*16: M desplazado 4 lugares + 0000000000000000 M*m5*25 = 0 + 0000000000000000 M*m6*26 = 0 + 0000000000000000 M*m7*27 = 0 0001000000110110 M*m  El producto de dos números binarios de n bits produce un resultado que puede tener hasta 2n bits de ancho. •En cualquier caso.

. + a 0 ⋅ 2 0 +m •Ejemplo: 11010012 · 23 = 11010010002 7 Circuitos para multiplicación y división de números en coma fija Multiplicación por un valor constante  Cuando el multiplicador es una constante que no es una potencia de 2. •Si el multiplicador es 2k.. N = a n-1 ⋅ 2 n-1 + ..  Si uno de los operandos (por ejemplo el multiplicador) es una constante conocida en tiempo de compilación (o ensamblaje). Circuitos para multiplicación y división de números en coma fija 2. la multiplicación se puede sustituir por un desplazamiento del multiplicando hacia la izquierda. 101001100000 Desplazamiento de M cuatro posiciones +010100110000 Desplazamiento de M tres posiciones +000010100110 M sin desplazar 1000000110110 Resultado de la suma (del producto) 8 . se desplazará el multiplicando k lugares a la izquierda... la operación será M*25 = M*(16+8+1) = M*16+M*8+M que se traduce en dos desplazamientos (de 3 y 4 lugares respectivamente) y dos sumas (consumiríamos una variable intermedia). •Ejemplo: multiplicar M=101001102=16610 por m=000110012=2510 Descomponemos el multiplicador m=25=16+8+1. Multiplicación por un valor constante  La multiplicación es una operación costosa en tiempo de ejecución....  Cuando el multiplicador es una constante potencia de 2. + a 0 ⋅ 2 0 N ⋅ 2 m = a n-1 ⋅ 2 n-1+m + .. Por tanto. la multiplicación puede descomponerse en una secuencia de instrucciones de desplazamiento y de suma.. es frecuente que el compilador (o ensamblador) sustituya la multiplicación por otras operaciones. Así.... es aconsejable evitar las multiplicaciones en los programas siempre que sea posible..

9 Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 1ª versión  La multiplicación será un proceso iterativo. que estarán convenientemente rellenados con ceros a la izquierda y/o a la derecha (para ello. Circuitos para multiplicación y división de números en coma fija 3. Se desplazará el multiplicando un lugar hacia la izquierda para alinear correctamente los productos parciales. con el correspondiente circuito.  Los circuitos se basan en: • Un sumador. 10 . 2. 4. • Un circuito secuencial de control. con lo cual obtendremos productos parciales que pueden valer lo mismo que el multiplicando desplazado (cuando el bit del multiplicador sea 1) o bien 0 (cuando dicho bit sea nulo). • Varios registros de desplazamiento. Multiplicación por suma – desplazamiento  Vamos a ver: 1) El algoritmo de lápiz y papel (o de suma-desplazamiento) para multiplicar números en binario puro (sin signo) de n bits. 4) La versión final del algoritmo. y en cada ciclo se realizarán las siguientes operaciones: 1. que puede ser el de la UAL. 3. aún más optimizada. acompañada del correspondiente circuito. e inicialmente lo rellenaremos con ceros a la izquierda). 3) Una versión optimizada del algoritmo. 2) Un circuito que permite realizar la operación utilizando dicho algoritmo. Se desplaza o se rota el multiplicador un lugar hacia la derecha (por esto siempre se multiplica por el bit 0 del multiplicador). que puede ser parte de la UC. doblaremos el tamaño del multiplicando. Se realiza el producto del multiplicando por el bit 0 del multiplicador. Se sumará el producto parcial con la suma acumulada de los productos parciales obtenidos en los pasos anteriores (al principio el producto acumulado será 0).

Contador ← 0 No Desplazamiento del registro Multiplicador a la derecha Multiplicand Shift left 64 bits Contador ← Contador+1 Multiplier 64-bit ALU Shift right 32 bits ¿ Contador = n ? Product Control test Write Sí 64 bits Fin Ejercicio: dibujar el diagrama de estados del controlador del circuito. •Un controlador para generar la secuencia de señales necesaria. Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 1ª versión Circuitería necesaria: •Un registro de 2n bits capaz de realizar desplazamientos unitarios hacia la izquierda para el multiplicando. Multiplicand Shift left 64 bits Circuito para n = 32 bits con Multiplier las conexiones y señales de 64-bit ALU Shift right control necesarias. 32 bits Product Control test Write 64 bits 11 Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 1ª versión Inicio Operaciones de la fase de inicio: 1. •Un sumador de 2n bits. •Un registro de 2n bits para el producto. Iniciar el registro Multiplicando (mitad superior con todos los bits a 0. 12 . Iniciar el registro Multiplicador Multiplicando 3. •Un contador de 0 a n para contar el número de iteraciones. •Un registro de n bits capaz de realizar desplazamientos unitarios hacia la derecha para el multiplicador. 1 ¿Bit 0 del mitad inferior con el multiplicando) Multiplicador = 0? Producto ← Producto + 0 2. Producto ← 0 Desplazamiento del registro Multiplicando a la izquierda 4.

con lo cual sólo la mitad contiene datos útiles.  Por tanto. pero sin duplicar el tamaño del multiplicador.  Deja de ser necesario desplazar el registro Multiplicando. el registro Producto estará dividido en dos mitades (Productoizq: mitad izquierda. Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 1ª versión  Ejemplo: n=4. multiplicar M=10102=1010 por m=00112=310 Iteración Paso Multiplicador Multiplicando Producto 0 Valores iniciales 0011 0000 1010 0000 0000 1 Producto ← Producto + Multiplicando “ “ 0000 1010 Desplazar Multiplicando a la izqda. 14 . Productoder: mitad derecha. •Los desplazamientos se realizan sobre el registro completo. “ 0101 0000 “ Desplazar Multiplicador a la derecha 0000 “ “ 4 Ninguna operación “ “ “ Desplazar Multiplicando a la izqda. se ideó un algoritmo similar al anterior. •También sobra la mitad de la UAL. y utilizando un sumador de n bits. •En cada iteración se suma sólo sobre la mitad izquierda. “ 1010 0000 “ Desplazar Multiplicador a la derecha 0000 “ 0001 1110 13 Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 2ª versión  En el circuito anterior sucede que: •La mitad de los bits del registro Multiplicando siempre son 0.  Sigue siendo preciso desplazar el registro Multiplicador para consultar siempre su bit 0. “ 0010 1000 “ Desplazar Multiplicador a la derecha 0000 “ “ 3 Ninguna operación “ “ “ Desplazar Multiplicando a la izqda.  Puesto que las sumas son de n bits. pues está sumando en cada paso el doble de datos de lo estrictamente necesario. “ 0001 0100 “ Desplazar Multiplicador a la derecha 0001 “ “ 2 Producto ← Producto + Multiplicando “ “ 0001 1110 Desplazar Multiplicando a la izqda. P: registro completo).

•Un registro de n bits capaz de realizar desplazamientos lógicos unitarios hacia la derecha para el multiplicador. Iniciar el registro Multiplicador Productoizq ← Productoizq + 0 Multiplicando 3. Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 2ª versión Circuitería necesaria: •Un registro de n bits para el multiplicando. este registro admitirá desplazamientos lógicos unitarios hacia la derecha del registro completo concatenando el biestable de acarreo por la izquierda. 32-bit ALU Shift right 32 bits Shift right Product Control test Write 64 bits 15 Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 2ª versión Inicio Operaciones de la fase de inicio: 1. Producto ← 0 Desplazamiento del registro Producto a la derecha 4. •Un biestable para guardar el acarreo de las sumas (no aparece en el dibujo). Iniciar el registro Multiplicando 1 ¿Bit 0 del Multiplicador = 0? 2. que pueda cargarse en paralelo en su mitad izquierda dejando intacta la mitad derecha. •Un contador de 0 a n para contar el número de iteraciones. Multiplicand Circuito para n = 32 bits con 32 bits las conexiones y señales de Multiplier control necesarias. •Un sumador de n bits. 16 . •Un controlador para generar la secuencia de señales necesaria. •Un registro de 2n bits para el producto. Contador ← 0 No Desplazamiento del registro Multiplicador a la derecha Multiplicand 32 bits Contador ← Contador+1 Multiplier 32-bit ALU Shift right ¿ Contador = n ? 32 bits Sí Shift right Product Control test Write Fin 64 bits Ejercicio: dibujar el diagrama de estados del controlador del circuito.

y el multiplicador se carga inicialmente en la mitad derecha del registro Producto. 18 . multiplicar M=10102=1010 por m=00112=310 Iteración Paso Multiplicador Multiplicando Producto 0 Valores iniciales 0011 1010 0 0000 0000 1 Productoizq ← Productoizq + Multiplicando “ “ 0 1010 0000 Desplazar Producto a la derecha “ “ 0 0101 0000 Desplazar Multiplicador a la derecha 0001 “ “ 2 Productoizq ← Productoizq + Multiplicando “ “ 0 1111 0000 Desplazar Producto a la derecha “ “ 0 0111 1000 Desplazar Multiplicador a la derecha 0000 “ “ 3 Ninguna operación “ “ “ Desplazar Producto a la derecha “ “ 0 0011 1100 Desplazar Multiplicador a la derecha 0000 “ “ 4 Ninguna operación “ “ “ Desplazar Producto a la derecha “ “ 0 0001 1110 Desplazar Multiplicador a la derecha 0000 “ 0001 1110 17 Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 3ª versión  En el circuito anterior sucede que: •Al principio. consultaremos el bit menos significativo del registro Producto. el espacio desaprovechado del registro Producto se va reduciendo. se incorporó una mejora al circuito.  Por tanto. Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 2ª versión  Ejemplo: n=4. •El espacio desaprovechado del registro Producto es exactamente igual que el número de bits del multiplicador que necesitamos mantener en cada instante.  En cada iteración. el registro Producto tiene la mitad de sus bits desperdiciados. •Los bits del multiplicador van dejando de ser útiles a medida que se van realizando los productos parciales (en realidad se van perdiendo si hacemos desplazamientos sobre el registro Multiplicador y no rotaciones). •A medida que van realizándose pasos del algoritmo. cuando vayamos a consultar un bit del multiplicador. de forma que el registro Multiplicador desaparece.

Iniciar el registro Multiplicando 2. que pueda cargarse en paralelo en su mitad izquierda dejando intacta la mitad derecha. Contador ← 0 0 Multiplicando No Desplazamiento del registro Producto a la derecha Multiplicand 32 bits Contador ← Contador+1 32-bit ALU ¿ Contador = n ? Sí Shift right Control Product Write test 64 bits Fin Ejercicio: dibujar el diagrama de estados del controlador del circuito. Multiplicand 32 bits Circuito para n = 32 bits con las conexiones y señales de 32-bit ALU control necesarias. •Un contador de 0 a n para contar el número de iteraciones. mitad 1 Producto = 0? derecha con el multiplicador) Productoizq ← Productoizq + 3. Shift right Control Product Write test 64 bits 19 Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 3ª versión Operaciones de la fase de inicio: Inicio 1. •Un biestable para guardar el acarreo de las sumas (no aparece en el dibujo). Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 3ª versión Circuitería necesaria: •Un registro de n bits para el multiplicando. •Un sumador de n bits. 20 . o cargarse en paralelo en su mitad derecha dejando intacta su mitad izquierda. •Un registro de 2n bits para el producto. Iniciar el registro Producto ¿Bit 0 del (mitad izquierda a 0. •Un controlador para generar la secuencia de señales necesaria. este registro admitirá desplazamientos lógicos unitarios hacia la derecha del registro completo concatenando el biestable de acarreo por la izquierda.

multiplicar M=10102=1010 por m=00112=310 Iteración Paso Multiplicando Producto 0 Valores iniciales 1010 0 0000 0011 1 Productoizq ← Productoizq + Multiplicando “ 0 1010 0011 Desplazar Producto a la derecha “ 0 0101 0001 2 Productoizq ← Productoizq + Multiplicando “ 0 1111 0001 Desplazar Producto a la derecha “ 0 0111 1000 3 Ninguna operación “ “ Desplazar Producto a la derecha “ 0 0011 1100 4 Ninguna operación “ “ Desplazar Producto a la derecha “ 0001 1110  Los números utilizados están en binario puro. ƒCon multiplicador negativo en la última iteración hay que restar en vez de sumar.  El algoritmo se puede adaptar a números en complemento a 2. Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: 3ª versión  Ejemplo: n=4. 21 Circuitos para multiplicación y división de números en coma fija Multiplicación por S – D: ruta de datos 3ª versión Ini Clr CE Contador 0-3 CONTROLADOR Fin TC INICIO Cuenta Desplaza Carga BitZ0 A3 A2 A1 A0 L Multiplicando B3 B2 Sumador de 4 bits B1 B0 Clr D Clr L L CE c Producto Multiplicador Reloj S S Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 22 .

1 1 0 . Circuitos para multiplicación y división de números en coma fija 4. y va generando productos parciales que va sumando y acumulando.. una cadena de bits a 1 equivale a una diferencia de dos potencias de 2 (es una suma de elementos de una progresión geométrica de razón 2). Multiplicación por grupos solapados  El algoritmo de lápiz y papel (o suma – desplazamiento) considera los bits del multiplicador uno a uno.  Los algoritmos de multiplicación por grupos solapados (G-S) generan productos parciales considerando los bits del multiplicador por grupos.  De cara a la siguiente iteración.  Los algoritmos de multiplicación por G-S analizan una “ventana” o grupo de n bits del multiplicador en cada iteración. la ventana de bits analizados se desplaza un lugar hacia la derecha (las ventanas o grupos de bits del multiplicador se solapan en las sucesivas interaciones)..  En un número binario. se generan uno o varios productos parciales... Multiplicadori Multiplicadori-1 Operación 0 0 Nada (en medio de cadena de ceros) 0 1 Sumar (inicio de cadena de unos) 1 0 Restar (final de cadena de unos) 1 1 Nada (en medio de cadena de unos) 24 .  El caso de G-S más sencillo es el algoritmo de Booth.  En función de los bits de la ventana. 0 1 1 .. = 2k+1-2j  El algoritmo analiza los bits del multiplicador 2 a 2 de derecha a izquierda: •Si detecta que está al final de una cadena de bits a 1 resta la mitad izquierda del registro producto menos el multiplicando •Si detecta que está al principio de una cadena de bits a 1 suma la mitad izquierda del registro producto más el multiplicando. que considera grupos solapados de 2 bits en el multiplicador para generar los productos parciales. k k-1 j+1 j . 23 Circuitos para multiplicación y división de números en coma fija Algoritmo de Booth  El algoritmo de Booth presentado funciona para operandos en complemento a 2 (para binario puro habría que realizar una pequeña adaptación)..

-1 cuando termina cadena de bits a 1 (implica hacer una resta). Ejemplo: recodificación del número 01001110C2 Número original 0 1 0 0 1 1 1 0 Número recodificado 1 -1 0 1 0 0 -1 0 Ejemplo: recodificación del número 11100011C2 Número original 1 1 1 0 0 0 1 1 Número recodificado 0 0 -1 0 0 1 0 -1 Los números en binario puro se recodifican añadiendo un bit a 0 a la izquierda del todo (ejercicio: probarlo). el algoritmo de Booth se basa en recodificar el multiplicador y convertirlo en una secuencia de dígitos con valores 1. 0 y –1 (codificación de dígitos con signo). 1 cuando comienza cadena de bits a 1 (implica hacer una suma). 0 en otro caso. Circuitos para multiplicación y división de números en coma fija Algoritmo de Booth  En definitiva. 25 Circuitos para multiplicación y división de números en coma fija Algoritmo de Booth  Ejemplo: multiplicar M=10100110C2=-9010 por m=00011001C2=2510 Recodificamos el multiplicador y realizamos la operación: Multiplicador original 0 0 0 1 1 0 0 1 Multiplicador recodificado 0 0 1 0 -1 0 1 -1 0000000001011010 M*m0*(-20) = -1*M + 1111111101001100 M*m1*21 = 2*M + 0000000000000000 M*m2*22 = 0 + 0000001011010000 M*m3*(-23) = -8*M + 0000000000000000 M*m4*24 = 0 + 1111010011000000 M*m5*25 = 32*M + 0000000000000000 M*m6*26 = 0 + 0000000000000000 M*m7*27 = 0 1111011100110110 M*m 26 .

•Realizar desplazamientos aritméticos (extendiendo el signo). mitad derecha con el multiplicador. 00 Productoizq ← Productoizq + Multiplicando 11 Multiplicando No Desplazar Producto # p-1 a la derecha  Operaciones de la fase de inicio: Contador ← Contador+1 1. •Añadir un bit que se concatenará a la derecha del registro Producto. Circuitos para multiplicación y división de números en coma fija Algoritmo de Booth  Podría emplearse la circuitería del algoritmo de suma-desplazamiento con algunas pequeñas modificaciones (se parte de la versión 3): •Utilizar un sumador-restador. bit p-1 a 0) Sí 3. Multiplicand 32 bits 32-bit ALU Shift right Control Product Write test 64 bits 27 Circuitos para multiplicación y división de números en coma fija Algoritmo de Booth Multiplicand Inicio 32 bits 32-bit ALU 10 ¿ p0p-1 ? 01 Shift right Control Product Write test 64 bits Productoizq ← Productoizq . Ejercicio: dibujar el diagrama •p-1: bit añadido a la derecha del registro Producto. iniciado con un 0 y que se modificará cada vez que se haga un desplazamiento sobre Producto (la ventana de bits analizada en cada iteración está formada por el bit menos significativo del registro Producto y el bit añadido a su derecha). de estados del controlador del •Producto # p-1: registro Producto concatenado con el bit p-1. 28 . Contador ← 0 Fin  Aclaraciones: •p0: bit menos significativo del registro Producto. Iniciar el registro Multiplicando 2. Iniciar el registro Producto (mitad ¿ Contador = 0 ? izquierda a 0. circuito. ya que se manejan datos en complemento a 2. •Despreciar el bit de acarreo superior.

Circuitos para multiplicación y división de números en coma fija Algoritmo de Booth  Ejemplo: n=4. •Los sumadores en árbol. •Reducir el número de productos parciales que hay que sumar. Circuitos para multiplicación rápida  En vez de ejecutar la multiplicación a través de un proceso iterativo de sumas y desplazamientos regulado por un controlador secuencial. •Recodificación de Booth utilizando grupos solapados de 3 ó más bits.  Para reducir el número de productos parciales se puede recurrir por ejemplo a: •Multiplicadores en base mayor que 2 (normalmente en base 4).  El algoritmo se puede adaptar a números en binario puro.Multiplicando “ 0110 0011 0 Desplazar Producto a la derecha “ 0011 0001 1 2 Ninguna operación “ “ Desplazar Producto a la derecha “ 0001 1000 1 3 Productoizq ← Productoizq + Multiplicando “ 1011 1000 1 Desplazar Producto a la derecha “ 1101 1100 0 4 Ninguna operación “ “ Desplazar Producto a la derecha “ 1110 1110  Los números utilizados están en complemento a 2.  Para construir multiplicadores de altas velocidades caben dos posibilidades: •Sumar los productos parciales rápidamente.  Otra técnica: guardar todos los posibles resultados en una ROM. el producto se puede realizar a partir de un sumador de múltiples sumandos (los productos parciales) convenientemente organizados. 29 Circuitos para multiplicación y división de números en coma fija 5.  Para sumar los productos parciales más rápido se puede recurrir por ejemplo a: •Las matrices de sumadores. ƒSi el multiplicador comienza por 1. realizar un ajuste final sumando el multiplicador a la mitad izquierda del registro Producto. multiplicar M=1010C2= -610 por m=0011C2=310 El multiplicando cambiado de signo es –M=0110C2 Iteración Paso Multiplicando Producto 0 Valores iniciales 1010 0000 0011 0 1 Productoizq ← Productoizq . •¡La ROM tendría 22n posiciones de 2n bits cada una! 30 .

•La división se puede realizar en la UAL mediante una secuencia de sumas.  También es posible multiplicar números con signo: • Multiplicador de Pezaris. •R: resto. División binaria en coma fija  La operación de división de números en coma fija no suele estar contemplada directamente por las UAL. sino que se suele realizar mediante circuitos específicos: •Construir un circuito divisor rápido es aún más complicado que en el caso del multiplicador.  Para mejorar las prestaciones del circuito. aunque esto es mucho menos eficiente aún. 32 . •C: cociente. • Árbol de Wallace.  Primer enfoque para multiplicar rápidamente: 1) Calcular los productos parciales mediante puertas AND 2) Sumar dichos productos parciales mediante sumadores tradicionales. •Antes de dividir. comparaciones y desplazamientos. • Árbol de Dadda. •La división puede realizarse también mediante un programa en ensamblador que conste de un bucle con una secuencia de sumas. los circuitos deben comprobar obligatoriamente si el divisor es igual o distinto de 0 para evitar desbordamientos. restas. restas. • Multiplicador de Baugh-Wooley. comparaciones y desplazamientos controlados por la unidad de control (UC).  Terminología de la división: D/d=C dxC+R=D •D: dividendo. Circuitos para multiplicación y división de números en coma fija Matriz de sumadores con acarreo propagado  Multiplicar consiste en sumar varios productos parciales desplazados. si bien no resulta demasiado eficiente. pueden utilizarse otros enfoques: • Matriz de CSA.  Pega: retardo total grande. 31 Circuitos para multiplicación y división de números en coma fija 6. •d: divisor.

•Los bits sobrantes (parte fraccionaria del resultado) constituirían el resto de la división entera... 1 0 0 0 1 1 1 0 cociente 0 1 1 0 0 -100 0 0 1 0 0 0 . ya que sólo puede valer 0 ó 1. + a 0 ⋅ 2 0 N = a n-1 ⋅ 2 n-1−m + . resto = 0012  Si el divisor es una constante que no es potencia de 2.  Si el dividendo parcial es mayor o igual que el divisor. N = a n-1 ⋅ 2 n-1 + . 34 . 112 8 dividendo 1 1 1 0 0 0 0 1 0 0 0 divisor 0 14 . si no es 0.. División por un valor constante  La división es una operación costosa en tiempo de ejecución...10 0 0 0 0 0 0 0 .0 0 0 0 0 0 0 0 resto 33 Circuitos para multiplicación y división de números en coma fija 7.. •Si el divisor es 2k.. el cociente se obtiene desplazando el dividendo k lugares a la derecha. es aconsejable evitar las multiplicaciones en los programas siempre que sea posible.. el cociente de la división se puede obtener mediante por un desplazamiento del dividendo hacia la derecha (¡esto es cierto sólo para números en binario puro!).. Por tanto.  Cuando el divisor es una constante potencia de 2.  Si el divisor es una constante conocida en tiempo de compilación (o ensamblaje). el cálculo es complicado. convenientemente escalado por 2k.. Circuitos para multiplicación y división de números en coma fija División binaria en coma fija Es fácil elegir cada dígito del cociente. + a 0 ⋅ 2 0 −m 2m •Ejemplo: 11010012 / 23 ⇒ cociente = 11012.... el compilador (o ensamblador) puede sustituir la división por otras operaciones. el siguiente dígito del cociente es 1..

en cada uno de los cuales se realizarán las siguientes operaciones: 1. Ir a 4.  Será un proceso iterativo de n+1 ciclos. Circuitos para multiplicación y división de números en coma fija 8.  Se incluirá una tercera versión del algoritmo aún más optimizada acompañada del correspondiente circuito.  Finalmente se indicarán las modificaciones que será preciso introducir en los circuitos para poder dividir números con signo. Se resta el dividendo parcial menos el divisor. Por tanto. Si la resta es positiva seguimos por el paso 2. y si es negativa vamos al paso 3. Se desplaza el divisor un lugar a la derecha. 35 Circuitos para multiplicación y división de números en coma fija División con restauración: 1ª versión  La división se realizará más o menos igual que como se hace con lápiz y papel. con el correspondiente circuito. Por tanto. y se desplaza el mismo un lugar a la derecha. 3.  Los circuitos que vamos a ver a continuación se basan en: •Un sumador/restador. se añade un 1 al cociente. 4. •Un circuito secuencial de control. •Varios registros de desplazamiento.  A continuación se presentará un circuito que permite realizar la operación utilizando dicho algoritmo. Resta positiva: el dividendo parcial cabe en el divisor. que puede ser el de la UAL. que puede ser parte de la UC. Ir a 4. División con restauración  En primer lugar se presentará un algoritmo básico para dividir números en binario puro (sin signo) de n bits. se añade un 0 al cociente y se desplaza el mismo un lugar a la derecha. Resta negativa: el dividendo parcial no cabe en el divisor.  Seguidamente se presentará una versión optimizada del algoritmo. 2. 36 . Se restaura el dividendo parcial sumándole el divisor.

Divisor Sh ift right 64 bits Circuito para n = 32 bits con Q uotie nt las conexiones y señales de 64-bit ALU Sh ift left control necesarias. •Un sumador / restador de 2n bits. mitad inferior Desplazar Cociente 1 bit Resto← Resto+Divisor hacia la izquierda Desplazar Cociente 1 bit con todos los bits a 0). Iniciar el registro Resto (mitad Resto← Resto-Divisor superior con todos los bits a 0. •Un controlador para generar la secuencia de señales necesaria. Iniciar el registro Divisor (mitad superior con el divisor. •Un contador de 0 a n+1 para contar el número de iteraciones. 32 bits R em ainder Control W rite test 64 bits 37 Circuitos para multiplicación y división de números en coma fija División con restauración: 1ª versión Operaciones de la fase de inicio: Inicio 1. Contador ← 0 Desplazar Divisor 1 bit hacia la derecha Divisor Sh ift right 64 bits Contador← Contador+1 Q uotie nt ¿Contador=n+1? 64-bit ALU Sh ift left 32 bits Sí R em ainder Control Fin W rite test 64 bits Ejercicio propuesto: dibujar el diagrama de estados del controlador del circuito. mitad inferior con el dividendo). No ¿Resto < 0? Sí 2. Cociente0← 1 3. •Un registro de n bits capaz de realizar desplazamientos unitarios hacia la izquierda para el cociente. Circuitos para multiplicación y división de números en coma fija División con restauración: 1ª versión Circuitería necesaria: •Un registro de 2n bits que inicialmente contendrá el dividendo. 38 . Cociente ← 0 hacia la izquierda No Cociente0← 0 4. •Un registro de 2n bits capaz de realizar desplazamientos unitarios hacia la derecha para el divisor.

Resto: registro completo). se ideó un algoritmo similar al anterior.  Puesto que las sumas y restas son de n bits.Divisor “ “ 0000 0100 Resto≥0⇒ sll Cociente. Restoder: mitad derecha. •Como consecuencia de lo anterior.  Deja de ser necesario desplazar el registro Divisor. •Los desplazamientos se realizan sobre el registro completo. •En cada iteración se suma y/o resta sólo sobre la mitad izquierda. el registro Resto estará dividido en dos mitades (Restoizq: mitad izquierda. 40 .  Por tanto.  Nunca puede haber un 1 en el primer dígito del cociente: por consiguiente. Cociente0=1 0001 “ “ Desplazar Divisor a la derecha “ 0000 0011 “ 5 Resto ← Resto .  Sigue siendo preciso desplazar el registro Cociente para escribir en su bit 0 el nuevo dígito calculado en cada paso. Cociente0=1 0011 “ “ Desplazar Divisor a la derecha 0011 0000 0001 0000 0001 39 Circuitos para multiplicación y división de números en coma fija División con restauración: 2ª versión  En el circuito anterior sucede que: •La mitad de los bits del divisor no contienen información útil.Divisor “ “ 1101 0000 Resto<0⇒+Divisor. Cociente0=0 0000 “ 0000 1010 Desplazar Divisor a la derecha “ 0000 1100 “ 3 Resto ← Resto . pero sin duplicar el tamaño del divisor. sll Cociente. también sobra la mitad de la UAL.Divisor “ “ 0000 0001 Resto≥0⇒ sll Cociente. Circuitos para multiplicación y división de números en coma fija División con restauración: 1ª versión  Ejemplo: n=4. pueden reordenarse el desplazamiento y la resta de forma que se elimine una iteración del algoritmo. pues está sumando y/o restando en cada paso el doble de datos de lo estrictamente necesario.  El resto queda en la mitad izquierda del registro Resto. dividir D=10102=1010 por d=00112=310 Iteración Paso Cociente Divisor Resto 0 Valores iniciales 0000 0011 0000 0000 1010 1 Resto ← Resto . Cociente0=0 0000 “ 0000 1010 Desplazar Divisor a la derecha “ 0000 0110 “ 4 Resto ← Resto .Divisor “ “ 1111 0010 Resto<0⇒+Divisor.Divisor “ “ 1111 1110 Resto<0⇒+Divisor. y utilizando un sumador / restador de n bits. Cociente0=0 0000 “ 0000 1010 Desplazar Divisor a la derecha 0001 0001 1000 “ 2 Resto ← Resto . sll Cociente. sll Cociente.

mitad superior con todos sus bits a 0) 3. •Un controlador para generar la secuencia de señales necesaria. •Un contador de 0 a n para contar el número de iteraciones. este registro admitirá desplazamientos lógicos unitarios del registro completo hacia la izquierda. •Un registro de n bits capaz de realizar desplazamientos lógicos unitarios hacia la izquierda para el cociente. Divisor 32 bits Circuito para n = 32 bits con Quotient las conexiones y señales de 32-bit ALU Shift left control necesarias. •Un registro de 2n bits para el resto. 42 . que pueda cargarse en paralelo en una mitad dejando intacta la otra mitad. Iniciar el registro Resto (mitad Restoizq← Restoizq-Divisor inferior con el dividendo. Contador ← 0 No Desplazar Cociente 1 bit hacia la izquierda hacia la izquierda Desplazar Cociente 1 bit Cociente0← 1 hacia la izquierda Divisor Cociente0← 0 32 bits Contador← Contador+1 Quotient 32-bit ALU Shift left 32 bits ¿Contador=n? Sí Shift left Control Remainder Write test Desplazar Restoizq 1 bit 64 bits hacia la derecha Fin Ejercicio propuesto: dibujar el diagrama de estados del controlador del circuito. 32 bits Shift left Control Remainder Write test 64 bits 41 Circuitos para multiplicación y división de números en coma fija División con restauración: 2ª versión Inicio Operaciones de la fase de inicio: Desplazar Resto 1 bit hacia la izquierda 1. •Un sumador / restador de n bits. Iniciar el registro Divisor 2. Circuitos para multiplicación y división de números en coma fija División con restauración: 2ª versión Circuitería necesaria: •Un registro de n bits para el divisor. Cociente ← 0 No ¿Resto < 0? Sí Desplazar Resto 1 bit Restoizq← Restoizq+Divisor hacia la izquierda Desplazar Resto 1 bit 4.

 Al final el cociente queda en la mitad menos significativa del registro Resto. se incorporó una mejora al circuito. sll Cociente. sll Resto. cuando obtengamos un bit del cociente. lo almacenaremos en el bit menos significativo del registro Resto.  En cada iteración. Cociente0=1 0001 “ 0100 0000 4 Restoizq ← Restoizq – Divisor “ 0001 0000 Resto≥0⇒ sll Resto. mientras que el resto queda en la mitad más significativa de dicho registro. Cociente0=1 0011 “ 0010 0000 Ajuste final Desplazar Restoizq a la derecha 0011 “ 0001 0000 43 Circuitos para multiplicación y división de números en coma fija División con restauración: 3ª versión  En el circuito anterior sucede que: •Al principio. sll Cociente. sll Cociente. •A medida que van realizándose pasos del algoritmo.  Por tanto. el registro Resto está completamente ocupado. dividir D=10102=1010 por d=00112=310 Iteración Paso Cociente Divisor Resto 0 Valores iniciales 0000 0011 0000 1010 Desplazar Resto a la izquierda “ “ 0001 0100 1 Restoizq ← Restoizq – Divisor “ “ 1110 0100 Resto<0⇒ +Divisor. parte del contenido del registro Resto comienza a estar desaprovechado. obtenemos los bits del cociente uno a uno. Circuitos para multiplicación y división de números en coma fija División con restauración: 2ª versión  Ejemplo: n=4.  El dividendo se carga inicialmente en la mitad derecha del registro Resto. de forma que el registro Cociente desaparece. •El espacio desaprovechado del registro Resto es exactamente igual que el número de bits del cociente que tenemos calculados en cada instante. sll Resto. Cociente0=0 0000 “ 0010 1000 2 Restoizq ← Restoizq – Divisor “ “ 1111 1000 Resto<0⇒ +Divisor. Cociente0=0 0000 “ 0101 0000 3 Restoizq ← Restoizq – Divisor “ “ 0010 0000 Resto≥0⇒ sll Resto. 44 . sll Cociente. •Según realizamos pasos.

•Un registro de 2n bits para el resto y el cociente. mitad derecha con Restoizq← Restoizq-Divisor el dividendo) No ¿Resto < 0? Sí 3. Shift right Remainder Control Shift left test Write 64 bits 45 Circuitos para multiplicación y división de números en coma fija División con restauración: 3ª versión Inicio Operaciones de la fase de inicio: Desplazar Resto 1 bit 1. 46 . Iniciar el registro Divisor hacia la izquierda 2. Iniciar el registro Resto (mitad izquierda a 0. este registro admitirá desplazamientos lógicos unitarios hacia la izquierda del registro completo. Divisor 32 bits Circuito para n = 32 bits con 32-bit ALU las conexiones y señales de control necesarias. •Un sumador / restador de n bits. Contador ← 0 Desplazar Resto 1 bit Restoizq← Restoizq+Divisor No hacia la izquierda Desplazar Resto 1 bit Divisor Resto0← 1 hacia la izquierda Resto0← 0 32 bits Contador← Contador+1 32-bit ALU ¿Contador=n? Sí Shift right Remainder Control Desplazar Restoizq 1 bit Shift left test hacia la derecha Write 64 bits Fin Ejercicio propuesto: dibujar el diagrama de estados del controlador del circuito. o cargarse en paralelo en su mitad derecha dejando intacta su mitad izquierda. •Un contador de 0 a n para contar el número de iteraciones. que pueda cargarse en paralelo en su mitad izquierda dejando intacta la mitad derecha. •Un controlador para generar la secuencia de señales necesaria. Circuitos para multiplicación y división de números en coma fija División con restauración: 3ª versión Circuitería necesaria: •Un registro de n bits para el divisor.

y ajustando los signos del cociente y/o el resto si es preciso: •Si el signo del dividendo y el del divisor coinciden. dividir D=10102=1010 por d=00112=310 Iteración Paso Divisor Resto 0 Valores iniciales 0011 0000 1010 Desplazar Resto a la izquierda “ 0001 0100 1 Restoizq ← Restoizq – Divisor “ 1110 0100 Resto<0⇒ Restoizq ← Restoizq + Divisor “ 0001 0100 Desplazar Resto a la izquierda 0010 1000 Resto0=0 0010 1000 2 Restoizq ← Restoizq – Divisor “ 1111 1000 Resto<0⇒ Restoizq ← Restoizq + Divisor “ 0010 1000 Desplazar Resto a la izquierda 0101 0000 Resto0=0 0101 0000 3 Restoizq ← Restoizq – Divisor “ 0010 0000 Resto≥0⇒ Desplazar Resto a la izquierda “ 0100 0000 Resto0=1 0100 0001 4 Restoizq ← Restoizq – Divisor “ 0001 0001 Resto≥0⇒ Desplazar Resto a la izquierda “ 0010 0010 Resto0=1 0010 0011 Ajuste final Desplazar Restoizq a la derecha “ 0001 0011 47 Circuitos para multiplicación y división de números en coma fija División con restauración  Los algoritmos y circuitos mostrados dividen números dados en binario puro.  División de números en complemento a 2: se puede hacer pasando los operandos a positivos antes de hacer la división. el cociente es positivo. •Puede hacerse división con restauración para números en complemento a 2. y en caso contrario es negativo. •El signo del resto es el mismo que el del dividendo. Circuitos para multiplicación y división de números en coma fija División con restauración: 3ª versión  Ejemplo: n=4. aunque el algoritmo es complicado. 48 .

la parte más significativa del resultado queda en Hi y la menos significativa en Lo. Circuitos para multiplicación y división de números en coma fija 9. mulu): operandos de 16 bits. 49 . •División (divs. el cociente queda en Lo y el resto en Hi. •En la multiplicación. •En la división. ƒSin signo: divu.  MC68000: •Multiplicación (muls. ƒSin signo: multu. •Instrucciones de división: ƒCon signo: div. Multiplicación y división en ensamblador  MIPS •La multiplicación y la división emplean dos registros especiales para guardar los resultados: Hi y Lo. •Instrucciones de multiplicación: ƒCon signo: mult. divu): dividendo de 32 bits. divisor de 16 bits. cociente de 16 bits. resto de 16 bits. resultado de 32 bits.