news 2026/2/10 7:36:53

Verilog语言实现基本门电路:实战案例解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Verilog语言实现基本门电路:实战案例解析

从门电路开始:用Verilog构建数字世界的“原子单元”

你有没有想过,一台能运行操作系统、播放4K视频的现代计算机,它的底层逻辑其实是由一些极其简单的“开关”组合而成?这些“开关”,就是我们常说的门电路——与门、或门、非门……它们是数字系统中最基本的功能单元,就像乐高积木中的最小颗粒,虽小却无处不在。

在FPGA开发和IC设计中,我们不再靠手工连接晶体管来搭建电路,而是用硬件描述语言(HDL)把想法“写”成硬件。其中,Verilog HDL因其简洁直观、易于综合,在工程实践中广受欢迎。而学习Verilog的第一步,往往就是从实现这些最基本的门电路开始。

今天,我们就以实战视角,深入剖析如何用Verilog准确地建模并验证各种基础门电路,并揭示背后的设计思维与工程考量。


为什么先学门电路?因为它不只是“门”

初学者常问:“现在都有现成IP核了,还用得着一个个写与门或门吗?”
答案是:非常需要

因为掌握门级建模的意义不在于复刻一个功能,而在于理解:
- 硬件是如何响应输入变化的?
- 组合逻辑与过程块的本质区别是什么?
- 代码怎样才能被真正映射为物理电路?

这不仅是入门门槛,更是建立“硬件思维”的关键跳板。当你能清晰说出assign y = a & b;这一行代码对应的是CMOS中的哪几个MOS管时,你就已经离真正的数字设计师更近了一步。


从真值表到代码:四种基本门的Verilog实现

1. 与门(AND Gate)——全真才为真

逻辑行为:只有当所有输入都为1时,输出才为1。布尔表达式为 $ Y = A \cdot B $。

这是最典型的“协同控制”场景。比如两个使能信号必须同时有效,某个模块才能工作。

module and_gate ( input a, input b, output y ); assign y = a & b; endmodule

🔍细节解读
-assign是连续赋值语句,专用于组合逻辑。
-&是按位与操作符。虽然这里信号是单比特,但语法上仍属于“位运算”。
- 此代码完全可综合,综合工具会将其映射为标准单元库中的AND2X1单元(具体命名依工艺库而定)。

💡 小贴士:如果是三输入与门,直接扩展即可:assign y = a & b & c;


2. 或门(OR Gate)——一真即真

逻辑行为:任一输入为1,输出即为1。公式为 $ Y = A + B $。

常用于中断请求合并、状态标志汇总等场景。

module or_gate ( input a, input b, output y ); assign y = a | b; endmodule

⚙️工程观察
在实际电路中,或门通常不会直接由PMOS/NMOS构成(效率低),而是通过“或非+反相”结构实现。但在RTL级设计中,我们无需关心这种细节,只需关注逻辑功能是否正确。


3. 非门(NOT Gate / Inverter)——最简单的复杂起点

逻辑行为:输出等于输入取反,即 $ Y = \overline{A} $。

别看它简单,它是延迟最小、功耗最低的门之一,广泛用于缓冲驱动、电平翻转和噪声抑制。

module not_gate ( input a, output y ); assign y = ~a; endmodule

🧠深度思考
虽然只是一条线加一个圈,但在布局布线阶段,插入反相器可以解决扇出过大导致的时序违例问题。有时候为了平衡路径延迟,工程师甚至会故意添加“冗余”反相器——这就是所谓的“buffer insertion”。


4. 异或门(XOR Gate)——差异检测专家

逻辑行为:两输入不同时输出为1,相同时为0。公式为 $ Y = A \oplus B $。

它是半加器的核心部件(求和位),也用于奇偶校验、CRC计算、加密算法等。

module xor_gate ( input a, input b, output y ); assign y = a ^ b; endmodule

💡 应用延伸:
XOR还有一个神奇性质:$ A \oplus A = 0 $,$ A \oplus 0 = A $。利用这一点,可以在不使用额外寄存器的情况下交换两个变量(尽管在硬件中意义有限,但在某些微控制器编程中有妙用)。


复合门怎么搞?NAND 和 NOR 的正确打开方式

Verilog没有内置nandnor关键字,但我们可以通过组合操作轻松实现:

// 与非门:先与后非 module nand_gate ( input a, input b, output y ); assign y = ~(a & b); endmodule // 或非门:先或后非 module nor_gate ( input a, input b, output y ); assign y = ~(a | b); endmodule

⚠️重要提醒
虽然写法上只是多了一个~,但从物理实现角度看,原生NAND/NOR门比“组合生成”的更优。例如,2输入NAND在CMOS中仅需4个晶体管,而“AND + NOT”则需要6个。这意味着更低的面积、更快的速度和更少的功耗。

最佳实践建议
如果你在做ASIC设计,应尽量调用标准单元库中的NAND2NOR2等原语,而不是自己拼接。FPGA中一般由综合器自动优化为LUT配置。


这些门能做什么?看它们如何搭起整个数字大厦

你以为门电路只能做个灯控开关?远远不止。来看看它们是如何组成更复杂模块的:

高级模块所依赖的基本门功能说明
半加器XOR(和)、AND(进位)实现一位二进制加法
全加器两个XOR、两个AND、一个OR支持进位输入的完整加法器
多路选择器AND(选通)、OR(合并)、NOT(反相)数据路由切换
解码器AND(译码匹配)、NOT(地址反相)地址空间映射
SR锁存器NAND或NOR交叉反馈最简单的存储单元

📌举个例子:一个4位加法器,本质上就是四个全加器串联,每个都由若干XOR、AND、OR构成。所以,你不掌握这些基本门的行为特性,就很难调试进位链上的毛刺或延迟问题。


怎么验证你写的门是对的?测试平台才是王道

写完模块只是第一步,验证才是设计流程的核心环节。下面是一个完整的测试平台(Testbench),用来验证与门的功能完整性。

`timescale 1ns / 1ps module tb_and_gate; reg a, b; wire y; // 实例化被测模块 and_gate uut (.a(a), .b(b), .y(y)); initial begin $monitor("Time=%0t ns | A=%b B=%b | Y=%b", $time, a, b, y); // 测试全部输入组合 a = 0; b = 0; #10; a = 0; b = 1; #10; a = 1; b = 0; #10; a = 1; b = 1; #10; $display("Simulation finished."); $finish; end endmodule

✅ 输出示例:

Time=0 ns | A=0 B=0 | Y=0 Time=10 ns | A=0 B=1 | Y=0 Time=20 ns | A=1 B=0 | Y=0 Time=30 ns | A=1 B=1 | Y=1

🎯关键点解析
-$monitor自动跟踪信号变化,无需手动打印。
- 使用#10模拟时间推进(仅用于仿真)。
- 测试覆盖了所有可能输入组合,确保无遗漏。

⚠️ 注意:initial#延迟只能出现在测试平台中,不能用于可综合设计!


工程实战中常见的“坑”与应对策略

❌ 常见错误1:混淆wirereg

  • wire:用于连接,必须由assign驱动。
  • reg:用于过程赋值(always块),可在时钟边沿保持状态。

🚫 错误写法:

wire y; always @(*) y = a & b; // 错!wire不能在always中赋值

✅ 正确做法:

reg y; always @(*) y = a & b; // OK,但不如assign简洁 // 或者继续保持assign风格

👉 推荐原则:组合逻辑优先使用assign+wire;时序逻辑用always @(posedge clk)+reg


❌ 常见错误2:忽略位宽导致截断

假设你想对一个8位总线取反:

input [7:0] data_in; output [7:0] data_out; assign data_out = ~data_in; // ✅ 正确,整组取反

但如果写成:

assign data_out[0] = ~data_in; // ❌ 只取了最低位!高位补零

结果将是灾难性的。务必检查操作数的位宽一致性。


✅ 最佳实践:参数化设计提升复用性

对于通用功能(如总线反相器),建议使用参数化设计:

module bus_inverter #( parameter WIDTH = 8 )( input [WIDTH-1:0] data_in, output [WIDTH-1:0] data_out ); assign data_out = ~data_in; endmodule

这样你可以灵活实例化不同宽度的反相器:

bus_inverter #(4) inv4 (.data_in(sw), .data_out(led)); // 4位 bus_inverter #(16) inv16(.data_in(bus_a), .data_out(bus_b)); // 16位

从文本到芯片:你的代码是怎么变成硬件的?

很多人写了Verilog却不知道它最终去了哪里。以下是典型的设计流程:

  1. 编写RTL代码→ 写出模块定义和逻辑表达式
  2. 搭建Testbench→ 完成功能仿真(Functional Simulation)
  3. 逻辑综合→ 工具(如Vivado、Design Compiler)将Verilog转为门级网表(Gate-level Netlist)
  4. 静态时序分析(STA)→ 检查是否满足建立/保持时间
  5. 布局布线(P&R)→ 在FPGA上分配资源并连线
  6. 生成比特流→ 下载到FPGA运行,或交付流片生产

在这个链条中,可综合性至关重要。像while循环、动态数组、递归函数等C语言常见结构,在Verilog中大多不可综合,必须避免。


结语:门虽小,道无穷

你可能会觉得,写几个assign就完成了任务,没什么技术含量。但正是这些看似简单的语句,构成了整个数字世界的基石。

当我们谈论高性能处理器、AI加速器、高速通信接口时,追根溯源,它们都不过是亿万次精准配合的“与”、“或”、“非”的集合体。

掌握基本门电路的Verilog实现,不是终点,而是起点。它教会我们的不仅是语法,更是一种思维方式——如何把抽象逻辑转化为真实存在的电子流动

下一步,你可以尝试:
- 用这些门搭建一个半加器;
- 实现一个2选1多路器;
- 探索用户自定义原语(UDP)创建自己的逻辑元件;
- 学习门控时钟技术,优化动态功耗。

记住:每一个伟大的系统,都始于一个小小的assign

如果你正在学习FPGA或者准备进入数字前端设计领域,不妨从今天起,亲手写下第一个and_gate模块,并跑通它的仿真。那一刻,你会真正感受到——你在“编写”硬件

欢迎在评论区分享你的第一个门电路仿真截图,我们一起见证这段旅程的开始。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 7:16:04

长文本合成失败?Sambert-Hifigan镜像优化分段处理机制,成功率100%

长文本合成失败?Sambert-Hifigan镜像优化分段处理机制,成功率100% 📌 背景与痛点:中文多情感语音合成的长文本挑战 在智能客服、有声书生成、虚拟主播等实际应用场景中,长文本语音合成(TTS) 是一…

作者头像 李华
网站建设 2026/2/9 22:07:22

Scanner类输入异常处理操作实践

如何优雅地处理 Scanner 输入异常?这些坑你一定要避开!在 Java 编程中,我们经常需要和用户“对话”——比如写一个计算器、学生成绩管理系统,或者算法题的控制台输入。这时候,Scanner类就成了最顺手的工具之一。它简单…

作者头像 李华
网站建设 2026/2/7 9:36:46

依赖包冲突导致合成失败?Sambert-Hifigan镜像已预装兼容环境

依赖包冲突导致合成失败?Sambert-Hifigan镜像已预装兼容环境 🎙️ Sambert-HifiGan 中文多情感语音合成服务 (WebUI API) 📖 项目简介 在语音合成(Text-to-Speech, TTS)领域,中文多情感语音合成是提升人机…

作者头像 李华
网站建设 2026/2/7 19:55:56

完整示例展示UDS 19服务在AUTOSAR架构中的集成方式

UDS 19服务在AUTOSAR架构中的实战集成:从协议到代码的完整路径你有没有遇到过这样的场景?诊断仪连上ECU,输入0x19 0x0A,结果返回一个冷冰冰的NRC 0x22——“条件不满足”。翻手册、查配置、抓波形,折腾半天才发现是会话…

作者头像 李华
网站建设 2026/2/7 10:55:35

高速电路设计入门必看:Altium Designer元件库使用技巧

高速电路设计的起点:Altium Designer元件库实战指南 你有没有遇到过这样的情况? PCB打样回来,贴片厂告诉你:“这个Type-C连接器焊不上——引脚比焊盘宽0.2mm。” 或者调试USB 3.0眼图时发现严重反射,查来查去才发现是…

作者头像 李华
网站建设 2026/2/9 16:55:52

Sambert-HifiGan语音合成API的鉴权与安全

Sambert-HifiGan语音合成API的鉴权与安全 📌 引言:为何需要API安全与鉴权机制? 随着语音合成技术在智能客服、有声阅读、虚拟主播等场景中的广泛应用,Sambert-HifiGan 作为ModelScope平台上表现优异的中文多情感语音合成模型&…

作者头像 李华