Menu
Coddy logo textTech

Operadores de Deslocamento

Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 26 de 90.

Operadores de deslocamento movem bits para a esquerda ou para a direita dentro de um vetor.

Operadores de Deslocamento Disponíveis

OperadorOperaçãoDescrição
<<Deslocamento lógico para a esquerdaDesloca os bits para a esquerda, preenche com zeros
>>Deslocamento lógico para a direitaDesloca os bits para a direita, preenche com zeros
<<<Deslocamento aritmético para a esquerdaO mesmo que o deslocamento lógico para a esquerda
>>>Deslocamento aritmético para a direitaDesloca para a direita, preserva o bit de sinal

Como Eles Funcionam

Deslocamento à Esquerda (<strong><<</strong>):

8'b00001010 << 2 = 8'b00101000

Os bits se movem para a esquerda. Zeros preenchem o lado direito.

Deslocamento para a Direita (<strong>>></strong>):

8'b00001010 >> 2 = 8'b00000010

Os bits se movem para a direita. Zeros preenchem o lado esquerdo.

Exemplo 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

Saída:

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

Deslocamento à Direita Aritmético (>>>)

Para números com sinal, o deslocamento à direita aritmético preserva o bit de sinal:

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

Deslocamento lógico (>>) preencheria com zeros e perderia o sinal.

Usos Comuns

Multiplicar por potência de 2 (deslocamento à esquerda):

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

Dividir por potência de 2 (deslocamento à direita):

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

Extrair um campo:

// Obter os bits 5-2 de um valor de 8 bits
field = (data >> 2) & 4'b1111;
challenge icon

Desafio

Escreva as expressões de deslocamento (shift) corretas para cada tarefa.

O que fazer:

  1. Desloque a para a esquerda em 3 bits e armazene em left_result
  2. Desloque a para a direita em 1 bit e armazene em right_result
  3. Desloque b para a direita em 2 bits (aritmético) e armazene em arith_result

Folha de consulta

Operadores de deslocamento (shift) movem bits para a esquerda ou para a direita dentro de um vetor:

OperadorDescrição
<<Deslocamento lógico para a esquerda (preenche com zeros)
>>Deslocamento lógico para a direita (preenche com zeros)
<<<Deslocamento aritmético para a esquerda (igual ao lógico)
>>>Deslocamento aritmético para a direita (preserva o bit de sinal)
8'b00001010 << 2  // = 8'b00101000
8'b00001010 >> 2  // = 8'b00000010

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

Usos comuns:

x << n    // Multiplica por 2^n
x >> n    // Divide por 2^n

// Extrai os bits 5-2 de um valor de 8 bits
field = (data >> 2) & 4'b1111;

Experimente você mesmo

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 em binário
    
    left_result  = ______;   // Desloca a para a esquerda em 3 bits
    right_result = ______;   // Desloca a para a direita em 1 bit
    arith_result = ______;   // Desloca b para a direita em 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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos