Menu
CoddyTech

条件运算符

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 28 课,共 90 课。

条件运算符 ? : 根据条件在两个值之间进行选择。它也称为三元运算符。条件运算符会计算一个条件,并返回两个值中的一个:

condition ? value_if_true : value_if_false

如果条件为 true(1),则返回第一个值。如果条件为 false(0),则返回第二个值。

为什么使用条件运算符

它能用一行简洁地编写简单的 if-else 逻辑。常见用途包括:

  • 在两个信号之间进行选择
  • 创建多路复用器
  • 设置默认值
  • 内联条件赋值

语法和示例

基本示例:

result = (a > b) ? a : b;   // result 取 a 和 b 中较大的值

在多个值之间进行选择:

data_out = (enable) ? data_in : 8'b00000000;   // Output data if enabled, else 0

有条件地反转信号:

out = (invert) ? ~in : in;   // 如果 invert 为 1,则输出取反后的值;否则保持不变

代码示例

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
endmodule

输出:

max = 9
data_out = 1010

嵌套条件运算符

你可以嵌套条件运算符来进行多重选择:

result = (a > b) ? a : (b > c) ? b : c;   // 如果 a > b,则取 a;否则取 b 和 c 中较大的值

使用括号让嵌套条件更清晰。

重要说明

  • 当条件求值得到非零(已知)值时,该条件会被视为真。
  • 确保两个值选项的位宽相同。如果位宽不同,Verilog 会自动扩展较窄的值,且不会发出提示。
  • 该运算符可用于连续赋值(assign)和过程块(always、initial)中。
challenge icon

挑战

为每项任务编写正确的条件表达式。

要做什么:

  1. 将 max 设为 x 和 y 中较大的值
  2. 将 abs 设为 val 的绝对值(如果是负数,就将其变为正数)
  3. 如果 enable 为 1,则将 output_data 设为 data ,否则设为 8'b0

亲手试试

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 = ______;          // x 和 y 中较大的值
    abs = ______;          // val 的绝对值
    output_data = ______;  // 如果 enable 为真,则取 data,否则取 0
    
    $display("max = %d", max);
    $display("abs = %d", abs);
    $display("output_data = %b", output_data);
    $finish;
  end
endmodule
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器