亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial Internet of Things >> 嵌入式

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 描述组合电路:条件运算符与 Always 模块详解

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)。

Verilog 描述组合电路:条件运算符与 Always 模块详解

图 2. Xilinx ISE 优先编码器仿真。

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

Verilog 描述组合电路:条件运算符与 Always 模块详解

图 3. 优先网络。

Verilog 描述组合电路:条件运算符与 Always 模块详解

图 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 翻转而变化。

Verilog 描述组合电路:条件运算符与 Always 模块详解

图 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 用于时序逻辑。

嵌入式

  1. 直流电路基石:理解恒定极性电流与核心电学概念
  2. 理解交流电路:初学者指南
  3. 单一二进制编码器驱动四位 7 段显示器设计
  4. 整流电路:从半波到多相全波设计
  5. 限幅电路原理、仿真与实际应用详解
  6. 控制电路:基础、应用与最佳实践
  7. C#运算符——C#运算符全面指南
  8. C# 三元运算符:条件表达式简明指南
  9. Verilog基础:设计你的第一个与门
  10. Verilog 入门:数字电路设计完整教程
  11. 掌握 Verilog 拼接操作:实用指南
  12. Verilog `ifdef 条件编译详解:宏控制代码包含与排除