Menu
Coddy logo textTech

Shift Operators

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 vers la droite au sein d’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 vers la gauche (<strong><<</strong>) :

8'b00001010 << 2 = 8'b00101000

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

Décalage à droite (<strong>>></strong>) :

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 signed, 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     // Toujours négatif

Le décalage logique (>>) remplirait avec des zéros et perdrait le signe.

Usages courants

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

x << 1    // Multiplier par 2
x << 2    // Multiplier par 4
x << 3    // Multiplier par 8

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

x >> 1    // Diviser par 2
x >> 2    // Diviser par 4
x >> 3    // Diviser par 8

Extraire un champ :

// Obtenir les bits 5-2 d'une valeur 8 bits
field = (data >> 2) & 4'b1111;
challenge icon

Défi

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

À faire :

  1. Décaler a vers la gauche de 3 bits et stocker le résultat dans left_result
  2. Décaler a vers la droite de 1 bit et stocker le résultat dans right_result
  3. Décaler b vers la droite de 2 bits (arithmétique) et stocker 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écale a de 3 bits vers la gauche
    right_result = ______;   // Décale a de 1 bit vers la droite
    arith_result = ______;   // Décale b de 2 bits vers la droite (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