news 2026/4/24 6:32:23

告别枯燥理论!用Logisim 2.7.1亲手搭建一个4位加减法器(附完整电路文件)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别枯燥理论!用Logisim 2.7.1亲手搭建一个4位加减法器(附完整电路文件)

从零构建4位加减法器:用Logisim解锁计算机硬件的奥秘

计算机组成原理常常让初学者望而生畏——那些抽象的真值表、复杂的逻辑表达式和晦涩的电路图,像一堵高墙阻挡着探索的脚步。但今天,我们将用Logisim这把"数字积木",亲手搭建一个完整的4位加减法器,让那些课本上的理论变成可视化的互动体验。不需要任何硬件设备,只需一台电脑和你的好奇心,就能深入计算机运算的核心地带。

1. 准备工作:认识我们的数字实验室

在开始搭建之前,让我们先熟悉这个虚拟电子实验室——Logisim 2.7.1。这款开源工具完美模拟了真实的电路实验环境,却省去了面包板、跳线和芯片的麻烦。它的界面直观分为几个关键区域:

  • 工具栏:包含各种逻辑门(与、或、非、异或)、输入输出设备(引脚、按钮、LED)和布线工具
  • 画布区:我们的"实验台",在这里拖放组件并连接它们
  • 项目面板:管理电路层次结构,特别是稍后会用到的"子电路"功能

提示:首次打开Logisim时,建议先尝试工具栏中的各个组件,用右键点击可以查看和修改属性,这是后续实验的重要基础操作。

安装完成后,创建一个新项目并保存为4bit_adder_subtractor.circ。这个文件将记录我们所有的电路设计,最终可以分享给其他学习者或作为作业提交。Logisim的.circ文件实际上是XML格式,这意味着它们可以用文本编辑器查看,但强烈建议只在Logisim中修改。

2. 基础模块:构建1位全加器

全加器(Full Adder)是加减法器的基础单元,理解它的工作原理至关重要。与半加器不同,全加器考虑了来自低位的进位输入,这正是多位加法的基础。

2.1 真值表到逻辑表达式

让我们先明确1位全加器的输入输出:

  • 输入
    • A:被加数(1位)
    • B:加数(1位)
    • Cin:来自低位的进位输入
  • 输出
    • S:当前位的和
    • Cout:向高位的进位输出

根据二进制加法的规则,我们可以列出完整的真值表:

ABCinSCout
00000
00110
01010
01101
10010
10101
11001
11111

通过分析真值表,我们发现输出S实际上是A、B和Cin三个输入的异或结果,而Cout则是多数表决的结果(当至少两个输入为1时,Cout为1)。这导出了经典的全加器逻辑表达式:

S = A ⊕ B ⊕ Cin Cout = (A ∧ B) ∨ (Cin ∧ (A ⊕ B))

2.2 在Logisim中实现电路

现在,让我们将这些逻辑表达式转化为实际的电路。在Logisim中按照以下步骤操作:

  1. 新建一个电路,命名为"FA"(Full Adder的缩写)
  2. 从工具栏添加三个输入引脚,分别标记为A、B和Cin
  3. 添加两个输出引脚,标记为S和Cout
  4. 按照逻辑表达式连接电路:
    • 首先用两个异或门实现A⊕B,再将结果与Cin异或得到S
    • 用与门实现A∧B
    • 用另一个与门实现Cin∧(A⊕B)
    • 最后用或门将两个与门的输出合并,得到Cout

完成后的电路应该如下图所示(实际Logisim中的布局):

A ----⊕----⊕---- S | | B ----⊕ | | Cin --------⊕

注意:在Logisim中,连线交叉时如果没有节点(小圆点)表示它们不相连。如果需要连接,必须明确放置连接点。

2.3 测试你的全加器

构建完成后,务必进行全面测试:

  1. 右键点击输入引脚,选择"Poke"工具可以手动切换输入状态(0/1)
  2. 对照真值表,检查所有8种输入组合的输出是否正确
  3. 发现错误时,检查连线顺序和逻辑门类型是否正确

一个实用的技巧是使用Logisim的"模拟器"菜单中的"自动模拟"功能,这样输入变化时输出会实时更新,便于观察。

3. 进阶设计:从加法器到加减法器

有了可靠的全加器,我们现在可以扩展它的功能,使其既能做加法又能做减法。关键在于理解计算机中减法是如何通过加法实现的——这就是著名的"补码"技术。

3.1 补码原理简介

在二进制中,A - B可以通过A + (-B)来实现,而-B的二进制表示就是B的补码。对于n位数,补码等于反码加1:

-B = ~B + 1

因此,加减法器的核心思路是:当进行减法时,将B转换为补码形式,然后执行加法运算。

3.2 构建1位加减法器

我们需要在全加器基础上增加少量逻辑来实现这个转换:

  1. 添加一个控制信号Sub(0表示加法,1表示减法)
  2. 当Sub=1时,B需要取反,并且Cin需要设为1(因为补码是反码加1)
  3. 用异或门实现条件取反:B ⊕ Sub(当Sub=0时输出B,Sub=1时输出~B)

修改后的电路连接方式:

  • B输入连接到异或门的一个输入端,Sub连接到另一个输入端
  • 异或门的输出连接到全加器的B输入
  • Sub信号直接连接到全加器的Cin输入

这样,当Sub=0时:

  • B直接传递到全加器
  • Cin=0
  • 电路执行标准加法A+B+0

当Sub=1时:

  • B取反后传递到全加器
  • Cin=1
  • 电路执行A+(~B)+1,即A-B

3.3 测试加减法功能

构建完成后,进行双重验证:

加法测试(Sub=0)

  • 输入A=1, B=1, Sub=0 → 输出S=0, Cout=1 (1+1=10)
  • 输入A=0, B=1, Sub=0 → 输出S=1, Cout=0 (0+1=1)

减法测试(Sub=1)

  • 输入A=1, B=1, Sub=1 → 输出S=0, Cout=1 (1-1=0)
  • 输入A=1, B=0, Sub=1 → 输出S=1, Cout=1 (1-0=1)

4. 扩展为4位加减法器

单个位的加减法器已经很有成就感,但真正的计算机处理的是多位数据。现在我们将4个1位加减法器串联起来,构建一个完整的4位加减法器。

4.1 串联原理

多位加减法的关键在于进位的传递:

  1. 最低位(LSB)的Cin连接到Sub信号(减法时需要加1)
  2. 每个位的Cout连接到下一个位的Cin
  3. 最高位(MSB)的Cout就是整个运算的进位/借位标志

在Logisim中,我们可以利用"子电路"功能来复用之前设计的1位加减法器:

  1. 在项目面板右键点击,选择"添加电路",命名为"1-bit Add/Sub"
  2. 将之前设计的加减法电路复制到这个新电路中
  3. 为这个子电路添加输入输出引脚,确保接口清晰
  4. 在主电路中,放置4个"1-bit Add/Sub"实例

4.2 完整电路连接

按照以下步骤完成4位加减法器的组装:

  1. 创建8个输入引脚:A3A2A1A0(被加数/被减数)、B3B2B1B0(加数/减数)
  2. 创建1个控制引脚:Sub
  3. 创建5个输出引脚:S3S2S1S0(结果)、Cout(进位/借位)
  4. 连接4个1位加减法器:
    • 第一个的Cin连接Sub
    • 每个的Cout连接下一个的Cin
    • 最后一个的Cout作为最终进位输出
  5. 添加LED或显示器来直观展示结果

4.3 自动化测试方案

手动测试所有16×16种输入组合是不现实的,我们可以利用Logisim的计数器功能实现自动化测试:

  1. 添加两个4位计数器作为A和B的输入源
  2. 添加时钟信号控制计数速度
  3. 用LED阵列显示输入输出值
  4. 添加一个开关控制Sub信号
  5. 观察不同模式下输出是否符合预期

一个典型的测试用例表:

模式AB预期结果实际结果
加法010100111000 (5+3=8)
加法111100010000 (15+1=16,溢出)
减法100000110101 (8-3=5)
减法001110001011 (3-8=-5)

5. 优化与扩展:让电路更专业

基础功能实现后,我们可以考虑一些优化和扩展,使这个加减法器更接近实际计算机中的设计。

5.1 溢出检测

在补码运算中,溢出发生在:

  • 正数加正数得到负数
  • 负数加负数得到正数

可以通过比较最高位的进位输入和输出来检测:

溢出 = Cout ⊕ Carry_in_to_MSB

在Logisim中添加这个逻辑,并用单独的LED指示溢出状态。

5.2 零标志检测

当所有结果位都为0时,设置零标志。这可以通过一个4输入或非门实现:

  1. 将S0-S3连接到4输入或非门
  2. 输出即为零标志

5.3 封装为可复用组件

将完整的4位加减法器封装为子电路:

  1. 创建新电路"4-bit Add/Sub"
  2. 复制所有相关组件
  3. 定义清晰的输入输出接口
  4. 添加适当的标签和注释

这样,在更复杂的电路(如ALU)中就可以直接复用这个模块。

5.4 扩展为8位或16位

掌握了4位设计后,扩展到更多位数只是简单的重复:

  1. 使用两个4位加减法器
  2. 将第一个的Cout连接到第二个的Cin
  3. 组合输入输出总线

这种模块化设计展示了计算机硬件的可扩展性——从简单的1位全加器开始,可以构建出现代CPU中的64位甚至128位运算单元。

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

我用企业微信 API + GPT 做了个自动客服(附完整代码)

在私域里,最浪费生命的事,就是回复那些“在吗”、“多少钱”、“怎么用”的琐碎问题。 最近我花了一点时间,把 GPT 的大脑接到了企业微信上。实现的效果非常惊人:它不仅能像真人一样理解客户的各种刁钻提问,还能 24 小…

作者头像 李华
网站建设 2026/4/24 6:29:39

MySQL 索引介绍

本文章讲解 Hash、二叉树、平衡二叉树、B-Tree、BTree 索引的逻辑情况 查找都是索引操作,当数据量较大时,索引的大小可能有几个 G,甚至更多,为了减少索引在内存的占用,数据库索引是存储在磁盘上的,将索引以…

作者头像 李华
网站建设 2026/4/24 6:28:19

长按开关机芯片

一、EC190708芯片例图VDD接5V这个例子使用:长按按键3秒,LED灯会亮,再次长按按键3秒,LED会灭可以看到他的输出电流非常小,它可能会带动一个单片机,但是别的东西就带不动了但是想要控制一个大功率器件&#x…

作者头像 李华
网站建设 2026/4/24 6:27:28

WeDLM-7B-Base Java开发实战:SpringBoot微服务API接口封装

WeDLM-7B-Base Java开发实战:SpringBoot微服务API接口封装 1. 引言:当SpringBoot遇上大模型 最近在帮一家电商平台做智能客服系统升级时,遇到了一个典型问题:如何让现有的Java后端架构快速集成大语言模型能力?经过几…

作者头像 李华