Verilog 描述组合电路:条件运算符与 Always 模块详解
本文讲解如何用 Verilog 建模组合逻辑,涵盖条件运算符实现真值表和强大的 always 块简洁设计。
本指南演示 Verilog 描述组合电路的关键技术。首先回顾 assign 关键字的连续赋值语法,然后介绍条件运算符 (?:) 作为表达多路选择器逻辑的简洁方式。最后展示 always 块如何提供更清晰的过程化描述。
前文覆盖了 assign 关键字的连续赋值。这些语句持续激活,允许获得电路门级描述。例如以下代码建模与门:
assign out1 = a & b;
Verilog 条件运算符让单个赋值基于条件改变值。语法:
assign [signal_name] = [conditional_expression] ? [value_if_true] : [value_if_false];
先求值 conditional_expression。若为真,value_if_true 赋给 signal_name;否则用 value_if_false。示例:
assign out1 = (sel) ? (a & b) : (a | b);
sel 为真时 a 与 b 的与驱动 out1;否则选 a 与 b 的或。单行实现 2 选 1 多路选择器。
因条件运算符表现如传统编程的 if 语句,允许组合逻辑更抽象表达。嵌套运算符可构建复杂结构,如示例 1 所示。
示例 1:嵌套条件运算符
下方用嵌套条件运算符实现 4 选 2 优先编码器。真值表见图 1。

Verilog 代码:
module Prio_4_to_2 ( input wire [3:0] x, output wire [1:0] y, output wire v ); assign y = x[3] ? 2'b11 : x[2] ? 2'b10 : x[1] ? 2'b01 : 2'b00; assign v = ( x[3] | x[2] | x[1] | x[0] ) ? 1'b1 : 1'b0; endmodule
第 7-10 行展示嵌套条件运算符。各条件顺序求值,早项优先级高——完美适配优先逻辑。v 的最终 assign 用按位或指示任一输入为高。
Xilinx ISE 仿真结果确认行为(图 2)。

图 2. Xilinx ISE 优先编码器仿真。
关键点:条件表达式按序求值直到找到真条件;对应值随即赋值。因此此结构最适合优先网络(图 3)而非平衡多路选择器(图 4)。

图 3. 优先网络。

图 4. 无输入优先级的 n 选 1 多路选择器。
前文讨论 VHDL 并发赋值;概念类似适用于 Verilog。
Verilog 过程语句
assign 和条件运算符足以应对许多设计,但 always 块提供更具表达力的过程化方法。always 块内语句顺序执行,可包含 if 和 case 等高级构造,映射人类推理自然流程。
示例 2 演示基本 always 块实现简单与门。
示例 2:“Always” 块语句
always 块简化语法:
always @(sensitivity_list) begin sequential_statements; end
sensitivity_list 指定块何时重新求值。纯组合电路需所有输入信号出现在此列表。
考虑图 5 电路,输出随 a 或 b 翻转而变化。

图 5. Circuit_1
以下 always 块用阻塞赋值实现与操作:
always @(a, b) begin out1 = a & b; end
阻塞赋值 (=) 立即更新左侧,非阻塞赋值 (<=) 延迟到块结束更新。组合逻辑最稳妥用阻塞赋值避免竞态条件。
因过程块不能驱动 wire,输出必须声明为 reg,可能推断存储元素也可能不。完整模块如下:
module Circuit_1 ( input wire a, input wire b, output reg out1 ); always @(a, b) begin out1 = a & b; end endmodule
本文覆盖了用于紧凑真值表逻辑的条件运算符、用于优先编码的嵌套运算符、用于更清晰组合描述的过程化 always 块。后续文章将探讨 always 用于时序逻辑。
嵌入式