2026/6/28 20:16:43
网站建设
项目流程
佛山禅城区网站建设公司,360搜索入口,霍尔果斯建设局网站,创业网站开发要多少钱从零开始造一台“计算机”#xff1a;用逻辑门搭建加法器的完整实践你有没有想过#xff0c;我们每天使用的手机、电脑#xff0c;它们强大的计算能力——无论是刷视频、打游戏#xff0c;还是运行大型AI模型——最底层其实都源于几个简单的开关动作#xff1f;这些“开关…从零开始造一台“计算机”用逻辑门搭建加法器的完整实践你有没有想过我们每天使用的手机、电脑它们强大的计算能力——无论是刷视频、打游戏还是运行大型AI模型——最底层其实都源于几个简单的开关动作这些“开关”就是数字电路中的逻辑门。而今天我们要做的是亲手用最基础的与门、或门、异或门搭出一个能真正做加法的电路二进制加法器。这不是抽象理论也不是仿真截图走个过场。这是一次从真值表推导、到逻辑表达式化简、再到模块化Verilog实现的完整闭环。哪怕你是刚接触数字电路的新手也能一步步跟着走完这个“从0到1”的创造过程。半加器加法世界的起点一切复杂的运算都始于最简单的操作。对于二进制加法来说第一步就是把两个比特bit加起来。比如-0 0 0-0 1 1-1 0 1-1 1 10← 这里产生了进位注意最后一种情况结果不再是单个比特而是两位——和为0进位为1。这意味着我们需要两个输出信号和Sum和进位Carry。真值表告诉我们一切设输入为 A 和 B输出为 Sum 和 CarryABSumCarry0000011010101101观察一下Sum 在 A 和 B 不同时为1→ 这不就是异或XOR吗Sum A ⊕ BCarry 只有在 A 和 B 都为1时才有效→ 显然是与AND操作Carry A · B就这么简单没错一个异或门 一个与门就构成了一个半加器Half Adder。为什么叫“半”加器因为它只能处理两个本位相加无法接收来自低位的进位。就像做竖式加法时你忘了加上“进上来的1”显然不能独立用于多位运算。但它的价值在于简洁明了是我们通往复杂系统的跳板。Verilog 实现让代码对应物理电路module half_adder( input wire A, input wire B, output wire Sum, output wire Carry ); assign Sum A ^ B; // 异或门生成和 assign Carry A B; // 与门生成进位 endmodule这段代码没有时序逻辑、没有状态机完全是组合逻辑的直接映射。综合工具会把它变成实实在在的门电路。你可以把它烧录进FPGA接上拨码开关和LED灯亲眼看到“1110”的物理实现。全加器支持进位的真正加法单元现在我们来解决半加器的短板如何处理进位输入设想你在计算1 1 1三个1相加比如在多位加法中某一位不仅要加两个数还要加上低位传来的进位。这时就需要全加器Full Adder。它有三个输入- A、B当前位的两个加数- Cin来自低位的进位输入两个输出- Sum本位的和- Cout向高位输出的进位从真值表出发找出规律ABCinSumCout00000001100110111111经过卡诺图化简或直接逻辑分析可以得到Sum A ⊕ B ⊕ CinCout (A · B) (Cin · (A ⊕ B))这两个公式很重要它们揭示了进位传播的本质只有当至少两个输入为1时才会产生进位。如何构建两种思路对比方法一直接用逻辑门搭建你需要- 两个 XOR 门串联实现三级异或- 两个 AND 门分别计算A·B和Cin·(A⊕B)- 一个 OR 门合并进位优点是结构清晰缺点是门数多布线复杂。方法二复用半加器模块推荐我们可以把全加器看作“两次半加”先用半加器处理 A B → 得到中间和 S1 和进位 C1再把 S1 和 Cin 输入第二个半加器 → 得到最终 Sum 和 C2最终进位 Cout C1 OR C2这种设计思想叫做模块化复用是大型数字系统开发的核心理念。Verilog 结构化实现module full_adder( input wire A, input wire B, input wire Cin, output wire Sum, output wire Cout ); wire s1, c1, c2; // 第一级A B half_adder ha1 (.A(A), .B(B), .Sum(s1), .Carry(c1)); // 第二级s1 Cin half_adder ha2 (.A(s1), .B(Cin), .Sum(Sum), .Carry(c2)); // 合并进位 assign Cout c1 | c2; endmodule✅亮点解析- 复用了之前写的half_adder模块代码可读性强。- 接口命名规范便于后续集成。- 工具综合后仍能优化成高效门级网表不影响性能。小贴士虽然看起来用了更多模块但在FPGA中LUT查找表会自动压缩逻辑。更重要的是这种写法更容易调试、修改和验证。组装4位加法器让机器真正学会算术有了全加器我们就可以级联出任意位宽的加法器。最常见的就是行波进位加法器Ripple Carry Adder, RCA。将四个全加器串起来A3 B3 A2 B2 A1 B1 A0 B0 ││ ││ ││ ││ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ Cin ←─┤ FA ├──←┤ FA ├──←┤ FA ├──←┤ FA ├──← 0 └─────┘ └─────┘ └─────┘ └─────┘ │ │ │ │ S3 S2 S1 S0最低位的 Cin 固定接地0高位依次传递进位。最终输出4位和 S[3:0] 和最高位的 Cout可用于溢出判断。动手验证计算 1 1 ?输入A 4’b0001, B 4’b0001, Cin 0逐级计算FA0A1, B1, Cin0 → Sum0, Cout1FA1A0, B0, Cin1 → Sum1, Cout0FA2/FA3输入全0 → 输出0结果S 4’b0010 十进制2✅完全正确但你也发现了问题FA1 必须等 FA0 的 Cout 出来才能开始工作。这就是所谓的“进位纹波效应”。性能瓶颈在哪假设每个门延迟为1ns- 半加器内部路径约2级门延迟XOR→AND/OR- 每个全加器约3~4级- 4位RCA总延迟 ≈ 4 × 单级FA延迟 ≈ 16ns如果是32位那延迟可能达到上百纳秒——在现代CPU主频动辄GHz的时代这是不可接受的。所以高端处理器不会用RCA而是采用超前进位加法器CLA通过前缀网络提前计算所有进位大幅缩短关键路径。但这并不否定RCA的价值。作为教学原型它直观展示了信息是如何在硬件中流动和变换的。设计之外的思考我们到底在学什么当你写下那一行assign Sum A ^ B;的时候你不是在写代码而是在定义物理世界的规则。每一个信号都对应着芯片上一条金属走线的电平每一个门都是由MOS管构成的实际电路每一次加法都是电子在半导体中奔跑的结果。掌握加法器设计的意义远不止“会连几个门”。它教会我们1.分层抽象的能力从晶体管 → 逻辑门 → 半加器 → 全加器 → 多位加法器 → ALU → CPU每一层都隐藏了下一层的复杂性让我们能够驾驭越来越庞大的系统。这是工程思维的核心。2.速度与面积的权衡RCA结构简单面积小但速度慢CLA速度快但逻辑复杂、功耗高。实际项目中你要根据应用场景选择手表里的MCU追求低功耗服务器CPU追求高性能。3.软硬件协同的设计哲学Verilog既是“程序”也是“图纸”。你写的每一行都会被综合成真实的电路。这就要求你不仅懂语法更要理解时序、资源、延迟等硬件约束。下一步可以探索的方向如果你已经成功实现了4位加法器恭喜你你已经站在了数字世界的大门前。接下来还可以尝试实现超前进位加法器CLA使用进位生成G和传播P信号构建快速进位链。用加法器实现减法利用补码特性A - B A (~B) 1只需加入取反和初始进位即可。构建简易ALU扩展功能支持与、或、非、移位等操作做成一个完整的算术逻辑单元。上板验证把代码下载到FPGA开发板用按键输入数据数码管显示结果完成一次真实世界的交互。加入流水线在多位加法器中插入寄存器提升吞吐率理解时序电路的设计要点。写在最后我们不需要一开始就造出一台超级计算机。只要你会用与门、或门、异或门就能造出第一个会“计算”的机器。而当你亲手点亮那个代表“2”的LED灯时你就已经触摸到了计算机科学最原始的力量用最简单的规则构建最复杂的智能。下次当你打开计算器输入1 1不妨想一想那一刻有多少亿个微小的逻辑门正在为你默默工作而这趟旅程的起点也许正是你现在读到的这一行代码assign Sum A ^ B;欢迎入坑数字电路的世界——这里没有魔法只有逻辑与创造。如果你在实现过程中遇到了问题或者想分享你的FPGA验证成果欢迎留言交流