Menu
Coddy logo textTech

Shift-Operatoren

Teil des Abschnitts Grundlagen der Verilog-Journey von Coddy — Lektion 26 von 90.

Schiebeoperatoren verschieben Bits innerhalb eines Vektors nach links oder rechts.

Verfügbare Schiebeoperatoren

OperatorOperationBeschreibung
<<Logische LinksverschiebungVerschiebt Bits nach links, füllt mit Nullen auf
>>Logische RechtsverschiebungVerschiebt Bits nach rechts, füllt mit Nullen auf
<<<Arithmetische LinksverschiebungGleich wie logische Linksverschiebung
>>>Arithmetische RechtsverschiebungVerschiebt nach rechts, behält das Vorzeichenbit bei

Wie sie funktionieren

Links-Shift (<strong><<</strong>):

8'b00001010 << 2 = 8'b00101000

Bits bewegen sich nach links. Nullen füllen die rechte Seite auf.

Rechtsschieben (<strong>>></strong>):

8'b00001010 >> 2 = 8'b00000010

Bits werden nach rechts verschoben. Nullen füllen die linke Seite auf.

Code-Beispiel

module shift_demo;
  reg [7:0] original, left_shift, right_shift;
  
  initial begin
    original = 8'b00001010;
    
    left_shift  = original << 2;   // 00001010 → 00101000
    right_shift = original >> 2;   // 00001010 → 00000010
    
    $display("original   = %b", original);
    $display("<< 2       = %b", left_shift);
    $display(">> 2       = %b", right_shift);
    $finish;
  end
endmodule

Ausgabe:

original   = 00001010
<< 2       = 00101000
>> 2       = 00000010

Arithmetische Rechtsverschiebung (>>>)

Für vorzeichenbehaftete Zahlen bewahrt die arithmetische Rechtsverschiebung das Vorzeichenbit:

reg signed [7:0] a;
a = -5;                // 11111011
a >>> 2 = 11111110     // Immer noch negativ

Logische Verschiebung (>>) würde mit Nullen auffüllen und das Vorzeichen verlieren.

Häufige Anwendungen

Multiplikation mit einer Zweierpotenz (Linksverschiebung):

x << 1    // Multiplikation mit 2
x << 2    // Multiplikation mit 4
x << 3    // Multiplikation mit 8

Division durch Zweierpotenz (Rechtsschub):

x >> 1    // Durch 2 dividieren
x >> 2    // Durch 4 dividieren
x >> 3    // Durch 8 dividieren

Ein Feld extrahieren:

// Bits 5-2 aus einem 8-Bit-Wert extrahieren
field = (data >> 2) & 4'b1111;
challenge icon

Aufgabe

Schreiben Sie die korrekten Schiebe-Ausdrücke für jede Aufgabe.

Was zu tun ist:

  1. Verschiebe a um 3 Bits nach links und speichere das Ergebnis in left_result
  2. Verschiebe a um 1 Bit nach rechts und speichere das Ergebnis in right_result
  3. Verschiebe b arithmetisch um 2 Bits nach rechts und speichere das Ergebnis in arith_result

Spickzettel

Shift-Operatoren verschieben Bits innerhalb eines Vektors nach links oder rechts:

OperatorBeschreibung
<<Logische Linksverschiebung (füllt mit Nullen auf)
>>Logische Rechtsverschiebung (füllt mit Nullen auf)
<<<Arithmetische Linksverschiebung (identisch mit logischer)
>>>Arithmetische Rechtsverschiebung (behält Vorzeichenbit bei)
8'b00001010 << 2  // = 8'b00101000
8'b00001010 >> 2  // = 8'b00000010

reg signed [7:0] a;
a = -5;           // 11111011
a >>> 2           // = 11111110 (Vorzeichen beibehalten)

Häufige Anwendungen:

x << n    // Multiplikation mit 2^n
x >> n    // Division durch 2^n

// Extrahiere Bits 5-2 aus einem 8-Bit-Wert
field = (data >> 2) & 4'b1111;

Probier es selbst

module shift_challenge;
  reg [7:0] a;
  reg signed [7:0] b;
  reg [7:0] left_result, right_result;
  reg signed [7:0] arith_result;
  
  initial begin
    a = 8'b00010001;
    b = -8'sd16;       // 11110000 in binär
    
    left_result  = ______;   // Verschiebe a um 3 Bits nach links
    right_result = ______;   // Verschiebe a um 1 Bit nach rechts
    arith_result = ______;   // Verschiebe b um 2 Bits nach rechts (arithmetisch)
    
    $display("a = %b", a);
    $display("a << 3 = %b", left_result);
    $display("a >> 1 = %b", right_result);
    $display("b = %b", b);
    $display("b >>> 2 = %b", arith_result);
    $finish;
  end
endmodule
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen