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
| Operator | Operacja | Opis |
|---|---|---|
<< | Logiczne przesunięcie w lewo | Przesuwa bity w lewo, uzupełniając zerami |
>> | Logiczne przesunięcie w prawo | Przesuwa bity w prawo, uzupełniając zerami |
<<< | Arytmetyczne przesunięcie w lewo | Tak samo jak logiczne przesunięcie w lewo |
>>> | Arytmetyczne przesunięcie w prawo | Przesuwa w prawo, zachowując bit znaku |
Jak działają
Przesunięcie w lewo (<strong><<</strong>):
8'b00001010 << 2 = 8'b00101000Bity przesuwają się w lewo. Zera wypełniają prawą stronę.
Przesunięcie w prawo (<strong>>></strong>):
8'b00001010 >> 2 = 8'b00000010Bity 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
endmoduleWynik:
original = 00001010
<< 2 = 00101000
>> 2 = 00000010Przesunię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 negativePrzesunię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 8Dzielenie przez potęgę 2 (przesunięcie w prawo):
x >> 1 // Divide by 2
x >> 2 // Divide by 4
x >> 3 // Divide by 8Wyodrębnij pole:
// Get bits 5-2 from an 8-bit value
field = (data >> 2) & 4'b1111;Wyzwanie
Zapisz poprawne wyrażenia przesunięcia dla każdego zadania.
Co zrobić:
- Przesuń
aw lewo o 3 bity i zapisz wynik wleft_result - Przesuń
aw prawo o 1 bit i zapisz wynik wright_result - Przesuń
barytmetycznie w prawo o 2 bity i zapisz wynik warith_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
endmoduleTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Wprowadzenie
Czym jest VerilogSprzęt a oprogramowanieTwój pierwszy modułKomentarzePoziomy abstrakcji projektu4Operatory, część 1
Operatory arytmetyczneOperator moduloOperatory porównaniaPowtórka — prosta matematykaOperatory bitowe7Przypisania i bramki
Przypisanie ciągłePrzypisanie z operatoramiWbudowane prymitywy bramekBramki AND, OR i NOTBramki XOR i XNORPodsumowanie — układ z bramek logicznych10Podejmowanie decyzji
Instrukcja ifIf-elsePowtórka – prosty komparatorInstrukcja caseCaseX i CaseZPowtórka – projektowanie ALU13Odmierzanie czasu i opóźnienia
Czym są opóźnieniaOpóźnienia bramekOpóźnienia przypisańDyrektywa timescaleGenerowanie zegaraPodsumowanie — kontrola czasu2Typy danych
Typ WireTyp RegLiczby całkowite i rzeczywisteWektoryTabliceParametryPowtórka — deklarowanie sygnałów5Operatory — część 2
Operatory logiczneOperatory redukcjiOperatory przesunięciaOperator konkatenacjiOperator warunkowyPowtórzenie — wyzwanie z operatorami11Pętle
Pętla forPętla whilePętla repeatPętla nieskończonaInstrukcja wyłączaniaPowtórka — wzorce pętli3System liczbowy
Reprezentacja binarnaLiczby o określonej szerokościLiczby o nieokreślonej szerokościLiczby ujemneWartości specjalne X i ZPodsumowanie — formaty liczb6Moduły
Struktura modułuPorty wejściowe i wyjściowePorty dwukierunkoweInstancjonowanie modułuMapowanie portów według nazwMapowanie portów według kolejnościPodsumowanie — zbuduj moduł9Bloki proceduralne
Blok alwaysBlok initialLista czułościPrzypisanie blokującePrzypisanie nieblokującePodsumowanie — always a initial12Projekt multipleksera
Projekt multipleksera 2 do 1Projekt multipleksera 4 do 115Sterownik sygnalizacji świetlnej
Definiowanie stanówLogika maszyny stanówPoćwicz samodzielnie: Kompilator Verilog online