Articulo de referencia

Multiplicador binario

Un multiplicador binario es un circuito electrónico utilizado en la electrónica digital , como por ejemplo en un ordenador , para multiplicar dos números binarios . Se pueden ut...

Un multiplicador binario es un circuito electrónico utilizado en la electrónica digital , como por ejemplo en un ordenador , para multiplicar dos números binarios .

Se pueden utilizar diversas técnicas de aritmética computacional para implementar un multiplicador digital. La mayoría de estas técnicas implican el cálculo del conjunto de productos parciales, que luego se suman mediante sumadores binarios . Este proceso es similar a la multiplicación larga , con la diferencia de que utiliza un sistema numérico binario (base 2 ) .

Historia

Entre 1947 y 1949, Arthur Alec Robinson trabajó para English Electric , primero como aprendiz y luego como ingeniero de desarrollo. Durante este período, cursó un doctorado en la Universidad de Manchester, donde trabajó en el diseño del multiplicador de hardware para la primera computadora Mark 1. Sin embargo, hasta finales de la década de 1970, la mayoría de las minicomputadoras no tenían una instrucción de multiplicación, por lo que los programadores usaban una "rutina de multiplicación" [ 1 ] [ 2 ] [ 3 ] que desplazaba y acumulaba repetidamente resultados parciales, a menudo escrita usando desenrollado de bucles . Las computadoras centrales tenían instrucciones de multiplicación, pero realizaban el mismo tipo de desplazamientos y sumas que una "rutina de multiplicación".

Los primeros microprocesadores tampoco tenían instrucción de multiplicación. Aunque la instrucción de multiplicación se hizo común con la generación de 16 bits, [ 4 ] al menos dos procesadores de 8 bits tienen una instrucción de multiplicación: el Motorola 6809 , introducido en 1978, [ 5 ] y la familia Intel MCS-51 , desarrollada en 1980, y más tarde los modernos microprocesadores Atmel AVR de 8 bits presentes en los microcontroladores ATMega, ATTiny y ATXMega.

A medida que se dispuso de más transistores por chip gracias a la integración a mayor escala, fue posible colocar suficientes sumadores en un solo chip para sumar todos los productos parciales a la vez, en lugar de reutilizar un único sumador para procesar cada producto parcial individualmente.

Debido a que algunos algoritmos comunes de procesamiento de señales digitales dedican la mayor parte de su tiempo a la multiplicación, los diseñadores de procesadores de señales digitales sacrifican una considerable área del chip para que la multiplicación sea lo más rápida posible; una unidad de multiplicación y acumulación de un solo ciclo a menudo consumía la mayor parte del área del chip de los primeros DSP.

Multiplicación de enteros sin signo

Multiplicación binaria larga

El método que se enseña en la escuela para multiplicar números decimales se basa en calcular productos parciales, desplazarlos a la izquierda y luego sumarlos. La parte más difícil es obtener los productos parciales, ya que esto implica multiplicar un número largo por un dígito (del 0 al 9):

 123 × 456 ===== 738 (esto es 123 × 6) 615 (esto es 123 × 5, desplazado una posición a la izquierda) + 492 (esto es 123 × 4, desplazado dos posiciones a la izquierda) ===== 56088

Una computadora binaria realiza exactamente la misma multiplicación que los números decimales, pero con números binarios. En la codificación binaria, cada número largo se multiplica por un dígito (0 o 1), lo cual es mucho más sencillo que en decimal, ya que el producto por 0 o 1 es simplemente 0 o el mismo número. Por lo tanto, la multiplicación de dos números binarios se reduce a calcular productos parciales (que son 0 o el primer número), desplazarlos a la izquierda y luego sumarlos (una suma binaria, por supuesto).

 1011 (esto es binario para decimal 11) × 1110 (esto es binario para decimal 14) ====== 0000 (esto es 1011 × 0) 1011 (esto es 1011 × 1, desplazado una posición a la izquierda) 1011 (esto es 1011 × 1, desplazado dos posiciones a la izquierda) + 1011 (esto es 1011 × 1, desplazado tres posiciones a la izquierda) ========= 10011010 (esto es binario para decimal 154)

Esto es mucho más sencillo que en el sistema decimal, ya que no hay que memorizar ninguna tabla de multiplicar: solo se trata de desplazamientos y sumas.

Este método es matemáticamente correcto y tiene la ventaja de que una CPU pequeña puede realizar la multiplicación utilizando las funciones de desplazamiento y suma de su unidad aritmético-lógica en lugar de un circuito especializado. Sin embargo, el método es lento, ya que implica muchas sumas intermedias. Estas sumas consumen mucho tiempo. Se pueden diseñar multiplicadores más rápidos para realizar menos sumas; un procesador moderno podría implementar un sumador paralelo dedicado para productos parciales, lo que permitiría multiplicar dos números de 64 bits con solo 6 rondas de sumas, en lugar de 63.

Una visión concreta

Supongamos que queremos multiplicar dos enteros sin signo de 8 bits: a [7:0] y b [7:0]. Podemos producir ocho productos parciales realizando ocho multiplicaciones de 1 bit, una por cada bit del multiplicando a :

p0[7:0] = a[0] × b[7:0] = {8{a[0]}} & b[7:0] p1[7:0] = a[1] × b[7:0] = {8{a[1]}} y b[7:0] p2[7:0] = a[2] × b[7:0] = {8{a[2]}} & b[7:0] p3[7:0] = a[3] × b[7:0] = {8{a[3]}} & b[7:0] p4[7:0] = a[4] × b[7:0] = {8{a[4]}} & b[7:0] p5[7:0] = a[5] × b[7:0] = {8{a[5]}} y b[7:0] p6[7:0] = a[6] × b[7:0] = {8{a[6]}} & b[7:0] p7[7:0] = a[7] × b[7:0] = {8{a[7]}} & b[7:0]

donde se utiliza la siguiente notación Verilog :

  • {8{a[0]}} significa repetir a[0] (el bit 0 de a) 8 veces.
  • a [7:0] significa seleccionar a desde su bit 7 hasta su bit 0, ambos inclusive, para un total de 8 bits.
  • &El símbolo representa una operación AND bit a bit.

Para obtener nuestro producto, debemos sumar nuestros ocho productos parciales, como se muestra aquí:

 p0[7] p0[6] p0[5] p0[4] p0[3] p0[2] p0[1] p0[0] + p1[7] p1[6] p1[5] p1[4] p1[3] p1[2] p1[1] p1[0] 0 + p2[7] p2[6] p2[5] p2[4] p2[3] p2[2] p2[1] p2[0] 0 0 + p3[7] p3[6] p3[5] p3[4] p3[3] p3[2] p3[1] p3[0] 0 0 0 + p4[7] p4[6] p4[5] p4[4] p4[3] p4[2] p4[1] p4[0] 0 0 0 0 + p5[7] p5[6] p5[5] p5[4] p5[3] p5[2] p5[1] p5[0] 0 0 0 0 0 + p6[7] p6[6] p6[5] p6[4] p6[3] p6[2] p6[1] p6[0] 0 0 0 0 0 0 + p7[7] p7[6] p7[5] p7[4] p7[3] p7[2] p7[1] p7[0] 0 0 0 0 0 0 0 ----------------------------------------------------------------------------------------------- P[15] P[14] P[13] P[12] P[11] P[10] P[9] P[8] P[7] P[6] P[5] P[4] P[3] P[2] P[1] P[0]

En otras palabras, P [15:0] se produce sumando p0 , p1 << 1, p2 << 2, y así sucesivamente, para producir nuestro producto final sin signo de 16 bits:

P [15:0] = p0[7:0] + (p1[7:0] << 1) + (p2[7:0] << 2) + (p3[7:0] << 3) + (p4[7:0] << 4) + (p5[7:0] << 5) + (p6[7:0] << 6) + (p7[7:0] << 7)

Construir sobre bloques más pequeños

Supongamos que ahora queremos multiplicar dos enteros sin signo de 16 bits: u [15:0] y v [15:0], utilizando el multiplicador de 8x8 bits anterior. Utilizando el método de productos parciales (justificado por la asociatividad de la multiplicación) y operando en bloques de 8 bits, tenemos:

p0[15:0] = u[7:0] × v[7:0] p1[15:0] = u[15:8] × v[7:0] p2[15:0] = u[7:0] × v[15:8] p3[15:0] = u[15:8] × v[15:8]

El producto final sería entonces:

P[31:0] = p0 + p1 << 8 + p2 << 8 + p3 << 16

Se observa que si solo se requiere P[15:0] (los 16 bits inferiores del resultado), no es necesario calcular p3.

Implementación de hardware

Como se describió anteriormente, el proceso de multiplicación se puede dividir en 3 pasos: [ 6 ] [ 7 ]

  • generando producto parcial
  • reduciendo producto parcial
  • producto final de cálculo

Mayús + añadir

Las arquitecturas de multiplicadores más antiguas empleaban un desplazador y un acumulador para sumar cada producto parcial, a menudo un producto parcial por ciclo, sacrificando velocidad por área del chip. Para lograr la capacidad de realizar una acumulación por ciclo, se requiere un sumador rápido (algo más rápido que el acarreo en cascada). [ 8 ]

multiplicadores modernos

Las arquitecturas de multiplicadores modernas utilizan el algoritmo de Baugh-Wooley (modificado) , [ 9 ] [ 10 ] [ 11 ] [ 12 ] árboles de Wallace o multiplicadores de Dadda para sumar los productos parciales en un solo ciclo.

En un multiplicador rápido, el proceso de reducción de productos parciales (es decir, el cálculo de sumas parciales) suele ser el que más contribuye al retardo, la potencia y el área del multiplicador. [ 6 ] Para mayor velocidad, las etapas de "reducción de productos parciales" se implementan típicamente como un sumador con acarreo guardado compuesto por compresores y el paso de "cálculo del producto final" se implementa como un sumador rápido.

Un compresor es cualquier dispositivo que recibe más bits de entrada de los que genera como salida. En el contexto de la ingeniería de multiplicadores, se refiere a un sumador con acarreo de entrada y de salida. El compresor básico es el sumador completo, un "compresor 3:2": muchos multiplicadores rápidos utilizan un compresor de este tipo implementado en CMOS estático .

Para lograr un mejor rendimiento en la misma área o el mismo rendimiento en un área más pequeña, los diseños de multiplicadores pueden usar compresores de orden superior como compresores 7:3; [ 7 ] [ 6 ] implementar los compresores en lógica más rápida (como lógica de puerta de transmisión, lógica de transistor de paso, lógica de dominó ); [ 8 ] conectar los compresores en un patrón diferente; o alguna combinación.

El rendimiento de la implementación del árbol de Wallace a veces mejora al codificar uno de los dos multiplicandos mediante una codificación Booth modificada , lo que reduce el número de productos parciales que deben sumarse.

Multiplicador de ciclo único

Un multiplicador de "ciclo único" (o "multiplicador rápido") es lógica combinacional pura .

Esquema de un multiplicador binario de 2 bits por 2 bits que utiliza los símbolos estadounidenses IEEE Std 91/91a-1991 para su implementación con dos puertas XOR y seis puertas AND .

Extensión a otros tipos de datos

Números enteros con signo

Si b hubiera sido un entero con signo en lugar de un entero sin signo , los productos parciales habrían necesitado extenderse con signo hasta el ancho del producto antes de sumarlos. Si a hubiera sido un entero con signo, el producto parcial p7 habría necesitado restarse de la suma final, en lugar de sumarse.

El multiplicador de matriz anterior se puede modificar para admitir números con signo en notación de complemento a dos invirtiendo varios de los términos del producto e insertando un uno a la izquierda del primer y último término parcial del producto:

 1 ~p0[7] p0[6] p0[5] p0[4] p0[3] p0[2] p0[1] p0[0] + ~p1[7] p1[6] p1[5] p1[4] p1[3] p1[2] p1[1] p1[0] 0 + ~p2[7] p2[6] p2[5] p2[4] p2[3] p2[2] p2[1] p2[0] 0 0 + ~p3[7] p3[6] p3[5] p3[4] p3[3] p3[2] p3[1] p3[0] 0 0 0 + ~p4[7] p4[6] p4[5] p4[4] p4[3] p4[2] p4[1] p4[0] 0 0 0 0 + ~p5[7] p5[6] p5[5] p5[4] p5[3] p5[2] p5[1] p5[0] 0 0 0 0 0 + ~p6[7] p6[6] p6[5] p6[4] p6[3] p6[2] p6[1] p6[0] 0 0 0 0 0 0 + 1 p7[7] ~p7[6] ~p7[5] ~p7[4] ~p7[3] ~p7[2] ~p7[1] ~p7[0] 0 0 0 0 0 0 0 --------------------------------------------------------------------------------------------------------------- P[15] P[14] P[13] P[12] P[11] P[10] P[9] P[8] P[7] P[6] P[5] P[4] P[3] P[2] P[1] P[0]

Donde ~p representa el complemento (valor opuesto) de p.

En la matriz de bits anterior existen muchas simplificaciones que no se muestran y que no son obvias.

  • Las secuencias de un bit complementado seguido de bits no complementados implementan un truco de complemento a dos para evitar la extensión de signo.
  • La secuencia de p7 (bit no complementado seguido de todos los bits complementados) se debe a que estamos restando este término, por lo que todos fueron negados al principio (y se agregó un 1 en la posición menos significativa).

Para ambos tipos de secuencias, el último bit se invierte y se debe agregar un −1 implícito directamente debajo del MSB. Cuando se suman el +1 de la negación en complemento a dos para p7 en la posición de bit 0 (LSB) y todos los −1 en las columnas de bits 7 a 14 (donde se ubican los MSB), se pueden simplificar al único 1 que "mágicamente" flota hacia la izquierda. Para una explicación y demostración de por qué invertir el MSB nos ahorra la extensión de signo, consulte un libro de aritmética computacional. [ 13 ]

Números de punto flotante

Un número binario de punto flotante contiene un bit de signo, bits significativos (conocidos como mantisa) y bits de exponente (para simplificar, no consideramos la base ni el campo de combinación). Los bits de signo de cada operando se combinan mediante la operación XOR para obtener el signo del resultado. A continuación, se suman los dos exponentes para obtener el exponente del resultado. Finalmente, la multiplicación de la mantisa de cada operando devuelve la mantisa del resultado. Sin embargo, si el resultado de la multiplicación binaria es mayor que el número total de bits para una precisión específica (por ejemplo, 32, 64, 128), se requiere redondeo y el exponente se ajusta en consecuencia.

Véase también

Referencias

  1. Rather, Elizabeth D.; Colburn, Donald R.; Moore, Charles H. (1996) [1993]. "La evolución de Forth" . En Bergin, Thomas J.; Gibson, Richard G. (eds.). Historia de los lenguajes de programación - II . Association for Computing Machinery. pp. 625–670 . doi : 10.1145/234286.1057832 . ISBN  0201895021.
  2. Davies, AC; Fung, YT (1977). "Interfaz de un multiplicador de hardware a un microprocesador de propósito general" . Microprocesadores . 1 (7): 425– 432. doi : 10.1016/0308-5953(77)90004-6 .
  3. Rafiquzzaman, M. (2005). "§2.5.1 Aritmética binaria: Multiplicación de números binarios sin signo" . Fundamentos de lógica digital y diseño de microcomputadoras . Wiley . pág. 46. ISBN  978-0-47173349-2.
  4. Rafiquzzaman 2005 , §7.3.3 Suma, resta, multiplicación y división de números con y sin signo, pág. 251
  5. Kant, Krishna (2007). "§2.11.2 Microprocesadores de 16 bits" . Microprocesadores y microcontroladores: arquitectura, programación y diseño de sistemas 8085, 8086, 8051, 8096. PHI Learning. pág. 57. ISBN  9788120331914.
  6. 1 2 3 Rouholamini, Mahnoush; Kavehie, Omid; Mirbaha, Amir-Pasha; Jasbi, Somaye Jafarali; Navi, Keivan. "Un nuevo diseño para compresores 7:2" (PDF) .
  7. 1 2 Leong, Yuhao; Lo, Hai Hiung; Drieberg, Michael; Sayuti, Abu Bakar; Sebastián, Patricio. "Revisión comparativa de rendimiento del compresor 8-3 en FPGA" .
  8. 1 2 Peng Chang. "Diseño de un multiplicador digital reconfigurable y celdas compresoras 4:2" . 2008.
  9. Baugh, Charles Richmond; Wooley, Bruce A. (diciembre de 1973). "Un algoritmo de multiplicación de matrices paralelas en complemento a dos". IEEE Transactions on Computers . C-22 (12): 1045–1047 . doi : 10.1109/TC.1973.223648 . S2CID 7473784 . 
  10. ^ Hatamián, Mehdi; Efectivo, Glenn (1986). "Un multiplicador canalizado paralelo de 70 MHz, 8 bits × 8 bits en CMOS de 2,5 μm" . Revista IEEE de circuitos de estado sólido . 21 (4): 505– 513. Código bibliográfico : 1986IJSSC..21..505H . doi : 10.1109/jssc.1986.1052564 .
  11. Gebali, Fayez (2003). "Multiplicador de Baugh-Wooley" (PDF) . Universidad de Victoria , CENG 465 Lab 2. Archivado (PDF) del original el 14 de abril de 2018. Recuperado el 14 de abril de 2018 .
  12. Reynders, Nele; Dehaene, Wim (2015). Diseño de circuitos digitales de bajo voltaje y alta eficiencia energética . Circuitos analógicos y procesamiento de señales. Springer. doi : 10.1007/978-3-319-16136-5 . ISBN 978-3-319-16135-8. ISSN 1872-082X . LCCN 2015935431 .  
  13. Parhami, Behrooz (2000). Aritmética computacional: algoritmos y diseños de hardware . Oxford University Press . ISBN 0-19-512583-5.
  • Hennessy, John L.; Patterson, David A. (1990). «Sección A.2, sección A.9». Arquitectura de computadoras: un enfoque cuantitativo . Morgan Kaufmann. págs.  A–3..A–6, A–39..A–49. ISBN 978-0-12383872-8.
  • Diseños de multiplicadores orientados a FPGA
  • Circuito multiplicador binario que utiliza semisumadores y compuertas digitales.