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
| Operatore | Operazione | Descrizione |
|---|---|---|
<< | Shift logico a sinistra | Sposta i bit a sinistra, riempiendo con zeri |
>> | Shift logico a destra | Sposta i bit a destra, riempiendo con zeri |
<<< | Shift aritmetico a sinistra | Uguale allo shift logico a sinistra |
>>> | Shift aritmetico a destra | Sposta a destra, preservando il bit di segno |
Come funzionano
Spostamento a sinistra (<strong><<</strong>):
8'b00001010 << 2 = 8'b00101000I bit si spostano a sinistra. Gli zeri riempiono il lato destro.
Spostamento a destra (<strong>>></strong>):
8'b00001010 >> 2 = 8'b00000010I 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
endmoduleOutput:
original = 00001010
<< 2 = 00101000
>> 2 = 00000010Spostamento 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 negativeLo 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 8Dividi per una potenza di 2 (shift a destra):
x >> 1 // Divide by 2
x >> 2 // Divide by 4
x >> 3 // Divide by 8Estrai un campo:
// Get bits 5-2 from an 8-bit value
field = (data >> 2) & 4'b1111;Sfida
Scrivi le espressioni di shift corrette per ogni attività.
Cosa fare:
- Sposta
aa sinistra di 3 bit e memorizza il risultato inleft_result - Sposta
aa destra di 1 bit e memorizza il risultato inright_result - Sposta
ba destra di 2 bit (aritmetico) e memorizza il risultato inarith_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
endmoduleQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1Introduzione
Cos'è VerilogHardware e software a confrontoIl tuo primo moduloCommentiLivelli di astrazione della progettazione4Operatori - Parte 1
Operatori aritmeticiOperatore moduloOperatori di confrontoRiepilogo - Matematica sempliceOperatori bitwise7Assegnazioni e porte
Assegnazione continuaAssegnazioni con operatoriPrimitive di porte integratePorte AND, OR e NOTPorte XOR e XNORRiepilogo: circuito con porte logiche10Decisioni
Istruzione ifIf-ElseRiepilogo - Comparatore sempliceIstruzione caseCasex e casezRiepilogo - Progettazione di una ALU5Operatori Parte 2
Operatori logiciOperatori di riduzioneOperatori di scorrimentoOperatore di concatenazioneOperatore condizionaleRiepilogo - Sfida sugli operatori3Sistema numerico
Rappresentazione binariaNumeri con dimensione specificataNumeri senza dimensione specificataNumeri negativiValori speciali X e ZRiepilogo - Formati numerici6Moduli
Struttura di un moduloPorte di input e outputPorte InoutIstanziazione di un moduloMappatura delle porte per nomeMappatura delle porte per ordineRiepilogo - Costruire un modulo9Blocchi procedurali
Blocco alwaysBlocco initialLista di sensibilitàAssegnazione bloccanteAssegnazione non bloccanteRiepilogo: always vs initial12Progetto Multiplexer
Progettazione di un mux da 2 a 1Progettazione di un mux da 4 a 1Esercitati da solo: Compilatore Verilog online