news 2026/4/15 20:11:46

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/3/31 0:33:15

零基础实现Elasticsearch下载和Logstash联动实践

从零搭建日志中枢:Elasticsearch与Logstash联动实战你有没有遇到过这样的场景?系统上线后日志散落在各个服务器,排查问题时得一台台登录查看;或者想统计某个接口的调用趋势,却发现数据格式五花八门,根本没法…

作者头像 李华
网站建设 2026/4/15 17:21:27

自动驾驶环境建模中的传感器标定:操作指南

自动驾驶传感器标定实战指南:从原理到落地的全链路解析在自动驾驶系统的感知链条中,环境建模是理解“车外世界”的第一步。我们依赖激光雷达看结构、摄像头识语义、毫米波雷达破天气——但这些传感器各自为政的数据,若未经统一校准&#xff0…

作者头像 李华
网站建设 2026/3/18 16:27:02

PCB生产流程深度剖析:从设计到成品的系统学习

PCB生产流程深度剖析:从设计到成品的系统学习一块PCB板是如何“炼”成的?你有没有想过,手边那块指甲盖大小却集成了上百个元器件的电路板,究竟是怎么被制造出来的?它不是画好图送去工厂就自动变出来的——背后是一整套…

作者头像 李华
网站建设 2026/4/12 19:53:13

语音合成质量评估体系:MOS评分之外我们还能看什么?

语音合成质量评估体系:MOS评分之外我们还能看什么? 在中文多情感语音合成(Multi-Emotion TTS)领域,随着模型能力的不断提升,如 ModelScope 的 Sambert-Hifigan 等端到端架构已能生成高度自然、富有表现力的…

作者头像 李华
网站建设 2026/4/12 4:21:34

SystemVerilog面向对象入门必看:零基础指南

从零开始掌握SystemVerilog面向对象编程:写给验证工程师的第一课你有没有遇到过这种情况——写一个简单的激励生成器,结果随着需求变化,代码越来越臃肿;改一处逻辑,其他测试全崩了;不同团队写的模块根本没法…

作者头像 李华
网站建设 2026/4/1 2:14:16

如何用Sambert-HifiGan为智能洗衣机生成洗涤建议

如何用Sambert-HifiGan为智能洗衣机生成洗涤建议 引言:让家电“会说话”——语音合成在智能洗衣机中的创新应用 随着智能家居生态的不断演进,用户对交互体验的要求已从“能用”升级为“好用、贴心”。传统洗衣机仅通过LED屏或APP提示操作流程&#xff0c…

作者头像 李华