Menu
Coddy logo textTech

Operadores Bitwise

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

Operadores bitwise realizam operações em cada bit individual de um número. Ao contrário dos operadores aritméticos (+, -, *, /) que tratam os números como valores inteiros, os operadores bitwise trabalham bit a bit.

Operadores Bitwise Disponíveis

OperadorOperaçãoO Que Faz
&ANDO bit de saída é 1 apenas se ambos os bits de entrada forem 1
|ORO bit de saída é 1 se pelo menos um dos bits de entrada for 1
^XORO bit de saída é 1 se os bits de entrada forem diferentes
~NOTInverte todos os bits (0 torna-se 1, 1 torna-se 0)

Quando você usa operadores bitwise, o Verilog trata os números como binários nos bastidores.

reg [3:0] a, b;

a = 4'd10;      // Decimal 10 = binário 1010
b = 4'd12;      // Decimal 12 = binário 1100
c = a & b;      // Funciona da mesma forma que usar binário diretamente

Você pode escrever números em decimal, hexadecimal ou binário—o Verilog os converte para binário para operações bit a bit.

Como o Bitwise Funciona

Cada operador trabalha em pares de bits (ou bits únicos para NOT):

Exemplo com números de 4 bits:

a = 1010  (binário)
b = 1100  (binário)

AND:  a & b = 1000
      (1&1=1, 0&1=0, 1&0=0, 0&0=0)

OR:   a | b = 1110
      (1|1=1, 0|1=1, 1|0=1, 0|0=0)

XOR:  a ^ b = 0110
      (1^1=0, 0^1=1, 1^0=1, 0^0=0)

NOT:  ~a = 0101
      (~1=0, ~0=1, ~1=0, ~0=1)

Exemplo de Código

module bitwise_demo;
  reg [3:0] a, b;
  reg [3:0] and_res, or_res, xor_res, not_res;
  
  initial begin
    a = 4'b1010;
    b = 4'b1100;
    
    and_res = a & b;   // 1010 & 1100 = 1000
    or_res  = a | b;   // 1010 | 1100 = 1110
    xor_res = a ^ b;   // 1010 ^ 1100 = 0110
    not_res = ~a;      // ~1010 = 0101
    
    $display("a = %b", a);
    $display("b = %b", b);
    $display("a & b = %b", and_res);
    $display("a | b = %b", or_res);
    $display("a ^ b = %b", xor_res);
    $display("~a    = %b", not_res);
    $finish;
  end
endmodule

Saída:

a = 1010
b = 1100
a & b = 1000
a | b = 1110
a ^ b = 0110
~a    = 0101
challenge icon

Desafio

Calcule os resultados bitwise para os valores fornecidos.

O que fazer:

  1. Calcule a & b e armazene em and_res
  2. Calcule a | b e armazene em or_res
  3. Calcule a ^ b e armazene em xor_res
  4. Calcule ~a e armazene em not_res

Folha de consulta

Operadores bitwise (bit a bit) trabalham em cada bit individual de um número:

OperadorOperaçãoO bit de saída é 1 quando...
&ANDAmbos os bits de entrada são 1
|ORPelo menos um bit de entrada é 1
^XOROs bits de entrada são diferentes
~NOTInverte todos os bits (unário)
// a = 1010, b = 1100
a & b = 1000   // AND
a | b = 1110   // OR
a ^ b = 0110   // XOR
~a    = 0101   // NOT

Experimente você mesmo

module bitwise_challenge;
  reg [3:0] a, b;
  reg [3:0] and_res, or_res, xor_res, not_res;
  
  initial begin
    a = 4'b1101;
    b = 4'b1011;
    
    and_res = ______;   // a & b
    or_res  = ______;   // a | b
    xor_res = ______;   // a ^ b
    not_res = ______;   // ~a
    
    $display("a = %b", a);
    $display("b = %b", b);
    $display("a & b = %b", and_res);
    $display("a | b = %b", or_res);
    $display("a ^ b = %b", xor_res);
    $display("~a    = %b", not_res);
    $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