Menu
Coddy logo textTech

Operadores de desplazamiento

Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 26 de 90.

Los operadores de desplazamiento mueven bits a la izquierda o a la derecha dentro de un vector.

Operadores de desplazamiento disponibles

OperadorOperaciónDescripción
<<Desplazamiento lógico a la izquierdaDesplaza los bits a la izquierda, rellena con ceros
>>Desplazamiento lógico a la derechaDesplaza los bits a la derecha, rellena con ceros
<<<Desplazamiento aritmético a la izquierdaIgual que el desplazamiento lógico a la izquierda
>>>Desplazamiento aritmético a la derechaDesplaza a la derecha, preserva el bit de signo

Cómo funcionan

Desplazamiento a la izquierda (<strong><<</strong>):

8'b00001010 << 2 = 8'b00101000

Los bits se mueven a la izquierda. Los ceros llenan el lado derecho.

Desplazamiento a la derecha (<strong>>></strong>):

8'b00001010 >> 2 = 8'b00000010

Los bits se mueven a la derecha. Los ceros llenan el lado izquierdo.

Ejemplo de código

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

Salida:

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

Desplazamiento aritmético a la derecha (>>>)

Para números con signo, el desplazamiento aritmético a la derecha preserva el bit de signo:

reg signed [7:0] a;
a = -5;                // 11111011
a >>> 2 = 11111110     // Sigue siendo negativo

El desplazamiento lógico (>>) rellenaría con ceros y perdería el signo.

Usos comunes

Multiplicar por una potencia de 2 (desplazamiento a la izquierda):

x << 1    // Multiplicar por 2
x << 2    // Multiplicar por 4
x << 3    // Multiplicar por 8

Dividir por una potencia de 2 (desplazamiento a la derecha):

x >> 1    // Dividir por 2
x >> 2    // Dividir por 4
x >> 3    // Dividir por 8

Extraer un campo:

// Obtener los bits 5-2 de un valor de 8 bits
field = (data >> 2) & 4'b1111;
challenge icon

Desafío

Escribe las expresiones de desplazamiento correctas para cada tarea.

Qué hacer:

  1. Desplaza a a la izquierda 3 bits y almacénalo en left_result
  2. Desplaza a a la derecha 1 bit y almacénalo en right_result
  3. Desplaza b a la derecha 2 bits (aritmético) y almacénalo en arith_result

Hoja de referencia

Los operadores de desplazamiento mueven los bits a la izquierda o a la derecha dentro de un vector:

OperadorDescripción
<<Desplazamiento lógico a la izquierda (rellena con ceros)
>>Desplazamiento lógico a la derecha (rellena con ceros)
<<<Desplazamiento aritmético a la izquierda (igual que el lógico)
>>>Desplazamiento aritmético a la derecha (preserva el bit de signo)
8'b00001010 << 2  // = 8'b00101000
8'b00001010 >> 2  // = 8'b00000010

reg signed [7:0] a;
a = -5;           // 11111011
a >>> 2           // = 11111110 (signo preservado)

Usos comunes:

x << n    // Multiplicar por 2^n
x >> n    // Dividir por 2^n

// Extraer los bits 5-2 de un valor de 8 bits
field = (data >> 2) & 4'b1111;

Pruébalo tú mismo

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  = ______;   // Desplazar a a la izquierda 3 bits
    right_result = ______;   // Desplazar a a la derecha 1 bit
    arith_result = ______;   // Desplazar b a la derecha 2 bits (aritmético)
    
    $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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos