Ich suchte nach einer Möglichkeit, die Quadratwurzel einer bestimmten 8-Bit-Zahl nur mit digitaler Kombination oder sequentieller Logik zu berechnen. Ist das möglich?
Eine Möglichkeit könnte darin bestehen, einfach eine Nachschlagetabelle zu verwenden, da ich keine gebrochenen Teile in Betracht ziehe (also ) aber es muss einen besseren Weg geben. Kann mich jemand darauf hinweisen?
digital-logic
Rick_2047
quelle
quelle
Antworten:
Nachschlagetabellen wurden in Kommentaren erwähnt. Es gibt zwei Ansätze.
Schnell
Erstellen Sie eine 256 Byte lange Tabelle, wobei jeder nächste Wert die Quadratwurzel des entsprechenden Index ist. Dies ist schnell, da Sie das Argument als Index verwenden, um direkt auf den richtigen Wert zuzugreifen. Nachteil ist, dass es eine lange Tabelle mit vielen doppelten Werten benötigt.
Kompakt
Wie bereits erwähnt, kann eine 8-Bit-Ganzzahl nur Werte von 0 bis 255 haben, und die entsprechenden Quadratwurzeln sind 0 bis 16 (gerundet). Konstruieren Sie eine Tabelle mit 16 Einträgen (nullbasiert) mit dem n-ten Eintrag, dem Maximalwert für das Argument, für das die Quadratwurzel n ist. Tabelle würde so aussehen:
Sie gehen durch die Tabelle und hören auf, wenn Sie auf einen Wert stoßen, der größer oder gleich Ihrem Argument ist. Beispiel: Quadratwurzel von 18
Während die schnelle Nachschlagetabelle eine feste Ausführungszeit hat (nur eine Nachschlagetabelle), ist hier die Ausführungszeit für Argumente mit höherem Wert länger.
Bei beiden Methoden können Sie zwischen einem gerundeten oder einem abgeschnittenen Wert für die Quadratwurzel wählen, indem Sie unterschiedliche Werte für die Tabelle auswählen.
quelle
Wenn Sie mit 8 Bit arbeiten, sind Sie grundsätzlich auf ganzzahlige Lösungen beschränkt. Wenn Sie die Quadratwurzel von X benötigen, können Sie als Nächstes die größte Ganzzahl ermitteln, deren Quadrat kleiner oder gleich X ist. Für sqrt (50) würden Sie beispielsweise 7 erhalten, da 8 * 8 mehr wäre als 50.
Hier ist ein Trick, um dies zu tun: Zählen Sie, wie viele ungerade Zahlen, beginnend mit 1, Sie von X subtrahieren können. Sie könnten es mit folgender Logik tun: Ein 8-Bit-Register R1 enthält den Arbeitswert, ein 7-Bit-Zähler R2 hält (den größten Teil) der ungeraden Zahl und ein 4-Bit-Zähler R3 hält das Ergebnis. Beim Zurücksetzen wird R1 mit dem Wert von X geladen, R2 wird auf Null gelöscht und R3 wird auf Null gelöscht. Einer 8-Bit-Subtrahierschaltung wird R1 für den Eingang "A" zugeführt, und der Wert von R2 wird mit einem auf "1" festgelegten LSB (über Pull-up) für den Eingang "B" kombiniert. Der Subtrahierer gibt eine 8-Bit-Differenz AB und ein Ausleihbit aus. Wenn das Entlehnungsbit bei jedem Takt gelöscht ist, wird R1 mit dem Subtrahiererausgang geladen, R2 wird inkrementiert und R3 wird inkrementiert. Wenn das Entleihbit gesetzt ist, R1 nicht geladen ist und R2, R3 nicht inkrementiert sind, ist das Ergebnis b / c nun in R3 bereit.
ALTERNATIVE
Es gibt nur 16 mögliche Ausgabewerte, die Antwort ist also eine 4-Bit-Zahl. Im Wesentlichen haben Sie vier Einzelbitfunktionen der 8 Eingangsbits. Jetzt kann ich keine 8-dimensionale Karnaugh-Karte zeichnen, aber im Prinzip könnte man einfach eine kombinatorische Schaltung für jedes Bit der Antwort finden. Nehmen Sie die Ausgänge dieser vier kombinatorischen Schaltungen zusammen und interpretieren Sie sie als die Vier-Bit-Antwort. Voila. Keine Uhren, keine Register, nur ein Haufen NAND und NOR würden ausreichen.
quelle
case
Aussage einfließen lassen und das Synthese-Tool die ganze Arbeit erledigen lassen. Einerseits ist es so, als würde man eine große Nachschlagetabelle im verteilten RAM (als ROM verwendet) erstellen. Auf der anderen Seite sollte das Tool Optimierungen finden, die Sie in Ihrem Kommentar erwähnen.Ich weiß nicht, ob dies eine Hilfe ist, aber es gibt einen genial einfachen Weg, eine Quadratwurzel zu berechnen:
Ich weiß nicht viel darüber, was in der sequentiellen Logik getan werden kann und was nicht, aber da dieser Algorithmus in nur 4 Schleifen endet, können Sie ihn möglicherweise in 4 Stufen implementieren.
quelle
Ich habe die Wahrheitstabellen für die ganze Quadratwurzel von 0-255 mit einem Quine-McCluskey-Logik-Minimierer durchlaufen lassen. Die ganzzahlige Quadratwurzel kann mit nur kombinatorischer Logik erstellt werden, aber auch für eine relativ kleine Eingangsgröße von28 Mögliche Werte, die Antwort ist nichts für schwache Nerven. Das Folgende ist von MSB A bis LSB D des Ausgangs in Bezug auf abcdefgh als Eingänge von MSB bis LSB angeordnet:
quelle