Wir können mehrere Logikschichten pro Taktzyklus haben, aber es gibt eine Grenze, wie viele Logikschichten wir haben können und wie komplex diese Schichten sein können, hängt von unserer Taktgeschwindigkeit und unserem Halbleiterprozess ab.
Es gibt jedoch viele verschiedene Multiplikationsalgorithmen, und ich habe keine Ahnung, welche von Mikrocontrollern verwendet werden können
Die meisten Multiplikationen in Computern verwenden eine Variante der binären Langmultiplikation. Binäre lange Multiplikation beinhaltet
- Verschiebung eines Operanden um verschiedene Beträge
- Maskieren der verschobenen Zahlen basierend auf dem zweiten Operanden
- Addieren der Ergebnisse der Maskierung.
Schauen wir uns also die Implementierung in Hardware an.
- Das Schalten ist nur eine Frage der Verkabelung, es ist also kostenlos.
- Das Maskieren erfordert UND-Gatter. Das bedeutet eine Logikebene, aus zeitlicher Sicht ist es also billig.
- Das Hinzufügen ist relativ teuer, da eine Transportkette erforderlich ist. Zum Glück gibt es einen Trick, den wir anwenden können. Für die meisten Additionsstufen können wir, anstatt zwei Zahlen zu addieren, drei Zahlen addieren, um zwei zu erzeugen.
Lassen Sie uns also festlegen, wie viele Logikstufen wir für einen 8x8-Multiplikator mit 16-Bit-Ergebnissen benötigen. Der Einfachheit halber nehmen wir an, dass wir nicht versuchen, zu optimieren, dass nicht alle Zwischenergebnisse Bits an allen Positionen aufweisen.
Nehmen wir an, dass ein Volladdierer in zwei "Gate-Stufen" implementiert ist.
- 1 für die Maskierung, um 8 Zwischenergebnisse zu erzielen.
- 2 zum Hinzufügen von Dreiergruppen, um die 8 Zwischenergebnisse auf 6 zu reduzieren
- 2 zum Hinzufügen von Dreiergruppen, um die 6 Zwischenergebnisse auf 4 zu reduzieren
- 2, um eine Gruppe von drei Zahlen hinzuzufügen und die 4 Zwischenergebnisse auf 3 zu reduzieren
- 2, um eine Gruppe von drei Zahlen hinzuzufügen und die 3 Zwischenergebnisse auf 2 zu reduzieren
- 32, um die letzten beiden Ergebnisse zu addieren.
Insgesamt also etwa 46 Logikstufen. Die meisten davon werden ausgegeben, um die letzten beiden Zwischenergebnisse zu addieren.
Dies könnte weiter verbessert werden, indem die Tatsache ausgenutzt wird, dass nicht alle Zwischenergebnisse alle vorhandenen Bits aufweisen (das ist im Grunde das, was der Dada-Multiplikator tut), indem ein Carry-Lookahead-Addierer für den letzten Schritt verwendet wird. Durch Addition von 7 zu 3 anstelle von 3 zu 2 (Reduzierung der Anzahl der Stufen zum Preis von mehr Toren und breiteren Toren) usw.
Das sind alles Kleinigkeiten, der wichtige Punkt ist jedoch, dass die Anzahl der Stufen, die benötigt werden, um zwei n-Bit-Zahlen zu multiplizieren und ein 2n-Bit-Ergebnis zu erzeugen, in etwa proportional zu n ist.
Wenn wir uns andererseits Divisionsalgorithmen ansehen, stellen wir fest, dass sie alle einen iterativen Prozess haben, bei dem.
- Was bei einer Iteration gemacht wird, hängt stark von den Ergebnissen der vorherigen Iteration ab.
- Die Anzahl der zur Implementierung einer Iteration erforderlichen Logikstufen ist in etwa proportional zu n (Subtraktion und Vergleich sind in ihrer Komplexität der Addition sehr ähnlich).
- Die Anzahl der Iterationen ist auch ungefähr proportional zu n.
Die Anzahl der zur Implementierung der Division erforderlichen Logikstufen ist also in etwa proportional zu n im Quadrat.