Cómo multiplicar números de complemento a dos de punto fijo

Lo que supongo de la figura es que están utilizando el algoritmo de multiplicación de cabinas para encontrar el valor.
Debe repetir el proceso hasta el número de bits utilizados para representar cada número. Aquí es 6, por lo tanto, encontrará 6 áreas resaltadas. Básicamente son el final de cada ciclo.

ejemplo de 3 * 7 (ver figura a continuación)
A se inicializa como cero
Q es tu multiplicante 3
M es tu multiplicador 7

Q-1 es su último dígito, comienza como cero

ignore la columna M por el momento.

verifique los dos últimos dígitos binarios, es decir, el último bit de Q y Q-1

ahora siga el diagrama de flujo a continuación, ya que es 10, debe restar 7 de A. la resta es básicamente la suma del cumplido de dos. El complemento de dos de 7 es 1001 y luego tienes que hacer un cambio aritmético a la derecha. es decir, el MSB de A se copiará en la primera posición aquí 1001 se convirtió en 1100 porque el primer bit fue uno. En el ciclo posterior, verá que 0101 se convirtió en 0010 porque MSB era cero.
Básicamente, repetir hasta el número de ciclos = número de bits utilizados para representar el número

1 ciclo se supera solo después de que se realiza una operación de turno.

y tu respuesta final será AQ
es decir, en este caso 00010101 = 21 ignorar Q-1 y M

PD: creo que su diagrama ha usado S y V. Entonces, tal vez el algoritmo sea diferente. Pero generalmente el algoritmo de las cabinas se usa para multiplicar números en la forma de complemento de 2

Espero que mi respuesta aclare tus dudas. En caso de dudas, pregunte 🙂

Editar:

Había un error tipográfico que había mencionado el cumplido de 2 de 3 como 1001, mientras que me refería al complemento de 2 de 7 como 1001

El algoritmo parece no ser visible claramente
dice para 00 y 11: ninguna operación

para 01: Agregar, es decir, A = A + M

para 10: restar, es decir, A = AM

1) el formato de dos números complementarios: para obtener un número negativo (-28 = 1 | 00100), tome su valor como positivo (28 = 0 | 11100), invierta todos los bits (1 | 00011) y agregue 1 (1 | 00100). se supone que todos los bits a la izquierda son idénticos al bit de signo, por lo que siempre que necesitemos uno, copiamos el bit de signo original (vea el 1 rojo en la columna izquierda) Esto nos da una propiedad interesante: puede sumar valores positivos y negativos y obtener el resultado correcto (por ejemplo, 28 – 28 = 28 + (- 28) = 0 | 11100 + 1 | 00100 = 0 | 00000; el bit de signo obtiene una transferencia de bit de valor superior).

2) la multiplicación en base2 (en realidad, en cualquier base) se adhiere a la regla de distribución – (-28 * 0 | 10101 = (- 28) * 0 | 10000 + (-28) * 0 | 00100 + (-28) * 0 | 00001). (vea los dígitos rojos en la columna derecha; cuando es 1 – 1 | 00100 se agrega al resultado parcial. con el cambio de resultado da las adiciones esperadas)

3) La multiplicación por un valor de un bit se realiza de la misma manera que multiplicamos los decimales por 10, 100 y otras potencias de 10: agregamos 0 a la derecha. (vea la posición de 1 | 00100 agregado con respecto a la banda amarilla; los valores a la derecha no cambian a medida que se agregan a 0)

4) ambos valores tienen una longitud de 5 bits, el resultado final debería ser 5 + 5 = 10 bits

5) el bit de signo del resultado final debe calcularse independientemente utilizando la operación OR (1 OR 0 = 1)

Con eso en mente, podemos reescribir el proceso de multiplicación:

aplicar regla de distribución:
1 | 00100 * 0 | 10101 = 1 | 00100 * 0 | 10000 + 1 | 00100 * 0 | 00100 + 1 | 00100 * 0 | 00001

Calcular partes y extender a 10 bits:
1 | 00100 * 0 | 00001 = 1 | 1111100100
1 | 00100 * 0 | 00100 = 1 | 1110010000
1 | 00100 * 0 | 10000 = 1 | 1001000000

agregar partes:
****
1 | 1111100100
+ 1 | 1110010000
+ 1 | 1001000000
—————
1 | 0110110100

verificar el valor: invertir y agregar 1
0 | 1001001011 + 1 = 0 | 1001001100 = 588

Esto significa que obtuvimos (-588) como resultado de multiplicar (-28) por 21

Espero que ayude.

Nota: la imagen no es lo suficientemente clara por qué se invierte y agrega 1 al final, y claramente (1 | 01001001100) no es -588 sino más bien -1460 (1460 = 0 | 10110110100).

Hay dos formas estándar de hacer esto. Estas formas son hacer programación en lenguaje ensamblador utilizando operadores booleanos, o puede hacerlo utilizando un diseño de nivel de puerta basado en hardware. Para hacerlo utilizando el lenguaje ensamblador, debe consultar un libro de programación en lenguaje ensamblador para el tipo de procesador para el que tiene la intención de programar (es decir, ARM e INTEL). Sin embargo, si decide adoptar el enfoque de diseño de nivel de puerta basado en hardware, entonces dos libros de inicio muy buenos son el Libro de cocina TTL y el Libro de cocina CMOS (ambos publicados por SAM’s Publishing Company). También debe decidir qué tipo de tecnología desea utilizar (es decir, TTL, CMOS y ECL). Además, debe saber que todos los paquetes de compuerta vienen como paquetes de IC basados ​​en cuatro compuertas. En el caso de las compañías estadounidenses de IC que venden dichos productos de nivel de puerta (por ejemplo, Fairchild Semiconductor), típicamente venden paquetes de IC de cuatro puertas basados ​​en puerta lógica negada únicamente. Esto significa que tendrá que hacer todo el diseño lógico basado en hardware utilizando lógica negada exclusivamente. Además, debe tener en cuenta que las tecnologías basadas en la sensibilidad al ruido electrónico más altas son ECL y TTL (exactamente en este orden). Esto significa que los diseños de estos productos deben hacer uso de ambas técnicas de protección de anillo y deben usar placas de circuito impreso de varias capas en sus implementaciones. Como regla general, la mejor tecnología para el aficionado es, con mucho, CMOS; desde entonces, esta tecnología es menos sensible al ruido electrónico y también porque es de baja potencia. Sin embargo, siempre debe tomar precauciones para evitar la descarga electrostática; desde entonces, tales descargas electrostáticas tenderán a dañar los diseños de compuerta como regla general. Robotronics LLC | Facebook