Wie funktionieren Bitshifts auf der elektrischen Schicht?

Ich bin Softwareentwickler und verstehe, wie arithmetische und logische Bitverschiebungen im Prinzip funktionieren.

Aber wie funktionieren sie auf der elektrischen Ebene?

Ich habe vielleicht eine völlig falsche Vorstellung;

Nehmen wir an, wir haben den Binärwert 0000 1011 und verschieben ihn um 2 nach links.
Das Ergebnis ist 0010 1100, nichts Besonderes.

Aber wie „springen“ die Bits zu ihren zweiten Nachbarn?

Bearbeiten: Einen Ausrutscher behoben, bei dem ich "Rechtsverschiebung" geschrieben habe, während ich eine Linksverschiebung gemacht habe.

Bearbeiten: ALU- und DIGITAL-LOGIC-Tags hinzugefügt

Sie haben sich um zwei Bits nach links verschoben. Eine Verschiebung nach rechts würde zu 0000 0010 führen. Vielleicht möchten Sie Ihre Frage klären: Sprechen Sie über Mikrocontroller oder festverdrahtete Logik? Der "Sprung zu ihren zweiten Nachbarn" ist einfach. Sie wiederholen eine einzelne Bitverschiebung so oft wie Sie möchten.
Oh, was für ein Flüchtigkeitsfehler, mein Fehler. Natürlich schalte ich nach links. Das Wiederholen eines bestimmten Vorgangs ist klar, das zweimalige Schalten um zwei ist einfach. Aber trotzdem, wie passiert die Verschiebung selbst? Ich habe mehrmals gelesen, dass das Schalten ein extrem schneller Vorgang ist, und aufgrund meiner mangelnden Ingenieurkenntnisse weiß ich nicht, warum das so ist.
In diesem Fall sollten Sie lernen, wie ein Flip-Flop funktioniert . Ein Schieberegister ist genau das - mehrere Flip-Flops in Reihe.
Ein Schieberegister für N Bits hat N+1 (manchmal N+2) Flip/Flops, z

Antworten (5)

In Computern werden arithmetische Operationen von einer speziellen integrierten Schaltung ausgeführt, die sich im Mikroprozessor befindet und als "Arithmetic Logic Unit" bezeichnet wird. Sie können sich den Wikipedia-Artikel über ALU ansehen ( https://en.wikipedia.org/wiki/Arithmetic_logic_unit ). Als Beispiel wird die 74181 ALU erwähnt, die eine sehr einfache Arithmetik-Logik-Einheit ist, die mehrere Arten von Operationen, einschließlich der Linksverschiebung, über 4 Bits ausführen kann.

Ich habe das Logikschema der 74181 ALU angehängt (siehe unten). Die Eingänge sind A und B und das Ergebnis ist F. Jede Zahl ist 4 Bit lang, also gibt es A3A2A1A0, B3B2B1B0 und F3F2F1F0. Mit S3S2S1S0 wird die gewünschte Operation ausgewählt:

  • F = A (op) B
  • 'op' ist die gewünschte Operation.
  • Wenn S = S3S2S1S0 = 1100, dann ist 'op' eine Verschiebung nach links.

So funktioniert das Linksschalten im speziellen Fall des 74181:

  • Betrachten Sie die obere linke Gruppe von fünf UND-Gattern und 2 NOR-Gattern.
  • Das erste UND-Gatter ist nicht genau UND, da es nur einen Eintrag hat: /A0. Daher ist seine Ausgabe /A0.
  • Zweites und drittes UND-Gatter haben einen 0-Ausgang, weil S1S0 = 00
  • Das vierte UND-Gatter hat den Ausgang /A0*B0, weil S2 = 1
  • Das fünfte UND-Gatter hat den Ausgang /A0*/B0, weil S3 = 1
  • Das erste NOR-Gatter hat den Ausgang A0.
  • Das zweite NOR-Gatter hat den Ausgang A0, weil /A0*B0 + /A0*/B0 = /A0.

Abschließend, wenn Sie S3S2S1S0 = 1100 haben, macht die ALU F = A + A, was dasselbe ist wie eine Verschiebung nach links.

Vereinfachtes Schema der 74181 ALU

Ein Ansatz ist ein Parallel-in-Parallel-Out -Schieberegister . Die Daten werden in das Schieberegister geladen und dann um die gewünschte Anzahl von Stellen nach links oder rechts verschoben. Die Kehrseite davon ist, dass es nur um ein Bit pro Taktzyklus verschoben werden kann.

Eine Alternative ist ein Barrel-Shifter , der auf einmal um beliebig viele Stellen schalten kann.

Es lohnt sich zu erkennen, dass das Verschieben nichts anderes sein muss, als wie Sie die Eingangsleitungen mit den Ausgangsleitungen auf einem Datenbus verbinden. Direkt verdrahtet ist keine Verschiebung. Verbinden Sie jede Eingangsleitung mit der Ausgangsleitung, die eine Stelle nach links ist, was eine Linksverschiebung um 1 bedeutet, und so weiter.

Schlagen Sie etwas nach, das Schieberegister genannt wird . Eine Möglichkeit, darüber nachzudenken, ist eine Kette von Flip-Flops. Nehmen wir an, diese Flip-Flops machen eine Momentaufnahme des Werts, der an ihrem Eingang beim Übergang von niedrig nach hoch der Uhr anliegt, und übertragen diese Momentaufnahme dann beim nächsten Übergang von hoch zu niedrig der Uhr zu ihrem Ausgang. Sie verbinden den Ausgang eines Flip-Flops mit dem Eingang des nächsten usw. und verbinden sie dann alle mit demselben Taktsignal.

Einsen und Nullen werden innerhalb der integrierten CPU-Schaltung als Spannungspegel dargestellt. Beispielsweise ist 0 Volt eine logische Null und 5 Volt eine logische Eins. Logische Werte werden typischerweise in Schaltkreisen gehalten, die "Flip-Flops" genannt werden. Ein typischer CPU-Chip hat Millionen von Flip-Flops.

Und ein typischer CPU-Chip hat auch Millionen von elektrisch betriebenen Schaltern. Um also eine Schiebefunktion auszuführen, schaltet die CPU die entsprechenden Schalter ein, um die logischen Pegel an das NEXT-Flipflop (oder die "Bitposition") im Register zu senden.

Grundsätzlich werden alle mathematischen und logischen Funktionen implementiert, indem Bitregister einfach auf bestimmte Weise verbunden werden, je nachdem, was Sie tun möchten. Dafür ist der CPU-Chip ausgelegt.

Wie passiert das, wenn Sie die Reifen Ihres Autos drehen? Nun, Sie nehmen mindestens zwei ab und tauschen sie aus, ja?

Bit-Speicher, seien es einzelne Flip-Flops oder Unmengen davon, die in einem RAM gepackt sind. Jedes Speicherbit ist lesbar und beschreibbar. ansonsten was ist der sinn? Eine Bitverschiebung ist nichts anderes als eine Operation, die die Reifen abnimmt, die Bits aus einem Register oder einer Speicherstelle liest und sie dann an einer anderen Stelle zurückschreibt, genau wie das Verschieben eines Reifens von hinten nach vorne, lesen Sie es aus, und schreiben Sie es dann an einer anderen Stelle zurück.

Es gibt keine Magie in der Logik, es ist alles sehr, sehr einfach im Konzept. null, eins und oder nicht ist alles, was zum Verständnis erforderlich ist. Es ist nur manchmal eine riesige Menge von und, oder und nicht parallel und/oder in Reihe.

Einige Prozessoren verschieben ein Bit nach dem anderen und in Pseudo-HDL ist es nicht wirklich anders als in Software

alu_out[16] = (operand_a[14:0],0)

Die 16-Bit-Ausgabe besteht aus den unteren 15 Bits der Eingabe, die auf die oberen 15 Bits der Ausgabe neu positioniert sind, wobei eine Null an der 0-Position angehängt ist.

Und diese Codezeile kann sich in einer switch-ähnlichen Anweisung oder einem Baum von if then else-Anweisungen befinden, die im Grunde besagt, dass if alu_operation = left_shift then do this.

Und all das wird in Logikgatter kompiliert, die ifs und die Zuweisungen werden zu und, oder, nicht-Gattern oder von und, oder, nicht abgeleiteten Gattern. auf einem riesigen Rattennest.

Einige Prozessoren haben einen Shifter mit variabler Größe, der in einer Operation drehen oder verschieben kann, wie viel Sie wollen (offensichtlich bis zur gesamten Wortgröße, sonst, was ist der Sinn), der viel mehr Gatter benötigt, nur diese eine Operation für jedes Bit des Die Ausgabe für ein 16-Bit-Register hat nur für diese eine Operation einen 15-, 16- oder 17-zu-eins-Mux.