23.02.2026

La multiplicación

Existe muchos métodos para implementar la multiplicación,
todos basados en series de sumas. Todos los métodos
muestran el compromiso entre tiempo y espacio (del circuito).
Al final de las soluciones se presentan las que realizan
multitud de sumas en paralelo. Estas soluciones son rápidas
pero la cantidad de recursos en circuitos que requieren 
es alta.

La solución que se usa en el procesador RISC0 es una
solución intermedia. Se necesitan un solo sumador y realiza
las sumas en sequencia, con sumas parciales almacenadas
en un registro especial. La secuencia de adiciones es
disparada por una sola instrucción de multiplicación, lo
cual hace a esta solución aún más rápida que una solución
pura en software, la cual podría presentarse típicamente como
un procedimiento.

En la multiplicación p = x * y, a 'p' se le llama el producto,
a 'x' el multiplicador y a 'y' el multiplicando. Sean 'x' y 'y'
enteros sin signo. Considerar a 'x' en su forma binaria.

x = x_31 * 2^31 + x_30 * a2^30 + ... + x_1 * 2^1 + x_0 * 2^0

Se obtiene el producto como una secuencia de 32 adiciones, cada
término de la forma x_k * 2^k * y, esto es por
'y' corrimientos a la izquieda por k posiciones, multiplicado 
por x_k. Ya que x_k es 0 o 1, el término es también 0 o 'y'.
La multiplicaciónn es entonces realizada por un sumador y un selector.
En vez de usar x_k como un valor para el selector, a A (inicialmente igual 
a 'x') se le aplica un corrimiento a la derecha en cada paso 
de suma y corrimiento, de forma que A0 es siempre el selector.  
Este se representa como ODD(A). El algoritmo se muestra en las
siguiente líneas. B debe ser una variable del doble de largo.

B = 0
A = x
i = 0
while i <= 32 :
	if ODD(A) :
		B = B + y
		# A = A - 1
	B = 2*B
	A = A DIV 2
	i += 1

El invariante A*y + B = x*y
se mantiene durante las iteraciones, y al final A = 0, dando el
resultado deseado B = x*y.
La operación A = A - 1 puede omitirse ya que se realiza una división
subsecuente entre 2.


0101 = 5_d
0010 = 2_d

1101
+  1
----
1110 = -2_d

-2 * 5 = -10

1110 * 0101

-1*2^3 + 1*2^2 + 1*2^1 + 0*2^0
 
   01010  = 1*2^1 * 0101
+ 010100  = 1*2^2 * 0101
  ------
  011110
          = 1*2^3 * 0101 = 0101000
                           1010111
                           +     1
                           -------
                           1011000 el negativo de 011110

  011110
+1011000
--------
 1110110 = -10_d

 0001001
+      1
--------
    1010  = 10_d
