Wie ist die vorzeichenlose Ganzzahl max in der Hardware implementiert?

10

Ich arbeite an einem Design, das viele Max-Funktionen beinhaltet (und Max-Funktionen als Argumente für andere Max-Funktionen).

Um das Hardware-Design zu vereinfachen, habe ich mich gefragt, wie max in Hardware implementiert ist.

Mathematisch kann Max (a, b) als [(a + b) + abs (b - a)] / 2 dargestellt werden.

Ist es so in Hardware implementiert? (dh in Stufen; Addition, Bitverschiebungsteilung usw.)

Wenn ja, wie wird das Absolut der Differenz berechnet?

James
quelle

Antworten:

10

Ein sehr einfacher Ansatz wäre die Implementierung von (a> b)? A: b. a> b kann implementiert werden, indem Sie links beginnen und jedes Bitpaar von (a, b) überprüfen:

  • beide 0 oder beide 1: Weiter zum nächstniedrigeren Paar
  • a ist 1: a ist am höchsten; b ist 1: b ist am höchsten

Wenn Sie wissen, welches das höchste ist, können Sie dieses mit einem 2N-> N-Mux auswählen.

Mit ein paar cleveren Tricks kann die Überprüfung der Bitpaare mit dem Muxer für dasselbe Bitpaar kombiniert werden.

Wouter van Ooijen
quelle
2

Schauen wir uns den Algorithmus in der Frage an:

[(a + b) + abs(b - a)]/2

Dies hat eine Additions- und Subtraktionsstufe, die dann einer Addition der zweiten Stufe zugeführt werden. Die Division durch 2 ist in der Hardware trivial. Sie kann durch Entfernen des LSB erfolgen. Der zweistufige Volladdierer / Subtrahierer ist jedoch ziemlich langsam und Gate-intensiv, insbesondere wenn Sie mehrere Caparisons wie Sie kaskadieren.

Aufbauend auf der Antwort von Wouter van Ooijen ist die verallgemeinerte Struktur ein digitaler Komparator, der das Auswahlsignal eines Mux speist:

schematisch

simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab

Das obige Schema gilt für:

(A > B) ? A : B

Beachten Sie jedoch, dass es für jeden Vergleich zwischen den beiden Eingängen leicht neu konfiguriert werden kann, indem unterschiedliche logische Verbindungen zwischen den Komparatorausgängen und der Mux-Auswahl hergestellt werden.

Wenn wir also wissen, wie die drei Ausgänge des Komparators zu formulieren sind, können wir jeden Vergleich in Hardware implementieren. Komparatorlogikabschnitt ist gut beschrieben hier . Um die Hardware zu optimieren, entfernen wir einfach die Logik, die die nicht verwendeten Komparatorausgänge ansteuert.

Aber am Ende, wenn es um Hardware geht, muss es die Synthese durchlaufen. Sie sollten also nicht darüber nachdenken, welches Schema auf Gate-Ebene optimal ist. Optimieren Sie stattdessen Ihren Code und Ihre Algorithmen so, dass Sie den Synthesizer zumindest nicht dazu zwingen, ein ineffizientes Ergebnis zu erzielen. "Mit einigen cleveren Tricks kann die Überprüfung der Bitpaare mit dem Muxer für dasselbe Bitpaar kombiniert werden", und der einfachste Weg, diese Optimierung durchzuführen, ist die Synthese.

Travisbartley
quelle
1

Wenn Sie wirklich eine spezielle Schaltung erstellen möchten, um das Maximum zu berechnen, können Sie mit einem Grundblock mit den folgenden Gleichungen beginnen:

Ei,outEi,in¬(aibi)Li,out(¬Ei,inLi,in)(Ei,inai¬bi)ri(¬Ei,in((Li,inai)(¬Li,inbi)))(Ei,in(aibi))

und verbinden Sie sie dann mit der höchstwertigen Ziffer, die die nächste füttert. Der kritische Teil geht vom MSB zum LSB, während die auf Subtraktion basierende Schaltung bestenfalls einen kritischen Pfad hat, der vom LSB zum MSB und dann zurück zum LSB führt.

Es ist das Äquivalent eines Carry-Ripple-Addierers. Wenn Sie interessiert sind, können Sie das Äquivalent zu Carry-Save- oder Carry-Select-Addierern erstellen.

( bedeutet bis hier gleich, und hat nur dann eine Bedeutung, wenn und bedeutet, wählen Sie )L ¬ E aEL¬Ea

Ein Programmierer
quelle