Menu
Coddy logo textTech

Operatori di scorrimento

Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 26 di 90.

Gli operatori di shift spostano i bit a sinistra o a destra all'interno di un vettore.

Operatori di shift disponibili

OperatoreOperazioneDescrizione
<<Shift logico a sinistraSposta i bit a sinistra, riempiendo con zeri
>>Shift logico a destraSposta i bit a destra, riempiendo con zeri
<<<Shift aritmetico a sinistraUguale allo shift logico a sinistra
>>>Shift aritmetico a destraSposta a destra, preservando il bit di segno

Come funzionano

Spostamento a sinistra (<strong><<</strong>):

8'b00001010 << 2 = 8'b00101000

I bit si spostano a sinistra. Gli zeri riempiono il lato destro.

Spostamento a destra (<strong>>></strong>):

8'b00001010 >> 2 = 8'b00000010

I bit si spostano a destra. Gli zeri riempiono il lato sinistro.

Esempio di codice

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

Output:

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

Spostamento aritmetico a destra (>>>)

Per i numeri con segno, lo spostamento aritmetico a destra preserva il bit di segno:

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

Lo shift logico (>>) riempirebbe con degli zeri e perderebbe il segno.

Usi comuni

Moltiplicare per una potenza di 2 (shift a sinistra):

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

Dividi per una potenza di 2 (shift a destra):

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

Estrai un campo:

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

Sfida

Scrivi le espressioni di shift corrette per ogni attività.

Cosa fare:

  1. Sposta a a sinistra di 3 bit e memorizza il risultato in left_result
  2. Sposta a a destra di 1 bit e memorizza il risultato in right_result
  3. Sposta b a destra di 2 bit (aritmetico) e memorizza il risultato in arith_result

Provalo tu

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 en binario
    
    left_result  = ______;   // Desplaza a 3 bits a la izquierda
    right_result = ______;   // Desplaza a 1 bit a la derecha
    arith_result = ______;   // Desplaza b 2 bits a la derecha (aritméticamente)
    
    $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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online