用与非门实现8位加法器:零基础也能懂的方案

从与非门到8位加法器:用最简单的逻辑构建计算核心

你有没有想过,一台计算机是怎么做加法的?
它不像我们列竖式那样进位、相加、写下结果。它的“大脑”里没有数字,只有高电平和低电平——也就是1和0。而实现这一切运算的起点,可能仅仅是一个小小的与非门(NAND)

更惊人的是:只用一种逻辑门,就能造出能算两个8位数之和的电路。听起来像天方夜谭?但这不仅是理论可行,更是数字电路设计中极具教学价值的经典实践。

今天我们就来走一遍这条“从零开始”的路径:如何仅用与非门,一步步搭建出一个完整的8位加法器。即使你刚接触数字电路,也能看懂每一步背后的逻辑。


为什么选与非门?因为它“万能”

在所有逻辑门中,与非门是个特殊的存在——它是“功能完备集”,意味着:任何布尔函数,都可以只用与非门实现

这就像数学中的质数,或者乐高积木里的基础块。只要给你足够的与非门,你就能搭出非门、与门、或门、异或门……甚至整个CPU。

与非门长什么样?

它的逻辑很简单:

只有当所有输入为1时,输出才为0;否则输出为1。

真值表如下:

ABY
001
011
101
110

对应的布尔表达式是:
$$
Y = \overline{A \cdot B}
$$

别小看这个简单规则。正是这种“先与后非”的结构,让它具备了重构一切逻辑的能力。


第一步:把其他逻辑门“变”出来

既然只能用与非门,那我们就得想办法用它模拟出我们需要的所有基本逻辑单元。

非门(NOT)怎么实现?

很简单:把两个输入连在一起

assign Y = ~(A & A); // 等价于 ~A

电路连接上,就是把信号A同时接到与非门的两个输入端。如果A=1,输出就是0;A=0,输出就是1——完美实现取反。

成本:1个NAND门


与门(AND)呢?

我们知道:
$$
A \cdot B = \overline{\overline{A \cdot B}}
$$

所以只要对NAND(A,B)的结果再取一次反,就得到了原始的“与”。

也就是说:
1. 第一个NAND得到 $\overline{A\cdot B}$
2. 第二个NAND当作反相器,将其反转回来

成本:2个NAND门


或门(OR)也能做吗?

可以!利用德摩根定律:
$$
A + B = \overline{\bar{A} \cdot \bar{B}}
$$

步骤如下:
1. 用两个NAND分别生成 $\bar{A}$ 和 $\bar{B}$(各自接成反相器)
2. 把这两个反相信号送入第三个NAND
3. 输出即为 $A+B$

成本:3个NAND门


最关键的:异或门(XOR)

这是加法器的灵魂。因为一位二进制加法的本质就是异或运算。

回忆一下:
- $0+0=0$ → $0⊕0=0$
- $0+1=1$ → $0⊕1=1$
- $1+0=1$ → $1⊕0=1$
- $1+1=0$(进位)→ $1⊕1=0$

所以和(Sum) = $A ⊕ B$,而进位(Carry) = $A·B$

但XOR不能直接由单个NAND实现,需要巧妙构造。

标准NAND-based XOR使用4个门:

wire w1, w2, w3; nand(w1, a, b); // w1 = ~(a & b) nand(w2, a, w1); // w2 = ~(a & ~(a&b)) = ~a when b=1 nand(w3, b, w1); // w3 = ~(b & ~(a&b)) = ~b when a=1 nand(sum, w2, w3); // sum = ~(w2 & w3) = a ^ b

虽然推导略复杂,但你可以把它当成一个“黑盒模板”记住:4个2输入NAND门 = 1个XOR

成本:4个NAND门


第二步:构建最小加法单元——半加器

现在我们有了XOR和AND,就可以做一个最简单的加法器:半加器(Half Adder)

它处理两个1位数相加,输出和(Sum)与进位(Carry):

ABSumCarry
0000
0110
1010
1101

公式清晰:
- Sum = $A ⊕ B$ → 用4个NAND
- Carry = $A·B$ → 用2个NAND(第一个做NAND,第二个做反相)

不过注意!我们在XOR部分已经计算了 $\overline{A·B}$,可以直接拿来作为Carry路径的第一级输入,省去重复计算。

💡优化技巧:共享中间信号 $\overline{A·B}$,可将总门数压缩至5个NAND门


第三步:升级为全加器,支持进位传递

半加器有个致命缺陷:它不知道来自低位的进位。要构成多位加法,必须使用全加器(Full Adder)

全加器有三个输入:A、B、Cin(进位输入),输出Sum和Cout。

其逻辑关系为:
- Sum = $A ⊕ B ⊕ C_{in}$
- Cout = $AB + BC_{in} + AC_{in}$

我们可以用两个半加器来构造:

  1. 先用HA1计算 $A+B$ → 得到局部Sum1 和 Carry1
  2. 再用HA2将Sum1与Cin相加 → 得到最终Sum
  3. 最后用一个或门合并Carry1和新的进位 → 得到Cout

但如果只允许用NAND,就得全部拆解成NAND网络。

下面是推荐的结构化实现方式(基于布尔化简):

module full_adder_nand(input a, input b, input cin, output sum, output cout); wire p, g; // p = A^B, g = A·B wire s1, s2, s3; // 中间信号用于Sum wire c1, c2, c3; // 中间信号用于Carry out // Step 1: 计算 A ^ B → p wire ab_nand, a_ab, b_ab; nand(ab_nand, a, b); nand(a_ab, a, ab_nand); nand(b_ab, b, ab_nand); nand(p, a_ab, b_ab); // Step 2: Sum = p ^ cin wire p_cin_nand, cin_p_nand; nand(p_cin_nand, p, cin); nand(cin_p_nand, cin, p); nand(s1, p, p_cin_nand); nand(s2, cin, cin_p_nand); nand(sum, s1, s2); // Step 3: Carry out = g + (p · cin) // g = A·B wire g_nand; nand(g_nand, a, b); nand(g, g_nand, g_nand); // 取反得 A·B // temp = p · cin wire p_cin_nand_gate, temp; nand(p_cin_nand_gate, p, cin); nand(temp, p_cin_nand_gate, p_cin_nand_gate); // 取反 // Cout = g OR temp wire or_nand1, or_nand2; nand(or_nand1, g, temp); nand(or_nand2, g, temp); nand(cout, or_nand1, or_nand2); endmodule

这段代码完全由nand原语构成,每一行都对应一个物理门连接,适合用于FPGA底层建模或教学演示。

📌总结资源消耗
- Sum路径:约6个NAND
- Carry路径:约4~5个NAND
- 总计:每个全加器约需9~12个2输入NAND门


第四步:拼起来!组成8位加法器

有了全加器,接下来就简单了:串起来就行

采用经典的行波进位结构(Ripple Carry Adder)

FA0 ← FA1 ← FA2 ← ... ← FA7 ↑ ↑ ↑ ↑ A0B0 A1B1 A2B2 A7B7 ↑ ↑ ↑ ↑ Cin=0 C1 C2 C7 → C_out ↓ ↓ ↓ S0 S1 S7

连接规则非常直观:
- 最低位FA0的 Cin 接地(0)
- 每一级的 Cout 连接到下一级的 Cin
- 所有A、B并行输入,所有Sum并行输出
- 最终得到8位和S[7:0]以及最高位进位C8

这就是一个完整的8位加法器!


实际工程考虑:不只是理论游戏

你说:“现在谁还用手动搭门电路?”
确实,现代FPGA用查找表(LUT)几秒钟就能综合出加法器。但我们坚持用NAND实现,并非为了替代工业方案,而是为了理解本质

但在某些真实场景下,这种方法依然有价值:

✅ 教学实验

高校《数字逻辑》课程常用此项目训练学生:
- 理解组合逻辑设计流程
- 掌握门级抽象与模块化思想
- 动手焊接验证真值表

✅ 老旧设备维修 / 自制CPU

如果你在做一个复古风格的分立元件CPU,手上只有74HC00芯片(每片含4个2输入NAND门),那么这个方案就是救命稻草。

按前面估算:
- 每个FA约10个NAND
- 8位共需约80个NAND
- 使用74HC00(每片4门)→ 需要20片IC

虽然看起来很多,但布局合理的话,一块双面板完全可以容纳。


布局与调试建议

PCB设计要点:

  • 按从右到左(低位到高位)排列FA模块,符合进位传播方向
  • 进位线尽量短且直,避免与其他信号交叉
  • 每片IC旁放置0.1μF陶瓷电容,抑制电源噪声
  • 底层铺完整地平面,提升抗干扰能力

测试方法:

  • 输入:用拨码开关设置A[7:0]和B[7:0]
  • 输出:用8个LED显示Sum,1个LED显示Cout
  • 验证典型情况:
  • 0 + 0 → 0
  • 255 + 1 → 0(溢出,Cout=1)
  • 85 + 85 = 170(0x55 + 0x55 = 0xAA)

局限性与进阶思路

当然,行波进位结构也有明显缺点:速度慢

因为进位要一级一级传递,第7位的结果必须等第6位的Cout稳定后才能计算。对于8位系统,延迟尚可接受;但位数再多就不现实了。

如何提速?试试超前进位加法器(CLA)

CLA的核心思想是:提前预测每一位的进位,而不必等待前一级。

它引入两个新信号:
-Generate(G):本位自己产生进位(如A=B=1)
-Propagate(P):本位会传递进位(如A≠B)

然后通过并行逻辑直接计算各级Cin,大幅缩短延迟。

有趣的是:这些PG逻辑同样可以用NAND门实现。只不过结构更复杂,需要更多门和布线。

但对于追求性能的设计来说,这是必经之路。


回到初心:简单规则如何造就复杂智能

当你站在今天的高度看计算机,它似乎无比复杂:多核CPU、GPU、AI加速器……但追根溯源,它们的算术核心,依然是由一个个最基本的逻辑门组成的加法器。

而这一切,都可以从一个小小的与非门开始。

这个项目的意义,从来不是为了取代现代芯片设计方法,而是提醒我们:

复杂的计算能力,本质上源于最简单的规则重复组合。

掌握这一点,你就掌握了通往现代计算机体系结构的大门钥匙。

无论你是初学者还是资深工程师,亲手走过这一趟“从NAND到Adder”的旅程,都会让你对“硬件如何执行指令”这件事,有更深的理解。


如果你正在学习数字电路、准备电子竞赛,或者只是好奇计算机内部是如何工作的,不妨试着在面包板上搭一个半加器,再一步步扩展到8位。你会发现,那些闪烁的LED背后,藏着人类智慧最纯粹的光芒。

欢迎在评论区分享你的实现过程或遇到的问题,我们一起探讨!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1146296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vivado安装教程2018一文说清:适用于高校科研场景

Vivado 2018 安装全指南:为高校科研打造稳定可靠的 FPGA 开发环境 在今天的高校科研实验室里,FPGA 已不再是电子工程系的“专属玩具”,而是横跨人工智能、信号处理、高性能计算和嵌入式系统等多个前沿方向的核心工具。作为 Xilinx&#xff0…

一文说清SiFive平台上RISC-V指令集的异常处理机制

深入SiFive平台:RISC-V异常处理机制的实战解析你有没有遇到过这样的情况?在SiFive的开发板上跑一个裸机程序,突然来了个中断,系统却“卡死”了;或者调试时发现mepc指向了一条根本没执行过的指令?又或许你在…

并行计算加速矩阵乘法:算法优化实战案例

如何让矩阵乘法快10倍?一个真实高性能计算优化案例你有没有遇到过这样的场景:训练一个深度学习模型,光是前向传播就卡了几十秒;做一次图像卷积,等结果等到泡了三杯咖啡;跑个科学模拟,一晚上都算…

pcb原理图中高频滤波电路的配置操作指南

高频滤波电路设计实战:从原理图到电源完整性的关键一步你有没有遇到过这样的情况?FPGA莫名其妙重启、ADC采样数据“跳舞”、Wi-Fi发射杂散超标……排查数天,最后发现根源竟然是电源上一颗没放对位置的0.1μF电容?在高速电子系统中…

图解说明usb_burning_tool固件定制中的关键参数设置

深入剖析usb_burning_tool刷机工具:从参数配置到量产落地的实战指南 你有没有遇到过这样的场景? 产线上的TV Box批量烧录,几十台设备同时连接PC,结果一半“脱机”,三分之一写入失败,还有几台直接变砖……排…

OpenMV与霍尔传感器测速的硬件设计实例

用OpenMV和霍尔传感器打造高鲁棒性测速系统:从原理到实战的完整设计指南在智能小车、AGV导航或工业传送带监控中,速度是控制系统的生命线。传统的编码器虽然精度高,但在粉尘、油污环境下容易失效;纯视觉方案又受限于光照变化与计算…

电路仿真软件仿真多级放大电路的实战技巧

多级放大电路仿真:从“试出来”到“算出来”的实战精要你有没有遇到过这样的场景?一个三级放大器原理图画得漂亮,参数计算也看似合理,结果一上电——输出波形满屏振铃,甚至直接自激成高频振荡。拆电阻、换电容、改布局…

面向大规模部署的OpenBMC定制化方案详解

从单点到集群:如何用 OpenBMC 构建大规模服务器的“智能管家”你有没有遇到过这样的场景?数据中心里上千台服务器,突然有一批机器集体掉电。运维团队兵分三路:有人冲向机房查看物理状态,有人登录 KVM 排查电源信号&…

从CPU设计看arm架构和x86架构:小白指南级解析

从CPU设计看Arm与x86:一场关于效率与性能的底层博弈你有没有想过,为什么你的手机用的是Arm芯片,而台式机却离不开Intel或AMD?为什么苹果能把M1芯片塞进MacBook Air里,连续播放20小时视频还不烫手,而同样性能…

桥式整流电路设计要点:整流二极管实战案例

从一颗二极管说起:桥式整流电路的实战设计陷阱与避坑指南你有没有遇到过这样的情况——电源板莫名其妙“冒烟”,拆开一看,桥堆炸了?或者设备在高温环境下频繁重启,排查半天发现是整流环节出了问题?别急&…

image2lcd导出配置详解:适用于单色屏的参数设置

图像转码不翻车:搞懂 image2lcd 的单色屏配置逻辑你有没有遇到过这种情况——辛辛苦苦在 Photoshop 里设计好一个 Logo,导入image2lcd转成数组,烧进 STM32 后却发现 OLED 上显示的图像是上下颠倒、左右反了、还缺胳膊少腿?别急&am…

频率响应约束下的滤波器设计操作指南

在频率响应约束下打造“精准滤波”:从理论到实战的完整设计路径你有没有遇到过这样的问题?明明设计了一个低通滤波器,理论上能有效抑制高频噪声,但实测时却发现音频信号出现了相位失真、立体声不同步;或者在数据采集系…

快速理解继电器驱动电路设计关键步骤

从零搞懂继电器驱动电路:工程师避坑实战指南你有没有遇到过这种情况——明明代码写得没问题,MCU也正常输出高电平,可继电器就是“抽风”:时而吸合、时而不吸;更糟的是,某天突然烧了单片机IO口,甚…

vivado ip核在Zynq-7000上的应用完整示例

手把手教你用Vivado IP核点亮Zynq-7000系统:从零搭建软硬协同嵌入式平台你有没有过这样的经历?在FPGA项目中,为了实现一个简单的寄存器读写或中断响应,却不得不花上几天时间手写AXI接口状态机、调试地址解码逻辑,最后还…

32位应用打印驱动宿主选择:WDM vs. 用户模式全面讲解

32位应用打印驱动宿主怎么选?WDM还是用户模式,一文讲透!一个老问题:为什么32位应用还在用?你可能觉得:“都2024年了,谁还用32位程序?”但现实是——医疗设备的操作界面、工厂产线的控…

边沿触发D触发器电路图设计要点:延迟优化方案

如何让D触发器跑得更快?边沿触发电路的延迟优化实战解析在现代数字芯片设计中,我们总在和时间赛跑——系统主频越高,算力越强。但你有没有想过,真正决定这个“时钟极限”的,往往不是复杂的运算单元,而是最基…

Altium Designer 20快速入门:新手教程(零基础必备)

从零开始玩转 Altium Designer 20:新手也能画出专业PCB你是不是也曾经看着别人设计的电路板,心里嘀咕:“这玩意儿到底怎么画出来的?”别急。今天我们就来揭开Altium Designer 20的神秘面纱——这个被无数硬件工程师奉为“神兵利器…

面向工业测试的数字频率计设计完整指南

面向工业测试的数字频率计设计:从原理到实战的完整技术解析在电机控制、传感器校准、电力电子监测等工业场景中,频率是衡量系统运行状态的关键指标。一个微小的频率漂移,可能意味着设备即将失稳;一次未捕捉到的脉冲跳变&#xff0…

VHDL课程设计大作业中的矩阵键盘扫描FPGA方案

用FPGA玩转矩阵键盘:从VHDL课程设计到真实系统控制的完整实践 你有没有在做 VHDL课程设计大作业 时,面对一个看似简单的“44按键”却无从下手?明明只是按下一个键,仿真波形里却跳出了七八次触发;扫描逻辑写了一堆&am…

vivado安装教程操作指南:高效配置FPGA设计平台

从零开始搭建FPGA开发环境:Vivado安装避坑全指南 你是不是也曾对着“ vivado安装教程 ”搜索结果翻了好几页,下载了几十GB的安装包,结果点开 xsetup.exe 却一闪而过?又或者好不容易装上了,打开软件却发现找不到自…