基于与或非门的8位加法器构建:系统学习教程

从零搭建8位加法器:用与或非门点亮第一个“进位波纹”

你有没有想过,一个简单的1 + 1 = 2在计算机底层是如何实现的?不是调用库函数,也不是靠CPU指令——而是由最基础的逻辑门一步步“推”出来的。今天我们就来干一件“原始”但极其硬核的事:只用与门(AND)、或门(OR)、非门(NOT),从头构建一个能完成两个8位二进制数相加的电路。

这不仅是数字电路课的经典实验,更是一次对计算本质的深度探索。当你亲手让八个全加器串联起来,看着进位信号像波纹一样从低位传到高位时,那种“原来如此”的顿悟感,是任何高级语言都给不了的。


全加器:一切算术的起点

所有复杂运算,归根结底都是加法。而加法的最小单元,就是全加器(Full Adder, FA)

它有三个输入:
- A 和 B:两个要相加的一位二进制数;
- Cin:来自更低一位的进位。

输出两个结果:
- S:本位的和;
- Cout:是否向更高一位产生进位。

比如当 A=1、B=1、Cin=0 时,结果是 S=0,Cout=1 —— 就像十进制里 5+5=10,个位归零,向十位进一。

不用异或门,也能实现异或?

很多教程直接写S = A ^ B ^ Cin,简洁明了。但在真实硬件中,如果你手头只有与、或、非三种门(比如你在用74HC系列搭电路),那就得想办法“造出”异或功能。

我们知道:
$$
A \oplus B = (\neg A \cdot B) + (A \cdot \neg B)
$$
扩展到三位异或虽然复杂些,但依然可以通过乘积项之和的方式表达。于是我们可以把Sum 输出看作四个最小项的或运算

条件对应逻辑表达式
A=0, B=0, Cin=1¬A · ¬B · Cin
A=0, B=1, Cin=0¬A · B · ¬Cin
A=1, B=0, Cin=0A · ¬B · ¬Cin
A=1, B=1, Cin=1A · B · Cin

把这些项“或”起来,就能得到 S。

至于 Cout,它的生成条件更直观:只要任意两位为1,就可能产生进位。最终表达式为:
$$
C_{out} = A \cdot B + C_{in} \cdot (A \oplus B)
$$
但我们不能用 ⊕,所以也得拆成基本门组合。

Verilog 实现:还原门级细节

下面这段代码完全避开 XOR 操作符,纯粹使用 AND/OR/NOT 构建全加器逻辑:

module full_adder( input A, input B, input Cin, output S, output Cout ); wire not_A, not_B, not_Cin; assign not_A = ~A; assign not_B = ~B; assign not_Cin = ~Cin; // Sum = A'B'Cin + A'BCin' + AB'Cin' + ABCin assign S = (not_A & not_B & Cin) | (not_A & B & not_Cin) | (A & not_B & not_Cin) | (A & B & Cin); // Carry: 分解为多个产生进位的情况 assign Cout = (A & B) | (B & Cin) | (A & Cin); endmodule

等等,Cout 怎么变简单了?

没错!前面我们写的布尔式可以进一步化简。原始形式(A·B) + (Cin·(A⊕B))展开后其实等价于(A·B) + (A·Cin) + (B·Cin)—— 这正是经典的“多数表决”逻辑:三者中有两个为1,则输出1。

这个优化不仅减少了门数量,还降低了延迟。你会发现,在教学中从真值表推导公式只是第一步,真正的工程思维在于如何简化与重构。


把单比特变成8位:串行进位的艺术

有了全加器,下一步就是把它复制八次,连成一条链。这就是所谓的串行进位加法器(Ripple Carry Adder)

想象一下:第0位开始计算,产生一个进位信号 C1;这个 C1 必须稳定下来,才能作为第1位的输入;接着第1位算完,又传出 C2……一直到第7位输出最终的 Cout。

整个过程就像多米诺骨牌,每一块都要等前一块倒下才开始行动。

结构清晰,代价明显

这种结构的最大优点是模块化强、易于理解。你看它的 Verilog 实现几乎是“复制粘贴”式的整齐:

module ripple_carry_adder_8bit( input [7:0] A, input [7:0] B, input Cin, output [7:0] S, output Cout ); wire [7:0] carry; full_adder fa0 (.A(A[0]), .B(B[0]), .Cin(Cin), .S(S[0]), .Cout(carry[0])); full_adder fa1 (.A(A[1]), .B(B[1]), .Cin(carry[0]), .S(S[1]), .Cout(carry[1])); full_adder fa2 (.A(A[2]), .B(B[2]), .Cin(carry[1]), .S(S[2]), .Cout(carry[2])); full_adder fa3 (.A(A[3]), .B(B[3]), .Cin(carry[2]), .S(S[3]), .Cout(carry[3])); full_adder fa4 (.A(A[4]), .B(B[4]), .Cin(carry[3]), .S(S[4]), .Cout(carry[4])); full_adder fa5 (.A(A[5]), .B(B[5]), .Cin(carry[4]), .S(S[5]), .Cout(carry[5])); full_adder fa6 (.A(A[6]), .B(B[6]), .Cin(carry[5]), .S(S[6]), .Cout(carry[6])); full_adder fa7 (.A(A[7]), .B(B[7]), .Cin(carry[6]), .S(S[7]), .Cout(carry[7])); assign Cout = carry[7]; endmodule

但问题也很现实:速度慢

假设每个全加器的进位传播延迟是 50ns(在74HC逻辑中很常见),那么整个8位加法器最坏情况下的延迟就是 8 × 50ns =400ns。这意味着最高工作频率不超过 2.5MHz —— 对现代系统来说几乎不可接受。

但这恰恰让我们看清了一个关键设计权衡:面积 vs. 速度。RCA 占用资源少、结构规整,适合低速控制、教学演示或资源极度受限的场景;而追求性能的地方,则必须引入超前进位等高级结构。


动手实践:面包板上的“微型ALU”

理论讲完,该接线了。

你可以用以下芯片在面包板上搭建整个系统:

功能芯片型号类型
与门74HC08四路2输入AND
或门74HC32四路2输入OR
非门74HC04六路反相器

每个全加器大约需要:
- 2个与门(用于生成部分乘积)
- 1个或门(合并进位)
- 若干非门(取反输入)

总共八组,外加一些连接线和去耦电容。

实际搭建建议

  1. 电源处理:每块IC旁边放一个0.1μF陶瓷电容,接地脚附近走短线,防止开关噪声引发误触发。
  2. 输入设置:用 DIP 拨码开关提供 A[7:0] 和 B[7:0],通过上拉电阻确保高电平稳定。
  3. 输出显示:和值 S[7:0] 接 LED 或七段数码管驱动(如74HC4511),Cout 单独接红灯表示溢出。
  4. 初始进位 Cin:通常接地(0),但如果想做减法,可以把 Cin 接 1,并将 B 取反(补码机制)。
  5. 测试点预留:把 carry[0] 到 carry[7] 引出来,方便用示波器观察进位波形传播。

当你拨动开关,按下复位键,LED依次亮起,最后一位突然翻转并点亮 Cout 灯时——那一刻你会真切感受到:这不是魔法,是逻辑的力量


教学之外:为什么还要学这些“过时”的东西?

有人问:现在谁还用手搭逻辑门?FPGA 一行代码搞定的事,何必这么麻烦?

答案是:因为理解底层,才能驾驭高层

  • 当你在 Verilog 中写下assign sum = a + b;,综合工具会自动选择最优结构(可能是CLA或混合结构)。但如果你不懂进位传播的本质,就无法分析时序报告中的关键路径。
  • 当你的 FPGA 设计跑不到预期频率,问题很可能出在加法器这类组合逻辑上。你知道该怎么加流水线吗?怎么切分进位组?
  • 在抗辐射、航天或定制ASIC领域,工程师仍需手动绘制门级网表。那时候,你靠的就是对基本单元的深刻理解。

更重要的是,这个项目教会你一种思维方式:从原子单元出发,逐层构建复杂系统。这是所有系统工程的核心方法论。


更进一步的可能性

一旦你掌握了 RCA,就可以尝试升级:

  • 加入超前进位逻辑:用 P/G(Generate/Propagate)信号提前预测进位,大幅缩短延迟。
  • 改为同步设计:加上时钟和寄存器,把组合逻辑封装成时序模块,提升稳定性。
  • 扩展为 ALU:增加控制信号,支持减法、与、或、异或等操作,真正做出一个简易算术逻辑单元。
  • 移植到 FPGA:用 Vivado 或 Quartus 综合,查看资源占用和时序分析结果,对比手工优化与工具优化的差异。

甚至有人用纯74系列芯片做出了完整的8位CPU(比如 Ben Eater 的经典项目)。他们的第一步,就是这样一个基于与或非门的加法器。


写在最后:每一个工程师的“成人礼”

回到最初的问题:为什么要用最笨的方法做一个加法器?

因为它逼你停下来思考每一根线、每一个门的作用。它让你明白,计算机不是天生就会算数的黑箱,而是由一个个确定性的逻辑门构成的精密机器。

当你第一次看到自己搭建的电路正确输出255 + 1 = 0并点亮溢出灯时,那种成就感,堪比写出第一个“Hello World”。

而这,正是每一位硬件工程师成长路上不可或缺的“成人礼”。

如果你正在学习数字电路、准备参加电子竞赛,或者只是想找回动手的乐趣——不妨今晚就打开仿真软件,或者拿起焊台,从一个与门开始,走出属于你的第一条进位链。

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

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

相关文章

PDF-Extract-Kit布局检测实战:精准识别文档结构的完整教程

PDF-Extract-Kit布局检测实战:精准识别文档结构的完整教程 1. 引言 1.1 文档智能提取的技术背景 在数字化转型加速的今天,PDF作为最广泛使用的文档格式之一,承载着大量学术论文、技术报告、合同文件等关键信息。然而,传统PDF解…

PDF-Extract-Kit学术合作:研究论文中的数据提取方法

PDF-Extract-Kit学术合作:研究论文中的数据提取方法 1. 引言:PDF智能提取的科研痛点与解决方案 在学术研究过程中,大量有价值的信息以PDF格式存在于论文、报告和书籍中。然而,传统手动复制粘贴的方式不仅效率低下,且…

18.C++入门:stack和queue|priority_queue|容器适配器|deque

stack的介绍和使用 stack的介绍 stack的文档介绍j stack的使用 函数说明接口说明stack()构造空的栈empty()检测 stack 是否为空size()返回 stack 中元素的个数top()返回栈顶元素的引用push()将元素 val 压入 stack 中pop()将 stack 中尾部的元素弹出 155. 最小栈 - 力扣&a…

解决JLink驱动下载后固件降级的操作方法

JLink驱动下载后固件降级?别慌,手把手教你恢复并彻底规避风险 在嵌入式开发的世界里,J-Link几乎是每个工程师的“老伙计”。它速度快、兼容性强、支持芯片广,是调试ARM Cortex-M系列MCU的首选工具。但即便是再可靠的设备&#xf…

PDF-Extract-Kit公式检测优化:小尺寸公式识别

PDF-Extract-Kit公式检测优化:小尺寸公式识别 1. 技术背景与问题提出 在学术文档、科研论文和教材中,数学公式的准确提取是实现文档数字化的关键环节。PDF-Extract-Kit作为一款由科哥二次开发的PDF智能提取工具箱,集成了布局检测、公式检测…

从商业API到自建:HY-MT1.5翻译系统迁移指南

从商业API到自建:HY-MT1.5翻译系统迁移指南 在当前全球化业务快速发展的背景下,高质量、低延迟的翻译能力已成为众多企业不可或缺的技术基础设施。长期以来,开发者依赖 Google Translate、DeepL 等商业 API 提供翻译服务,虽然集成…

PDF-Extract-Kit实战:科研论文参考文献提取系统搭建

PDF-Extract-Kit实战:科研论文参考文献提取系统搭建 1. 引言 1.1 科研文档处理的痛点与挑战 在科研工作中,大量时间被消耗在文献整理、数据提取和格式转换上。传统方式依赖手动复制粘贴,不仅效率低下,还容易出错。尤其面对包含…

PDF-Extract-Kit OCR优化:低质量扫描件识别

PDF-Extract-Kit OCR优化:低质量扫描件识别 1. 引言:挑战与需求背景 在实际文档数字化过程中,我们经常面临一个普遍而棘手的问题——低质量扫描件的文本提取准确率低下。这类文档通常来源于老旧设备扫描、纸质文件褪色、光照不均或压缩过度…

PDF-Extract-Kit性能对比:不同硬件配置下的表现

PDF-Extract-Kit性能对比:不同硬件配置下的表现 1. 引言 1.1 技术背景与选型需求 在当前AI驱动的文档智能处理领域,PDF内容提取已成为科研、教育、出版等多个行业的重要基础能力。传统OCR工具虽能完成基本文字识别,但在面对复杂版式、数学…

PDF-Extract-Kit审计追踪:文档处理记录保存

PDF-Extract-Kit审计追踪:文档处理记录保存 1. 引言 1.1 技术背景与业务需求 在现代企业级文档处理系统中,可追溯性和操作透明度已成为合规性与质量控制的核心要求。尤其是在金融、医疗、科研等对数据完整性高度敏感的领域,任何自动化处理…

PDF-Extract-Kit实战:批量处理扫描文档文字提取教程

PDF-Extract-Kit实战:批量处理扫描文档文字提取教程 1. 引言 在数字化办公和学术研究中,PDF文档已成为信息传递的主要载体。然而,大量PDF文件以扫描图像形式存在,无法直接编辑或检索内容,给信息提取带来巨大挑战。传…

HY-MT1.5性能优化:GPU资源监控与调优策略

HY-MT1.5性能优化:GPU资源监控与调优策略 随着多语言交流需求的快速增长,高质量、低延迟的翻译模型成为智能应用的核心组件。腾讯开源的混元翻译大模型 HY-MT1.5 系列,凭借其在翻译质量、部署灵活性和功能丰富性上的突出表现,迅速…

科哥PDF-Extract-Kit教程:API接口开发与调用指南

科哥PDF-Extract-Kit教程:API接口开发与调用指南 1. 引言 1.1 背景与目标 在数字化文档处理日益普及的今天,PDF作为最广泛使用的格式之一,承载了大量结构化与非结构化信息。然而,传统PDF解析工具往往难以应对复杂版面、数学公式…

PDF-Extract-Kit入门指南:快速处理第一个PDF文档

PDF-Extract-Kit入门指南:快速处理第一个PDF文档 1. 引言 1.1 学习目标 本文旨在帮助开发者和数据处理人员快速上手 PDF-Extract-Kit —— 一个由科哥二次开发构建的PDF智能提取工具箱。通过本指南,您将掌握: 如何启动WebUI服务各核心功能…

PDF-Extract-Kit专家技巧:高级用户的使用秘籍

PDF-Extract-Kit专家技巧:高级用户的使用秘籍 1. 引言与背景 在处理学术论文、技术文档或扫描资料时,PDF 文件中的非结构化数据提取一直是自动化流程中的关键瓶颈。传统方法依赖手动复制粘贴,效率低且易出错。为此,由科哥二次开…

HY-MT1.5-7B混合语言检测:算法原理与调优

HY-MT1.5-7B混合语言检测:算法原理与调优 1. 技术背景与问题提出 随着全球化进程加速,跨语言交流需求激增,传统翻译模型在面对混合语言输入(如中英夹杂、方言与标准语混用)时表现不佳。尽管大模型在翻译质量上取得显…

STM32环境下Keil添加文件的系统学习路径

STM32开发中如何正确在Keil里添加文件:从踩坑到精通的实战指南你有没有遇到过这种情况——代码写好了,头文件也放进工程目录了,结果一编译就报错:fatal error: stm32f4xx_hal.h: No such file or directoryUndefined symbol HAL_G…

企业级翻译方案:HY-MT1.5-7B部署与调优指南

企业级翻译方案:HY-MT1.5-7B部署与调优指南 1. 引言 随着全球化业务的不断扩展,高质量、低延迟的机器翻译已成为企业出海、跨语言内容处理和多语言客户服务的核心需求。传统商业翻译API虽然稳定,但在定制化、数据隐私和成本控制方面存在明显…

HY-MT1.5-7B混合语言处理:社交媒体内容翻译

HY-MT1.5-7B混合语言处理:社交媒体内容翻译 随着全球化进程的加速,跨语言交流在社交媒体、电商、新闻传播等场景中变得愈发重要。尤其是在多语言混杂的社交语境下,传统翻译模型往往难以准确理解语义边界和文化语境。为此,腾讯推出…

spring-cloud-gateway报错Failed to bind properties under ‘‘ to org.springframework.cloud.gateway

目录 报错信息解决办法 原因错误示范正确示范解决办法 报错信息 如果是动态刷新路由报如下错误的话: reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties un…