Menu
Coddy logo textTech

Atribuição com Operadores

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

Uma vez que você entenda a atribuição contínua, você pode combiná-la com operadores para criar lógica útil. A instrução assign pode usar qualquer operador para acionar um wire.

Sintaxe Básica

assign wire_name = expression;

A expressão pode incluir:

  • Operadores aritméticos (+, -, *, /)
  • Operadores bit a bit (&, |, ^, ~)
  • Operadores lógicos (&&, ||, !)
  • Operadores de comparação (>, <, ==, !=)
  • Operadores de deslocamento (<<, >>)
  • Operador condicional (? :)

Exemplos com Diferentes Operadores

AND Bit a Bit:

assign out = a & b;

Adição:

assign sum = a + b;

Comparação:

assign is_greater = (a > b);

Condicional (multiplexador):

assign out = sel ? a : b;

Deslocamento:

assign shifted = data << 2;

Concatenação:

assign bus = {high_byte, low_byte};

Exemplo de Código

module assign_operators (
  input [3:0] a, b,
  input sel,
  output [3:0] and_out,
  output [4:0] sum_out,
  output is_equal,
  output mux_out
);
  
  assign and_out = a & b;           // AND bit a bit
  assign sum_out = a + b;           // Adição
  assign is_equal = (a == b);       // Comparação
  assign mux_out = sel ? a : b;     // Condicional (multiplexador)
  
endmodule

Múltiplos Operadores em uma Única Atribuição

Você pode combinar operadores em uma única expressão:

assign result = (a & b) | (c ^ d);
assign final = (a + b) > (c - d);
assign parity = ^data;   // XOR de redução (número ímpar de 1's)

Precedência de Operadores

O Verilog segue a precedência de operadores padrão. Use parênteses ( ) para tornar sua intenção clara:

// Pouco claro
assign out = a & b | c;

// Claro
assign out = (a & b) | c;
challenge icon

Desafio

Adicione as instruções assign ausentes com base nas tarefas.

O que fazer:

  1. Torne and_result igual a input_a AND input_b (bit a bit)
  2. Torne or_result igual a input_a OR input_b (bit a bit)
  3. Torne xor_result igual a input_a XOR input_b (bit a bit)
  4. Torne not_result igual a NOT input_a (bit a bit)

Folha de consulta

A instrução assign suporta vários operadores para lógica combinacional:

assign wire_name = expression;

Tipos de operadores:

  • Bitwise: &, |, ^, ~
  • Aritméticos: +, -, *, /
  • Lógicos: &&, ||, !
  • Comparação: >, <, ==, !=
  • Deslocamento (Shift): <<, >>
  • Condicional: ? :
  • Concatenação: { }
assign and_out  = a & b;          // AND bit a bit
assign sum_out  = a + b;          // Adição
assign is_equal = (a == b);       // Comparação
assign mux_out  = sel ? a : b;    // Multiplexador
assign bus      = {high, low};    // Concatenação
assign parity   = ^data;          // XOR de redução

Use parênteses para esclarecer a precedência:

assign out = (a & b) | c;

Experimente você mesmo

module assign_challenge (
  input input_a,
  input input_b,
  output and_result,
  output or_result,
  output xor_result,
  output not_result
);
  
  // TODO: Adicione instruções assign para:
  // and_result = input_a & input_b
  // or_result  = input_a | input_b
  // xor_result = input_a ^ input_b
  // not_result = ~input_a

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