Menu
CoddyTech

Opérateurs de décalage

Fait partie de la section Fondamentaux du Journey Verilog de Coddy. Leçon 26 sur 90.

Les opérateurs de décalage déplacent les bits vers la gauche ou la droite dans un vecteur.

Opérateurs de décalage disponibles

OpérateurOpérationDescription
<<Décalage logique vers la gaucheDécale les bits vers la gauche et complète avec des zéros
>>Décalage logique vers la droiteDécale les bits vers la droite et complète avec des zéros
<<<Décalage arithmétique vers la gaucheIdentique au décalage logique vers la gauche
>>>Décalage arithmétique vers la droiteDécale vers la droite et préserve le bit de signe

Comment ils fonctionnent

Décalage à gauche (<<) :

8'b00001010 << 2 = 8'b00101000

Les bits se déplacent vers la gauche. Des zéros remplissent le côté droit.

Décalage à droite (>>) :

8'b00001010 >> 2 = 8'b00000010

Les bits se déplacent vers la droite. Des zéros remplissent le côté gauche.

Exemple de code

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

Sortie :

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

Décalage arithmétique vers la droite (>>>)

Pour les nombres signés, le décalage arithmétique vers la droite préserve le bit de signe :

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

Un décalage logique (>>) remplirait avec des zéros et ferait perdre le signe.

Utilisations courantes

Multiplier par une puissance de 2 (décalage vers la gauche) :

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

Diviser par une puissance de 2 (décalage vers la droite) :

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

Extraire un champ :

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

Défi

Écris les expressions de décalage correctes pour chaque tâche.

À faire :

  1. Décale a de 3 bits vers la gauche et stocke le résultat dans left_result
  2. Décale a de 1 bit vers la droite et stocke le résultat dans right_result
  3. Décale b de 2 bits vers la droite (arithmétiquement) et stocke le résultat dans arith_result

Essayez vous-même

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 binaire
    
    left_result  = ______;   // Décaler a de 3 bits vers la gauche
    right_result = ______;   // Décaler a de 1 bit vers la droite
    arith_result = ______;   // Décaler b de 2 bits vers la droite (décalage arithmétique)
    
    $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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux

Entraînez-vous par vous-même : Compilateur Verilog en ligne