Operador Condicional
Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 28 de 90.
O operador condicional ? : seleciona entre dois valores com base em uma condição. Ele também é chamado de operador ternário. O operador condicional avalia uma condição e retorna um de dois valores:
condition ? value_if_true : value_if_falseSe a condição for verdadeira (1), o primeiro valor é retornado. Se for falsa (0), o segundo valor é retornado.
Por que usar o operador condicional
É uma maneira compacta de escrever uma lógica simples de if-else em uma única linha. Os usos comuns incluem:
- Selecionar entre dois sinais
- Criar multiplexadores
- Definir valores padrão
- Atribuições condicionais inline
Sintaxe e Exemplos
Exemplo básico:
result = (a > b) ? a : b; // result recebe o maior entre a e bSelecionar entre valores:
data_out = (enable) ? data_in : 8'b00000000; // Saída de dados se habilitado, caso contrário 0Inverter sinal condicionalmente:
out = (invert) ? ~in : in; // Se invert for 1, saída invertida; caso contrário, inalteradaExemplo de Código
module conditional_demo;
reg [3:0] a, b, max;
reg enable;
reg [3:0] data_in, data_out;
initial begin
a = 4'd7;
b = 4'd9;
enable = 1;
data_in = 4'b1010;
max = (a > b) ? a : b; // 9
data_out = (enable) ? data_in : 4'b0000; // 1010
$display("max = %d", max);
$display("data_out = %b", data_out);
$finish;
end
endmoduleSaída:
max = 9
data_out = 1010Operadores Condicionais Aninhados
Você pode aninhar operadores condicionais para múltiplas seleções:
result = (a > b) ? a : (b > c) ? b : c; // Encontre o maior de três valoresUse parênteses para tornar claras as condições aninhadas.
Notas Importantes
- A condição deve ser um único bit (ou expressão que resulte em 0 ou 1)
- Ambas as opções de valor devem ter a mesma largura de bits
- O operador pode ser usado em atribuições contínuas (
assign) e blocos procedurais (always,initial)
Desafio
Escreva as expressões condicionais corretas para cada tarefa.
O que fazer:
- Defina
maxcomo o maior entrexey - Defina
abscomo o valor absoluto deval(se negativo, torne-o positivo) - Defina
output_datacomodataseenablefor 1, caso contrário, como8'b0
Folha de consulta
O operador condicional (ternário) ? : seleciona entre dois valores com base em uma condição:
condition ? value_if_true : value_if_falseExemplos:
max = (a > b) ? a : b; // o maior entre a e b
data_out = (enable) ? data_in : 8'b0; // dados de saída se habilitado, caso contrário 0
out = (invert) ? ~in : in; // inverte o sinal condicionalmenteOperadores condicionais aninhados:
result = (a > b) ? a : (b > c) ? b : c; // o maior de três valoresNotas:
- A condição deve ser avaliada como 0 ou 1
- Ambas as opções de valor devem ter a mesma largura de bits
- Pode ser usado em blocos
assign,alwayseinitial
Experimente você mesmo
module conditional_challenge;
reg [3:0] x, y;
reg [3:0] max;
reg signed [3:0] val;
reg [3:0] abs;
reg enable;
reg [7:0] data;
reg [7:0] output_data;
initial begin
x = 4'd12;
y = 4'd8;
val = -4'sd5;
enable = 1;
data = 8'b10101010;
max = ______; // o maior entre x e y
abs = ______; // valor absoluto de val
output_data = ______; // data se enable, caso contrário 0
$display("max = %d", max);
$display("abs = %d", abs);
$display("output_data = %b", output_data);
$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