从0到1:用Logisim亲手搭一个半加器,看懂计算机如何做加法
你有没有想过,我们每天都在用的手机、电脑,它们到底是怎么“算数”的?
表面上是App在弹出结果,背后其实是亿万次微小的电子信号在高速协作。而这一切的起点,可能只是一个简单的电路——半加器。
今天,我们就来动手实践一次“底层之旅”:不靠公式推导,不用背诵逻辑表达式,而是打开一款图形化工具Logisim Evolution,像搭积木一样,从零搭建一个能真正工作的半加器。你会亲眼看到两个比特相加的过程,理解“进位”是怎么产生的,甚至为未来设计CPU中的ALU埋下第一颗种子。
为什么是半加器?它真的那么简单吗?
在数字世界的语言里,一切运算都始于二进制。而最基础的二进制加法,就是把两个0或1加在一起。听起来简单,但这里面藏着现代计算的核心逻辑。
比如:
-0 + 0 = 0(无进位)
-0 + 1 = 1(无进位)
-1 + 0 = 1(同上)
-1 + 1 = 10← 注意!这是二进制,等于十进制的2,所以结果是“和为0,进位为1”
这最后一项很关键——不仅要输出当前位的结果,还要记住是否要向高位“借力”。于是,半加器应运而生。
它的名字叫“半”,是因为它只处理两个输入(A 和 B),却不接收来自低位的进位(Cin)。换句话说,它只能当“排头兵”,干不了中间位的活儿。
但正是这个“不完整”的电路,成了所有复杂加法器的地基。
真值表背后的秘密:Sum 和 Carry 是怎么来的?
我们先别急着画图,回到本质:数据说了什么?
| A | B | Sum | Carry |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
观察一下:
- Sum 只有在 A ≠ B 的时候才是 1→ 这不是典型的异或(XOR)吗?
- Carry 只有在 A = B = 1 的时候才是 1→ 明显是个与门(AND)
所以,我们可以直接写出:
-Sum = A ⊕ B
-Carry = A · B
这两个表达式,就是通往硬件实现的“翻译说明书”。接下来我们要做的,就是把数学符号变成看得见、摸得着(虽然是虚拟的)的电路。
开始搭建:在 Logisim 中一步步构建你的第一个数字电路
准备工作
- 下载并安装 Logisim Evolution (推荐版本,支持高清屏)
- 打开软件,新建项目,默认进入
main电路
界面很简洁:左边是组件库,中间是画布,右边可以查看属性。我们的舞台已经准备好。
第一步:放两个开关 —— 输入信号 A 和 B
你需要告诉电路:“我要输入数据”。
- 在左侧工具栏选择Pin(引脚)
- 在画布上点击两次,放置两个引脚
- 右键每个引脚 → 属性 → 设置:
- Direction: Input
- Label: 分别命名为
A和B - Data bits: 1
现在你有了两个“开关”,可以通过点击切换高低电平(0 或 1),就像真实世界里的拨码开关。
💡 小技巧:按住 Ctrl 键再点击引脚,可以直接翻转其状态,测试超方便!
第二步:加入核心逻辑门
回到真值表的结论:
- Sum 需要 XOR 门
- Carry 需要 AND 门
操作如下:
- 切换到 “Gates” 面板
- 拖入一个XOR Gate和一个AND Gate
- 默认扇入(Inputs)是 2,正好满足需求(不需要改)
你可以拖动调整位置,让整体布局更清晰。建议把两个门上下排列,保持对称。
第三步:连上线!让信号流动起来
使用Wire 工具(铅笔图标)开始连线:
- 从输入 A 引出一条线,分别连接到 XOR 和 AND 门的左端输入
- 同样地,把 B 连接到两个门的右端输入
注意:Logisim 会自动合并交叉线,避免短路。但如果手动拉错,也会报红叉提示错误,非常友好。
此时,A 和 B 的信号已经同时送入了两个逻辑门。
第四步:接上输出灯 —— 让结果“亮”出来
我们需要看到 Sum 和 Carry 的结果。
- 再次使用Pin工具,添加两个输出引脚
- 或者使用LED(红灯)组件(在 “Wiring” 或 “Input/Output” 栏中),视觉反馈更强
- 将 XOR 的输出连接到名为
Sum的 LED / 输出引脚 - 将 AND 的输出连接到名为
Carry的 LED / 输出引脚 - 给这两个输出标记清楚标签
完成后的结构应该是这样的:
A ─┬───────┐ │ ▼ ├──→ XOR ───→ Sum (LED) │ ▲ B ─┴───────┘ A ─┬───────┐ │ ▼ ├──→ AND ───→ Carry (LED) │ ▲ B ─┴───────┘没有时钟,没有控制器,所有运算实时发生——这就是组合逻辑电路的魅力:输入一变,输出立刻响应。
第五步:动手测试!验证四种情况
切换到Hand Tool(手形工具),开始交互式测试:
| 测试组合 | 操作 | 预期现象 |
|---|---|---|
| A=0, B=0 | 不点击或双击置0 | Sum灭,Carry灭 |
| A=1, B=0 | 点击A | Sum亮,Carry灭 |
| A=0, B=1 | 点击B | Sum亮,Carry灭 |
| A=1, B=1 | 同时点击A和B | Sum灭,Carry亮 ✅ |
当你按下最后一个组合时,Carry灯亮起的那一瞬间,你就见证了“进位”的诞生。
🎯 成功标志:四个组合全部符合真值表 → 你的半加器工作正常!
把它封装成模块:未来的全加器就靠它了
做完一次实验后,千万别让它散落在主电路里。我们要把它变成一个可复用的“黑盒子”。
如何封装为子电路?
- 全选整个半加器的所有元件(Ctrl+A)
- 右键 →Create Integrated Circuit
- 软件会自动生成一个新的子电路,比如叫
HalfAdder - 双击左侧项目面板中的
HalfAdder,进入其内部查看原理 - 回到
main电路后,你会发现这个模块已经可以像其他组件一样被调用了
更妙的是,它的接口会被自动整理成整齐的引脚:A、B 输入在左,Sum、Carry 输出在右,干净利落。
⚙️ 实战价值:当你后续要做全加器时,只需要两个半加器 + 一个 OR 门就能搞定。模块化设计让你不再重复造轮子。
常见问题与避坑指南:新手最容易栽在哪?
即使是最简单的电路,也常有人踩坑。以下是几个高频问题及解决方法:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| LED完全不亮 | 输入未激活 / 电源未开启 | 检查Simulation菜单是否启用了Ticks(若需要);确保使用的是Output Pin或LED而非Input |
| Carry总是1 | AND门接反了或短路 | 检查B是否误接到VCC;确认连线没有跨接到高电平线上 |
| Sum和Carry同时亮 | XOR门配置错误或输入冲突 | 查看是否有多个驱动源(Driver Conflict),Logisim会在底部报错 |
| 改变输入后输出不变 | 使用了锁存器或触发器混入 | 确保电路纯组合逻辑,不要引入Clock相关元件 |
| 封装后引脚顺序混乱 | 未合理布局前就创建IC | 先整理好输入输出方向,再封装 |
🔍 调试利器:使用Probe(探针)工具点在线路上,能实时显示该点的逻辑值(0/1),比肉眼追踪快得多。
设计之外:这些习惯决定你能走多远
除了功能正确,良好的工程习惯同样重要。以下几点值得坚持:
- 命名规范:永远不要留默认名如 “pin1”、“out1”。清晰的标签(A/B/Sum/Carry)能让三个月后的你自己也能看懂。
- 布线整洁:尽量走直角,避免斜线缠绕。必要时使用Tunnel(隧道)功能隐藏长距离连线,提升可读性。
- 层次分明:复杂系统一定要分层设计。主电路只放模块,细节藏在子电路里。
- 全面验证:哪怕再简单,也要跑完全部输入组合。自动化测试虽难,但人工穷举必须到位。
拓展挑战:试试这些升级玩法
如果你已经顺利完成基础版,不妨挑战以下几个进阶任务:
✅ 挑战1:仅用 NAND 门实现半加器
NAND 是通用门,理论上任何逻辑都能由它构成。试着推导出 Sum 和 Carry 的 NAND 表达式,并在 Logisim 中实现。你会发现电路变得更复杂,但也更深刻理解“通用性”的代价。
✅ 挑战2:测量传播延迟
启用菜单Simulate > Tick Enabled,然后使用Probe + Data Logger工具记录从输入变化到输出稳定的时间。比较 XOR 和 AND 路径的延迟差异,体会关键路径的概念。
✅ 挑战3:构建全加器原型
利用两个半加器和一个 OR 门,拼出支持 Cin 输入的全加器。你会发现:真正的多位加法,是从这里才真正开始的。
结语:这不是终点,而是起点
当你点亮那盏代表 Carry 的小灯时,你不仅仅是在做一个教学实验。你在模拟CPU中最原始的加法动作,你在触摸计算机的“心跳”。
半加器虽小,但它承载的意义重大:
- 它是从逻辑代数到物理实现的第一步
- 它展示了模块化思维的力量
- 它揭示了复杂系统源于简单规则叠加的本质
掌握它,你就拿到了通向 ALU、寄存器文件、流水线乃至 RISC-V 架构的大门钥匙。
更重要的是,这种“自己动手、亲眼见证”的学习方式,会让你对嵌入式开发、FPGA 编程、甚至操作系统底层优化产生全新的认知视角。
所以,别停在这里。保存你的.circ文件,然后打开新一页画布——下一步,我们一起做全加器。
你准备好了吗?