news 2026/3/26 5:51:55

加法器初学者教程:使用Verilog实现简单模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
加法器初学者教程:使用Verilog实现简单模型

从零开始设计一个加法器:用Verilog构建你的第一个数字电路

你有没有想过,计算机是怎么做“1+1=2”的?
在软件里这不过是一行代码的事,但在硬件层面,它背后藏着一套精密的逻辑网络。而这一切的起点,就是一个看似简单的模块——加法器

今天,我们就从最基础的全加器出发,一步步用Verilog实现一个四位加法器,并亲手搭建测试平台验证它的功能。无论你是 FPGA 新手、数字电路初学者,还是想补足底层知识的嵌入式开发者,这篇实战教程都会帮你打下坚实的第一块砖。


为什么先学加法器?

在所有算术运算中,加法是最核心的操作。减法可以转化为补码加法,乘法是多次加法的累加,就连除法也离不开它。可以说,现代 CPU 的 ALU(算术逻辑单元)本质上就是围绕加法器构建的

更重要的是,加法器的设计涵盖了数字系统中最关键的几个概念:
- 组合逻辑 vs 时序逻辑
- 模块化与层次化设计
- 信号传播延迟与关键路径
- 进位机制与二进制运算本质

掌握它,你就掌握了理解复杂硬件系统的钥匙。


全加器:加法的基本单元

要实现多位加法,我们得先搞定一位怎么加。

两个二进制位相加,可能产生进位。比如1 + 1 = 10,这里的结果是“0”,同时向高位“进1”。但如果这一位本身已经有一个来自低位的进位呢?所以我们需要处理三个输入:

A、B 和 Cin(输入进位)

输出则是:

Sum(本位和) 和 Cout(输出进位)

这就是所谓的全加器(Full Adder, FA)

它的真值表长这样:

ABCinSumCout
00000
01010
10010
11001
00110
01101
10101
11111

通过卡诺图化简,我们可以得到两个关键表达式:

sum = a ^ b ^ cin; cout = (a & b) | (b & cin) | (a & cin);

是不是很简洁?这就是经典的全加器布尔逻辑。

Verilog 实现:全加器模块

module full_adder ( input a, input b, input cin, output sum, output cout ); assign sum = a ^ b ^ cin; assign cout = (a & b) | (b & cin) | (a & cin); endmodule

这个模块完全由组合逻辑构成,没有时钟、没有状态,输入一变,输出立刻响应。这也是典型的可综合风格:使用assign而非always @(*),清晰直观,综合工具也能高效映射为门级电路。


四位行波进位加法器:把简单模块串起来

现在我们有了“一位加法器”,怎么扩展成能算7 + 9的四位加法器?

答案是:级联四个全加器,让它们像接力赛一样传递进位信号。

最低位先算出自己的和与进位,然后把这个进位交给第二位;第二位再结合自己的两个数继续计算……直到最高位输出最终结果和总进位。

这种结构叫行波进位加法器(Ripple Carry Adder, RCA),虽然慢(因为进位要一级一级传),但胜在结构清晰,非常适合教学和入门实践。

接口定义

我们要设计这样一个模块:

module ripple_carry_adder_4bit ( input [3:0] a, input [3:0] b, input cin, output [3:0] sum, output cout );

输入两个 4 位二进制数ab,还有一个外部进位cin(可用于链式连接或减法补码运算)。输出是 4 位和sum以及总的进位输出cout

结构化建模:模块实例化

接下来就是“搭积木”了:

wire c1, c2, c3; full_adder fa0 (.a(a[0]), .b(b[0]), .cin(cin), .sum(sum[0]), .cout(c1)); full_adder fa1 (.a(a[1]), .b(b[1]), .cin(c1), .sum(sum[1]), .cout(c2)); full_adder fa2 (.a(a[2]), .b(b[2]), .cin(c2), .sum(sum[2]), .cout(c3)); full_adder fa3 (.a(a[3]), .b(b[3]), .cin(c3), .sum(sum[3]), .cout(cout));

每一级都调用前面写好的full_adder模块,中间用wire连接进位信号。这种写法体现了 Verilog 的一大优势:模块化复用

小贴士:FPGA 工具通常会自动优化这些连续赋值逻辑,甚至可能利用专用进位链资源提升性能。


怎么知道它真的对了?来写个 Testbench!

写完设计不仿真,等于白干。

我们需要一个测试平台(Testbench)来驱动输入、观察输出。Testbench 不是可综合代码,它是纯仿真环境下的“虚拟实验室”。

测试平台结构概览

module tb_rca_4bit; reg [3:0] a, b; reg cin; wire[3:0] sum; wire cout; // 实例化被测设计 ripple_carry_adder_4bit uut ( .a(a), .b(b), .cin(cin), .sum(sum), .cout(cout) ); initial begin $monitor("Time=%0t | A=%b, B=%b, Cin=%b | Sum=%b, Cout=%b", $time, a, b, cin, sum, cout); // 测试用例 a = 4'b0011; b = 4'b0101; cin = 0; #10; a = 4'b1111; b = 4'b0001; cin = 0; #10; a = 4'b1010; b = 4'b0110; cin = 1; #10; a = 4'b1111; b = 4'b0001; cin = 1; #10; $finish; end endmodule

我们用了$monitor来实时打印每一时刻的输入输出。每次赋值后延迟#10时间单位,给信号稳定留出时间。

看看输出结果是否合理?

运行仿真后你会看到类似这样的日志:

Time=0 | A=0011, B=0101, Cin=0 | Sum=1000, Cout=0 --> 3 + 5 = 8 ✓ Time=10 | A=1111, B=0001, Cin=0 | Sum=0000, Cout=1 --> 15 + 1 = 16 → 溢出,Cout=1 ✓ Time=20 | A=1010, B=0110, Cin=1 | Sum=0001, Cout=1 --> 10 + 6 + 1 = 17 → 二进制 10001 ✓ Time=30 | A=1111, B=0001, Cin=1 | Sum=0001, Cout=1 --> 15 + 1 + 1 = 17 → 正确带进位加 ✓

每一条都能对应上数学计算,说明我们的设计功能正确!

💡 提示:如果你用的是 EDA Playground 或 ModelSim,还可以打开波形窗口查看sum[3:0]cout的变化过程,更加直观。


加法器不只是“加数”:它还能做什么?

别小看这个模块,它其实是个“多面手”。

1. 构成 ALU 的核心

在简单的 CPU 设计中,只要加上一个多路选择器,就可以用同一个加法器实现:
- 加法(A + B)
- 减法(A - B = A + (~B) + 1)
- 增量操作(A + 1)

只需要控制输入端是否取反、是否置入初始进位即可。

2. 地址生成与循环计数

FPGA 中常用于地址指针递增、DMA 缓冲区索引更新等场景。

3. 数字信号处理

在 FIR 滤波器、累加器、PWM 占空比调节中,都需要频繁进行加法运算。

4. 高级综合(HLS)中的隐式映射

你在 C/C++ 里写c = a + b;,Vivado HLS 或 Intel HLS 工具最终也会把它综合成一个加法器电路。了解其硬件代价,有助于写出更高效的可综合代码。


初学者常见问题与避坑指南

❓ 为什么进位要一级一级传?不能并行吗?

当然可以!这就是超前进位加法器(CLA)的思路——提前预判进位,打破串行依赖。但它代价更高,逻辑更复杂。对于初学者,RCA 是最好的起点。

❓ 输出一直在变,会不会不稳定?

是的!因为这是组合逻辑,输入一改,输出马上跟着变。所以在同步系统中,通常要用寄存器在时钟边沿采样结果,避免毛刺影响。

❓ 我漏写了某个分支,会不会出问题?

会!在always @(*)块中,如果条件不完整,综合工具可能会生成锁存器(latch),导致不可预测行为。但我们用的是assign,不存在这个问题——这也是推荐新手优先使用连续赋值的原因之一。

❓ 能不能做成任意位宽?

完全可以!只需稍作修改:

parameter WIDTH = 4; wire [WIDTH:0] carry; assign carry[0] = cin; generate genvar i; for (i = 0; i < WIDTH; i = i + 1) begin : fa_gen full_adder fa_inst ( .a(a[i]), .b(b[i]), .cin(carry[i]), .sum(sum[i]), .cout(carry[i+1]) ); end endgenerate assign cout = carry[WIDTH];

这样就能支持参数化位宽,真正实现“一次编写,处处复用”。


性能与优化:别忘了硬件的真实世界

虽然 RCA 易于理解和实现,但在高频系统中,它的短板也很明显:

进位链太长 → 关键路径延迟大 → 最高频率受限

例如在一个 32 位 RCA 中,进位必须经过 32 个全加器才能到达最高位,延迟呈线性增长。

如何突破瓶颈?

  • 改用 CLA(Carry Look-Ahead Adder):通过生成函数 G 和传播函数 P 并行计算进位。
  • 使用 FPGA 内建进位链原语:如 Xilinx 的CARRY4,专为快速进位优化,能显著提升性能。
  • 分组先行进位(Group CLA):折中方案,兼顾面积与速度。

但对于学习阶段,先把 RCA 吃透更重要。


写在最后:从加法器出发,走向更远的地方

当你第一次看到3 + 5 = 8被自己写的 Verilog 模块正确计算出来时,那种成就感是无与伦比的。

这不仅仅是一次简单的编码练习,而是你第一次亲手构建了计算世界的基石

下一步你可以尝试:
- 把加法器封装进 ALU,支持加减与逻辑运算;
- 给它加上寄存器,做成一个带流水线的高速加法器;
- 用状态机控制多个加法器协同工作;
- 在真实 FPGA 开发板上跑起来,用 LED 显示结果。

记住:每一个伟大的处理器,都始于一个小小的全加器。

而你现在,已经迈出了那一步。


💬 如果你在仿真中遇到了问题,或者想知道如何将这个加法器集成到更大的系统中,欢迎在评论区留言交流。我们一起把硬件梦想照进现实。

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

企业级GIT安装配置全流程实战

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个企业级GIT安装配置演示项目&#xff0c;包含以下功能&#xff1a;1) 多用户权限配置 2) SSH密钥生成与管理 3) 代理服务器设置 4) 大文件存储(LFS)配置 5) 自动更新策略。…

作者头像 李华
网站建设 2026/3/23 10:13:08

百度网盘解析工具实战指南:突破下载限制的三步解决方案

百度网盘解析工具实战指南&#xff1a;突破下载限制的三步解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘下载速度缓慢而困扰吗&#xff1f;本文将为您…

作者头像 李华
网站建设 2026/3/24 21:19:35

开源TTS新星VibeVoice上线GitCode,镜像免费获取

开源TTS新星VibeVoice上线GitCode&#xff0c;镜像免费获取 在播客、有声书和在线教育内容爆发式增长的今天&#xff0c;一个现实问题摆在创作者面前&#xff1a;如何高效生成自然流畅、多人参与的长时语音内容&#xff1f;人工录制成本高、协调难&#xff0c;而传统文本转语音…

作者头像 李华
网站建设 2026/3/7 12:35:12

手把手实现PetaLinux工业HMI界面开发

手把手实现PetaLinux工业HMI界面开发&#xff1a;从零构建高性能嵌入式人机交互系统在现代工厂的控制室里&#xff0c;一块7英寸触摸屏正实时显示着产线运行状态——温度曲线跃动、报警弹窗闪烁、操作员轻点屏幕切换工单。这背后并非简单的UI展示&#xff0c;而是一整套基于Xil…

作者头像 李华
网站建设 2026/3/25 22:25:15

VibeVoice支持动态调整语速语调参数吗?待开放

VibeVoice&#xff1a;当AI语音从“朗读”走向“对话” 在播客制作人熬夜剪辑双人对谈音频的深夜&#xff0c;在教育机构为千名学员批量生成讲解录音的清晨&#xff0c;一个共同的痛点反复浮现&#xff1a;如何让机器合成的声音不只是“念字”&#xff0c;而是真正像人在交流&a…

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

微软开源超强TTS模型VibeVoice:单次生成90分钟多角色音频

微软开源超强TTS模型VibeVoice&#xff1a;单次生成90分钟多角色音频 在播客、有声书和虚拟访谈内容井喷的今天&#xff0c;一个现实问题正困扰着内容创作者&#xff1a;如何让AI合成的声音不仅自然流畅&#xff0c;还能稳定地“说”上一整小时&#xff0c;甚至多人交替对话而不…

作者头像 李华