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
| Operador | Operação | Descrição |
|---|---|---|
<< | Deslocamento lógico para a esquerda | Desloca os bits para a esquerda, preenche com zeros |
>> | Deslocamento lógico para a direita | Desloca os bits para a direita, preenche com zeros |
<<< | Deslocamento aritmético para a esquerda | O mesmo que o deslocamento lógico para a esquerda |
>>> | Deslocamento aritmético para a direita | Desloca para a direita, preserva o bit de sinal |
Como Eles Funcionam
Deslocamento à Esquerda (<strong><<</strong>):
8'b00001010 << 2 = 8'b00101000Os bits se movem para a esquerda. Zeros preenchem o lado direito.
Deslocamento para a Direita (<strong>>></strong>):
8'b00001010 >> 2 = 8'b00000010Os 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
endmoduleSaída:
original = 00001010
<< 2 = 00101000
>> 2 = 00000010Deslocamento à 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 negativoDeslocamento 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 8Dividir por potência de 2 (deslocamento à direita):
x >> 1 // Dividir por 2
x >> 2 // Dividir por 4
x >> 3 // Dividir por 8Extrair um campo:
// Obter os bits 5-2 de um valor de 8 bits
field = (data >> 2) & 4'b1111;Desafio
Escreva as expressões de deslocamento (shift) corretas para cada tarefa.
O que fazer:
- Desloque
apara a esquerda em 3 bits e armazene emleft_result - Desloque
apara a direita em 1 bit e armazene emright_result - Desloque
bpara a direita em 2 bits (aritmético) e armazene emarith_result
Folha de consulta
Operadores de deslocamento (shift) movem bits para a esquerda ou para a direita dentro de um vetor:
| Operador | Descriçã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
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo