条件运算符
本课属于 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)中。
挑战
为每项任务编写正确的条件表达式。
要做什么:
- 将
max设为x和y中较大的值 - 将
abs设为val的绝对值(如果是负数,就将其变为正数) - 如果
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这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器