Menu
Coddy logo textTech

Operatory przesunięcia

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 26 z 90.

Operatory przesunięcia przesuwają bity w lewo lub w prawo w obrębie wektora.

Dostępne operatory przesunięcia

OperatorOperacjaOpis
<<Logiczne przesunięcie w lewoPrzesuwa bity w lewo, uzupełniając zerami
>>Logiczne przesunięcie w prawoPrzesuwa bity w prawo, uzupełniając zerami
<<<Arytmetyczne przesunięcie w lewoTak samo jak logiczne przesunięcie w lewo
>>>Arytmetyczne przesunięcie w prawoPrzesuwa w prawo, zachowując bit znaku

Jak działają

Przesunięcie w lewo (<strong><<</strong>):

8'b00001010 << 2 = 8'b00101000

Bity przesuwają się w lewo. Zera wypełniają prawą stronę.

Przesunięcie w prawo (<strong>>></strong>):

8'b00001010 >> 2 = 8'b00000010

Bity przesuwają się w prawo. Zera wypełniają lewą stronę.

Przykład kodu

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

Wynik:

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

Przesunięcie arytmetyczne w prawo (>>>)

W przypadku liczb ze znakiem arytmetyczne przesunięcie w prawo zachowuje bit znaku:

reg signed [7:0] a;
a = -5;                // 11111011
a >>> 2 = 11111110     // Still negative

Przesunięcie logiczne (>>) wypełniłoby bity zerami i utraciłoby bit znaku.

Typowe zastosowania

Mnożenie przez potęgę liczby 2 (przesunięcie w lewo):

x << 1    // Multiply by 2
x << 2    // Multiply by 4
x << 3    // Multiply by 8

Dzielenie przez potęgę 2 (przesunięcie w prawo):

x >> 1    // Divide by 2
x >> 2    // Divide by 4
x >> 3    // Divide by 8

Wyodrębnij pole:

// Get bits 5-2 from an 8-bit value
field = (data >> 2) & 4'b1111;
challenge icon

Wyzwanie

Zapisz poprawne wyrażenia przesunięcia dla każdego zadania.

Co zrobić:

  1. Przesuń a w lewo o 3 bity i zapisz wynik w left_result
  2. Przesuń a w prawo o 1 bit i zapisz wynik w right_result
  3. Przesuń b arytmetycznie w prawo o 2 bity i zapisz wynik w arith_result

Spróbuj swoich sił

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 w zapisie binarnym
    
    left_result  = ______;   // Przesuń a w lewo o 3 bity
    right_result = ______;   // Przesuń a w prawo o 1 bit
    arith_result = ______;   // Przesuń b arytmetycznie w prawo o 2 bity
    
    $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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online