Verilog 入门:构建您的第一个硬件描述模块
本文学习 Verilog 模块基本结构、wire 数据类型及其向量形式用法,简要对比 VHDL 与 Verilog 差异。
本文学习 Verilog 模块基本结构、wire 数据类型及其向量形式用法,简要对比 VHDL 与 Verilog 差异。
Verilog 和 VHDL 是描述数字电路常用的两种语言。AAC 有系列技术文章讨论 VHDL 基础概念。本文作为 Verilog 系列的切入点。
是否需要同时掌握 Verilog 和 VHDL?
讨论前先回应显而易见的问题:真需要同时掌握这两语言吗?
Verilog 和 VHDL 都是设计复杂数字电路的强大工具。虽两 HDL 有差异,您可自由选择其一精通使用。但我认为某时刻您会受益于至少基础理解两者。设计师常需样例代码片段启发项目编码。网上搜索数小时终于找到却看不懂——用完全陌生的 HDL 编写。不懂该语言基础,可能无法完全理解其中技术。
Verilog 演进史
Verilog 1984 年初由 Gateway Design Automation 设计(比美国国防部发起 VHDL 晚约三年)。有 DoD 支持,VHDL 1987 年成 IEEE 标准。Verilog 1995 年才入选。如今两者均为流行 HDL,FPGA 设计工具通常支持两语言。
“Verilog”系“verification”(验证)与“logic”(逻辑)混成词,因语言最初建议作为仿真验证工具。开始学习 Verilog 概念与语法。
示例 1
首例为图 1 电路编写 Verilog 代码。

图 1. Circuit_1
两输入一输出,端口均 1 位宽。电路功能:与两输入,结果输出到 out1 端口。
Circuit_1 模块一种可能的 Verilog 描述:

第 1 行和第 8 行
用 “module” 和 “endmodule” 关键字指定中间行(第 2-7 行)均描述名为 “Circuit_1” 的电路。名称任意,便于后续引用。
第 2-6 行
指定 “Circuit_1” 与外部环境的接口。输入输出端口用 “input” 和 “output” 关键字描述。后跟 “wire” 关键字和端口名(见图 1)。“wire” 指定什么?Wire 是 Verilog 数据类型,代表设计中的物理连线。后文详述 Verilog 数据类型,目前知模块中有 a、b、out1 三根线,因端口声明指定,对应模块接口。
第 7 行
用位与运算符 & 描述电路功能。关键字 “assign” 将 a&b 放到输出端口 out1。此赋值称连续赋值。因右侧操作数变化时 a&b 重新求值赋给 out1,赋值始终激活。可视为组合电路,输出随输入持续更新。本例中组合电路为简单与门。Verilog HDL 也有过程赋值,后文讨论。
可用 Xilinx ISE 等软件包验证上述代码。Verilog 教程见此(PDF)。
示例 1 与 VHDL 代码对比
图 2 展示 Circuit_1 模块的 Verilog 和 VHDL 描述。

图 2. Circuit_1 的 Verilog 与 VHDL 描述对比。
可见 VHDL 编码需包含库。这些库提供数据类型和运算符定义。考虑库管理和 VHDL 通用格式,观察到 VHDL 代码更冗长。但冗长非无优势。例如 VHDL 库管理功能建模高层系统时有帮助。后文将偶尔讨论两 HDL 优劣。
Verilog 四值系统
大多数 Verilog 数据类型用四基本值。Listing 1 定义的线可取:
- 0:逻辑低或假
- 1:逻辑高或真
- z:高阻态(可描述三态缓冲器输出)
- x:不关心或未知值(输入未初始化或多个冲突输出连接)
VHDL std_logic 类型可取九值但常用 '0'、'1'、'Z'、'-'('-' 表示不关心)。
示例 2
再例为图 3 电路(标记 Circuit_2)编写 Verilog 代码。

图 3. Circuit_2
以下 Verilog 代码描述此电路:

代码元素与示例 1 类似,除第 10 行定义内部信号。关键字 “wire” 指定连接数据类型。如前所述,“wire” 转化为设计中的物理连线。
代码也用新 Verilog 位运算符:~ 非、| 或。另一有用位运算符 ^ 异或。图 4 展示 Circuit_2 模块的 Verilog 和 VHDL 描述。对比有助于看清两语言异同。

图 4. Circuit_2 的 Verilog 与 VHDL 描述对比。
示例 3
第三个也是最后示例,给出图 5 原理图的 Verilog 代码。

图 5. 示例 3 原理图。
可见蓝色输入端口与红色端口有对应关系:对应输入用与运算符组合,结果赋给输出端口。此类情况可将信号分组视为向量。这让代码紧凑易读。
用 Verilog 向量概念,易扩展 Listing 1 代码描述上述电路(见下方 Listing 3 代码)。

注意向量索引范围可升序 ([0:2] 如上用) 或降序 ([2:0])。虽用升序,但降序通常少错。因降序匹配二进制数最左位索引最高的认知。注意 VHDL 也用向量。
图 6 显示 Listing 3 代码的 ISE 仿真。

图 6. 示例 3 代码的 ISE 仿真。
本文讨论了学习 VHDL 和 Verilog 皆宜,学习了 Verilog 模块基本结构,熟悉了 Verilog “wire” 数据类型及其向量形式,简要触及 VHDL 与 Verilog 差异。Verilog 系列下文将讨论 Verilog 设计组合电路。
嵌入式
- 优化Cat®机械:My.Cat.com终极指南
- TJBot 入门指南:构建、配置与语音控制您的 AI 机器人
- 树莓派 3 部署 RAK 831 LoRa 网关分步指南
- 基于 RAK831 模块与树莓派 3 构建 LoRa 网关:分步指南
- Eagle Group:从概念到成品的优质金属制造合作伙伴
- 陶瓷3D打印实操指南:技术、材料与设计技巧
- 保险业 AI 落地实战指南:从认知到规模化应用
- 掌握边缘 AI 推理:获取可落地洞察的实战指南
- 在 PLCnext 上用 Docker 部署 Node-RED:分步实战指南
- 在 PLCnext 上构建首个 Go 应用:新手入门指南
- Code-Ready Containers实战指南:基于Red Hat OpenShift的云原生流程自动化
- Connext DDS入门指南(三):每位DDS开发者必掌握的Admin Console