Podemos tener múltiples capas de lógica por ciclo de reloj, pero hay un límite, la cantidad exacta de capas de lógica que podamos tener y la complejidad de esas capas dependerá de nuestra velocidad de reloj y nuestro proceso de semiconductores.
Sin embargo, hay muchos algoritmos de multiplicación diferentes, y no tengo ni idea de cuál puede ser usado por los microcontroladores
La mayoría de las multiplicaciones de Afaict en computadoras usa una variante de la multiplicación larga binaria. La multiplicación larga binaria implica
- Desplazando un operando por varias cantidades diferentes
- Enmascarar los números desplazados según el segundo operando
- Agregar los resultados del enmascaramiento juntos.
Así que echemos un vistazo a la implementación de esto en hardware.
- El cambio es solo una cuestión de cómo conectamos las cosas, por lo que es gratis.
- Enmascaramiento requiere AND puertas. Eso significa una capa de lógica, por lo que desde el punto de vista del tiempo es barato.
- La adición es relativamente costosa debido a la necesidad de una cadena portadora. Afortunadamente hay un truco que podemos usar. Para la mayoría de las etapas de adición, en lugar de agregar dos números para producir uno, podemos agregar tres números para producir dos.
Entonces, veamos cuántas etapas lógicas necesitamos para un multiplicador de 8x8 con resultados de 16 bits. Para simplificar, supongamos que no intentamos y optimizamos porque no todos los resultados intermedios tienen bits en todas las posiciones.
Supongamos que un sumador completo se implementa en dos "etapas de puerta".
- 1 para enmascarar para producir 8 resultados intermedios.
- 2 para agregar grupos de tres números para reducir los 8 resultados intermedios a 6
- 2 para agregar grupos de tres números para reducir los 6 resultados intermedios a 4
- 2 para agregar un grupo de tres números para reducir los 4 resultados intermedios a 3
- 2 para agregar un grupo de tres números para reducir los 3 resultados intermedios a 2
- 32 para sumar los dos resultados finales.
Así que alrededor de 46 etapas lógicas en total. La mayoría de los cuales se gastan sumando los dos últimos resultados intermedios.
Esto podría mejorarse aún más explotando el hecho de que no todos los resultados intermedios tienen todos los bits presentes (eso es básicamente lo que hace el multiplicador dado), mediante el uso de un sumador de acarreo anticipado para el paso final. Sumando 7 números para producir 3 en lugar de tres para producir dos (reduciendo el número de etapas al precio de más puertas y puertas más anchas) etc.
Aunque todos los detalles son menores, el punto importante es que el número de etapas necesarias para multiplicar dos números de n bits y producir un resultado de 2 n bits es aproximadamente proporcional a n.
Por otro lado, si nos fijamos en los algoritmos de división, encontramos que todos tienen un proceso iterativo donde.
- Lo que se hace en una iteración depende en gran medida de los resultados de la iteración anterior.
- el número de etapas lógicas requeridas para implementar una iteración es aproximadamente proporcional a n (la resta y la comparación son muy similares en complejidad a la suma)
- el número de iteraciones también es aproximadamente proporcional a n.
Entonces, el número de etapas lógicas requeridas para implementar la división es aproximadamente proporcional a n al cuadrado.