news 2026/4/15 6:11:09

半加器设计实战:Verilog语言基础应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
半加器设计实战:Verilog语言基础应用

从零开始设计一个半加器:Verilog入门的“Hello World”

你有没有想过,计算机是怎么做加法的?
不是打开计算器点两下那种——而是真正从硬件底层,用一个个晶体管搭出来的逻辑电路,如何把1 + 1算出10(二进制)?

答案就藏在一个看似简单的电路里:半加器(Half Adder)。它虽小,却是所有现代处理器中算术运算的起点。而我们今天要做的,就是亲手用Verilog把它“造”出来。

这就像编程里的 “Hello, World!” —— 不是为了炫技,而是为了打通第一环:把你的想法,变成可运行、可验证的数字系统


为什么是半加器?因为它足够简单,又足够重要

在数字电路的世界里,一切复杂的运算都可以拆解成最基本的门电路组合。而两个比特相加,是最基础的算术操作之一。

半加器只做一件事:输入两个一位二进制数 A 和 B,输出它们的和(Sum)与进位(Carry)。没有来自低位的进位输入,所以叫“半”加器。

它的真值表非常清晰:

ABSumCarry
0000
0110
1010
1101

观察一下你会发现:
-Sum = A ⊕ B—— 异或运算,相同为0,不同为1;
-Carry = A & B—— 与运算,只有都为1时才产生进位。

也就是说,一个异或门 + 一个与门,就能实现全部功能。结构极简,延迟极低,非常适合用来学习 Verilog 的基本语法和设计流程。

更重要的是:全加器、多位加法器、ALU……甚至CPU中的加法单元,都是从这里一步步搭建起来的。它是积木的第一块。


用 Verilog 描述一个半加器:从模块定义到逻辑实现

Verilog 是一种硬件描述语言(HDL),它的思维方式和软件编程完全不同——你不是在“写程序”,而是在“画电路”。

我们先来写最核心的部分:half_adder模块。

// half_adder.v module half_adder ( input wire A, input wire B, output wire Sum, output wire Carry ); assign Sum = A ^ B; // 异或生成和 assign Carry = A & B; // 与运算生成进位 endmodule

关键点解析:

  • module ... endmodule是 Verilog 的基本封装单位,相当于 C 语言中的函数,但它是并行存在的实体。
  • 所有端口都声明为wire类型,因为这是组合逻辑,信号由外部驱动或直接连线传递。
  • 使用assign进行连续赋值,这意味着只要 A 或 B 发生变化,Sum 和 Carry 就会立即重新计算——完全对应物理电路中的门传播行为。
  • 没有时钟、没有状态、没有顺序执行——这就是典型的纯组合逻辑

这段代码简洁得几乎不能再简化了,但它已经完整地描述了一个真实的数字电路。接下来的问题是:它真的能工作吗?


验证才是硬道理:编写 Testbench 进行功能仿真

在硬件设计中,“跑一下看看”远比“我觉得应该对”重要得多。我们必须通过测试平台(Testbench)来穷举所有输入情况,确保逻辑正确。

// tb_half_adder.v module tb_half_adder; reg A, B; // 测试平台控制输入,使用 reg 类型 wire Sum, Carry; // 被测模块输出,保持 wire // 实例化被测模块(uut: Unit Under Test) half_adder uut ( .A(A), .B(B), .Sum(Sum), .Carry(Carry) ); initial begin $display("🔍 开始半加器功能测试..."); $monitor("A=%b, B=%b | Sum=%b, Carry=%b", A, B, Sum, Carry); // 遍历所有输入组合 #10 A = 0; B = 0; #10 A = 0; B = 1; #10 A = 1; B = 0; #10 A = 1; B = 1; $display("✅ 测试完成!"); $finish; end endmodule

测试要点说明:

  • reg用于测试平台内部变量,可以在initial块中主动赋值;
  • $monitor会在每次相关信号变化时自动打印一行,省去反复写$display
  • #10表示延迟 10 个时间单位(比如 ns),模拟输入切换的时间间隔;
  • 使用.A(A)这样的命名连接方式,避免因端口顺序错误导致接错线——这是一个非常实用的最佳实践。

运行仿真后,你会看到这样的输出:

🔍 开始半加器功能测试... A=0, B=0 | Sum=0, Carry=0 A=0, B=1 | Sum=1, Carry=0 A=1, B=0 | Sum=1, Carry=0 A=1, B=1 | Sum=0, Carry=1 ✅ 测试完成!

每一行都与真值表完全吻合。恭喜你,第一个数字电路已经成功设计并验证!


别小看这个“玩具”:它背后藏着哪些工程思维?

虽然半加器本身不会单独出现在实际芯片中,但它的设计过程浓缩了数字系统开发的核心方法论:

✅ 模块化设计:每个功能独立封装

half_adder可以作为一个黑盒被其他模块调用。比如构建全加器时,就可以复用它作为子模块。这种“搭积木”的思想是大型IC设计的基础。

✅ 组合逻辑建模:理解assignalways的区别

对于简单逻辑,优先使用assign。它直观、可综合、不易误生成锁存器(latch)。而always @(*)虽然也能实现,但在条件分支不完整时可能引入意外的时序元件。

⚠️ 新手常见坑:在always块中遗漏 else 分支 → 综合工具认为你需要记忆状态 → 自动生成 latch → 功能异常!

✅ 可综合性原则:写的代码必须能变成交互的电路

#5这样的延迟语句,在仿真中有用,但在综合阶段会被忽略。因此不能依赖它来控制逻辑行为。真正的时序控制必须靠时钟和触发器完成。

✅ 全覆盖测试:别放过任何一个输入组合

哪怕只有4种情况,也要全部测一遍。尤其是在面试或项目评审中,缺少边界测试往往是扣分项。


它能用在哪?不只是教学演示

也许你会问:“现实中谁会单独用半加器?”
确实不会。但它代表了一类典型的设计模式,应用场景其实不少:

🧩 构建更复杂的加法器

  • 多个半加器可以级联成串行进位加法器(Ripple Carry Adder);
  • 结合或门升级为全加器(Full Adder),支持进位输入;
  • 再进一步可实现超前进位加法器(CLA),提升运算速度。

🛠 FPGA 快速原型验证

在FPGA开发初期,可以用半加器验证:
- 工具链是否正常(综合、布局布线、下载);
- IO引脚分配是否正确;
- 时钟资源能否驱动简单逻辑。

这是一种“最小可行电路”,快速定位环境问题。

📚 教学与笔试高频考点

无论是高校课程、研究生考试,还是IC公司面试,半加器+全加器都是必考内容。掌握其原理和代码实现,是进入数字前端设计领域的敲门砖。


下一步你可以怎么玩?

别停在这里。掌握了半加器,你就拿到了通往更复杂世界的大门钥匙。接下来不妨试试这些挑战:

🔹 挑战1:把半加器改造成全加器

增加一个cin输入,支持来自低位的进位,并更新 Sum 和 Cout 的逻辑表达式。

提示:
- Sum = A ⊕ B ⊕ Cin
- Cout = (A & B) | (Cin & (A ^ B))

🔹 挑战2:用半加器构建全加器

尝试用两个半加器和一个或门来实现全加器——这是经典的结构复用技巧。

🔹 挑战3:在FPGA上点亮LED

将半加器实例化到顶层模块,连接按键作为输入,LED显示 Sum 和 Carry。亲眼看到硬件响应你的代码,那种成就感无可替代。

🔹 挑战4:分析时序路径

使用 Vivado 或 Quartus 查看综合后的网表和时序报告,观察从输入到输出的延迟是多少?有没有建立/保持时间违例?


写在最后:每一个伟大系统,都始于最简单的逻辑

半加器很小,小到只需要两行代码就能描述清楚。
但它很重要,重要到每一块芯片里都有它的“后代”。

通过这次实践,你不仅学会了如何用 Verilog 写一个模块、如何写测试平台、如何验证功能,更重要的是建立了硬件思维

我不是在写代码,我是在构造一个会“工作”的东西。

而这,正是数字系统设计的魅力所在。

如果你正在学习 FPGA、准备转行 IC 设计,或者只是对底层技术充满好奇,请记住:
不要跳过这些“简单”的例子
正是它们,构成了你未来驾驭复杂系统的底气。

现在,轮到你动手了——
去运行一次仿真,去看一眼波形图,去感受那个1 + 1 = 10的瞬间。

欢迎在评论区分享你的第一次仿真结果,或者提出你在实现过程中遇到的问题。我们一起把这块“第一块积木”,稳稳地立起来。

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

AI助力Angular开发:自动生成组件与服务的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Angular 15项目,包含用户管理模块。需要:1.使用AI生成用户列表组件,带分页和排序功能 2.自动创建用户服务,包含CRUD操作方法…

作者头像 李华
网站建设 2026/4/15 6:11:03

用DRISSIONPAGE快速构建网页自动化原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 使用DRISSIONPAGE快速开发一个网页自动化原型,能够演示核心业务流程。例如:自动填写并提交表单,验证响应结果。要求代码结构清晰,便…

作者头像 李华
网站建设 2026/4/14 7:33:47

AI助手教你5分钟搞定SQL Server安装

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个自动化SQL Server安装助手,功能包括:1.自动检测系统环境是否符合安装要求 2.根据用户选择版本(2019/2022)生成对应安装脚本 3.自动安装必要依赖项 …

作者头像 李华
网站建设 2026/4/8 12:18:25

零基础学会2026年最潮花式字体设计

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个交互式教程应用,分步骤引导用户完成第一个花式字体设计:1) 选择基础字体 2) 添加特效(阴影、渐变等)3) 调整字形 4) 导出使…

作者头像 李华
网站建设 2026/4/14 6:33:43

HEXSTRIKE入门:5分钟创建你的第一个六边形地图

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个面向新手的HEXSTRIKE教学项目:1. 最简六边形网格渲染 2. 鼠标交互高亮六边形 3. 显示六边形坐标信息 4. 包含详细注释的代码 5. 分步骤教程文档。使用最简化的…

作者头像 李华
网站建设 2026/3/31 15:53:55

传统刷题vsAI辅助:Python面试准备效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个Python面试准备效率对比工具,要求:1. 实现传统刷题模式(手动编码调试);2. AI辅助模式(自动生成解答…

作者头像 李华