使用 Logisim 进行逻辑设计
扫描二维码
随时随地手机看文章
如果你喜欢设计逻辑电路,那么 Logisim 这款工具非常不错。它能让你设计电路,并对电路进行模拟以查看其工作原理。我猜想如今很多电子工程专业的学生都已经熟悉 Logisim 了,但直到最近我才听说过它。在这次教程中,我将向你们简要介绍一下它,并展示一些我用它设计的电路示例。
Logisim 可从 SourceForge 网站免费获取(网址如下)。该网站介绍道:“它是一款用于设计和模拟数字逻辑电路的教育工具,具有易于学习的界面、分层电路、线束以及庞大的组件库。”下载版本适用于 Windows、MAC 和 Linux 系统。安装起来很简单,但它是一款 Java 应用程序,因此您需要在系统中安装 Java。
主要特点
Logisim 软件自带了大量的逻辑组件:门电路、多路选择器、触发器、寄存器、计数器、数学运算功能、存储器以及各种输入和输出设备。下面展示了一个简要示例:
值得一提的是,Logisim 只是假定电源和地线会为所有组件提供所需条件,因此它们不会被显示出来,也并非必需的。例如,一个 LED 只有一个引脚,即其阳极,而阴极则假定处于地电位。而一个按钮只有一个引脚,当被按下时,该引脚会从 0 变为 1。
如果您需要尚未存在的某种东西,可以将其设计为一个“子电路”。这就好比将您的电路转变为一个集成电路。这意味着它会被封装起来,并被赋予一个名称,然后就可以像其他可用的组件一样被使用。就像下面这个极端的例子所示,我们已经将数字时钟的所有逻辑(包括从二进制转换为 BCD 以及 7 位数码管驱动器)封装起来,并将其作为一个名为“Clock”的组件进行包装。它有三个输入用于设置时间,还有 7 个输出用于驱动 6 个 7 位数码管和一个闪烁的冒号。
大多数组件的位宽均可设置至 32 位。这极大地有助于保持电路布局整洁且简单。当导线连接到多位输入端时,它们会自动成为“数据总线”。导线的两端必须采用相同的位宽,否则系统会发出警告。分路器可用于将位合并到多位总线上或从总线上分出位。您可以在下面看到一个 8 位宽的 4:1 多路复用器,其所有输入和输出都通过分路器进行了拆分。您还可以看到当尝试连接不同位宽的导线时所得到的错误消息。
有一种时钟可以以一次或 0.5 赫兹至 2 千赫兹的频率进行计时。我个人在 Windows 11 系统上发现,当频率超过 250 赫兹时,该时钟会变得有些不稳定,因为我们的模拟是在一个高度多任务运行的操作系统上进行的。下面展示的是时钟组件及其可用频率(实际的计时频率是该频率的两倍)。
工具栏中的前两个工具分别是“手指”和“指针”。选择“手指”会使你进入模拟模式,在此模式下,点击某个元素会改变其状态,即 0 变为 1 或 1 变为 0。选择“指针”则会进入编辑模式,在此模式下,选择一个组件可以移动它、删除它或更改其属性。这一点你需要特别注意。我仍然发现自己会用手指去编辑某些内容或者用指针去戳某些东西。
用户界面相当直观,但如果您需要帮助,就有丰富的帮助菜单可供使用。教程是一种快速学习基本知识的方式。这些组件本身也具有一定的直观性,但库参考则提供了每个组件的详细信息。我认为,您在首次尝试使用某个组件时阅读相关介绍可能是个不错的主意。
关于这一点,需要了解的重要内容是电线的颜色:
绿色:这根电线的截面宽度无法确定,因为它并未与任何物体相连。
蓝色:这条导线承载着一个二进制值,但并没有任何东西将特定的值传输到这条导线上。
深绿色:该导线正传输着一个位值为 0 的信号。
亮绿色:这根电线正传输着一个位的“1”值。
黑色:这条导线传输的是一个多位数值。其中部分或全部位的具体数值并未明确说明。
红色:该导线正传输着错误值。这种情况通常是因为某个门无法确定正确的输出,可能是因为该门没有输入信号。也可能是因为两个组件试图将不同的值传输到该导线上。当多位导线所传输的任何一位为错误值时,该导线就会变为红色。
橙色:连接到电线上的组件在位宽上并不一致。在此情况下,分别展示了两端的位宽。
一些示例电路
Logisim 会将逻辑电路保存为.circ 文件。该文件会保存您的所有工作内容,包括任何子电路。它会记住您的时钟频率,但您必须在“模拟”菜单中选择“启动计数”来启动时钟。我在这里要讨论的所有电路都包含在附带的 ZIP 文件中。我们将从简单的内容开始,逐步过渡到更复杂的电路。
6 位二进制计数器
我们的第一个电路使用触发器来构建一个异步的 6 位二进制计数器,能够从 0 计数到 63。这里有几个需要讨论的问题。触发器上的所有 T 输入都必须被激活(设置为 1)才能使它们开始计数。我们的计数器的输出是 NOT_Q,每个输出都连接到一个红色的 LED。我们的输出之所以出现在 NOT_Q 上,是因为第一个上升的时钟脉冲将所有的 Q 输出置高,然后 Q 输出从 63 依次下降到 0。我们希望作为输出的是 NOT_Q,它会从 0 计数到 63。
4位数十年计数器
这是另一种类型的计数器,但更为复杂。我们使用了四个计数器组件,而非单独的触发器,并将每个组件设置为 4 位宽度。这些计数器需要使 ct 引脚处于开启状态才能进入计数模式。每个计数器的计数范围为 0 到 15。但我们需要的是十进制计数器。我们在每个计数器的输出端加上一个分路器,并将一个与门连接到第二位和第四位。该门的输出连接到计数器的 0 或复位引脚,这样当计数从 9 转变为 10 时,计数器就会重置为 0。该门的输出还会触发下一个计数器的时钟信号。
既然我们已经有了一个四位数的十进制计数器,接下来我们将使用七段显示模块来展示其输出结果。我创建了一个具有 4 位地址和 7 位输出的只读存储器,并在其中输入 7 位代码来显示数字。通常情况下,我会只创建一个只读存储器,并通过该存储器对输出进行多路复用,使其以足够快的速度显示到每个数字上,从而看起来像是它们都在同时亮着。但在 Logisim 中尝试这样做时,我发现时钟运行速度不够快且不够稳定,无法让显示效果看起来像是它们一直都在亮着。我怀疑这是由于在像 Windows 11 这样的多任务操作系统上进行仿真而造成的。无论如何,我不得不采取一个替代方案,即制作另外三个 七段显示驱动器只读存储器的副本。
16 位算术逻辑单元
算术逻辑单元(ALU)是计算机中央处理器(CPU)的主要组成部分之一。它是一个复杂的组合逻辑电路。它有两个 16 位的输入端,并且能够对这两个数字同时执行多种不同的运算。然后,一条操作码会控制多路复用器,从而决定 16 位输出中显示的是哪种运算。这个 ALU 所执行的运算包括:
•加上 A 与 B 的和
•子程序 A-B
•否定 A
•增量 A
•递减量 A
•A 和 B
•或者 A 和 B
•A 与 B 的异或运算
•比较 A 和 B
•将 A 向右移动 B 位
•将 A 位左移 B 位
所有的输入和输出都是二进制形式。除了主要的 16 位输出外,还有 4 个标志位:进位输出标志、大于标志、小于标志和等于标志,这些是比较操作的结果。比较输出实际上始终处于有效状态,而不仅仅是在存在比较操作指令时才有效。在某些操作中存在进位位,但我没有将它们合并并作为实际输入呈现出来。通过操作各种输入,您可以进行实验并查看输出结果。
带有读出功能的算术逻辑单元
我原本觉得在我的算术逻辑单元(ALU)的输入和输出部分添加七段数码显示器可能会很有趣。然而,将一个 16 位数字转换为一个 5 位十进制数字的组合逻辑非常复杂。这包括首先将二进制数转换为 5 个 BCD(二进制编码十进制)数字,然后将每个结果通过转换为七段数码代码。幸运的是,一位名为“7404 IC”的 YouTube 用户已经在 Logisim 中创建了所需的内容。我能够采用他的电路,并用它创建一个子电路。它被标记为 BCD,并能一次性完成所有转换。所以,如果你想试用一下算术逻辑单元,你仍然需要输入二进制数字,但现在你可以清楚地看到十进制的输入和输出,以便进行实验。
时钟
之前我向你们展示过一种钟表的版本,其中所有的内部组件都被封装在一个子电路中。但在接下来的部分中,我们将详细探讨这个 12 小时钟的实际钟表电路。
这个电路大致分为三个部分。在最上面是输出部分:6 位七段显示,中间有闪烁的冒号,分别表示小时与分钟、分钟与秒的分隔。这些冒号由 4 个 LED 组成。表示小时、分钟和秒的两位数字显示,各自通过一个 8 位版本的“7404 IC”电路(标记为 7SD)从二进制转换为七段 BCD 编码。对于小时显示,我添加了一个加法器,其中一个输入为“1”,以将小时从 1 - 12 转换为 0 - 11。
电路的第二部分是用于计时的实时时钟部分,包括小时、分钟和秒的计数器。这三个计数器的输出端都连接有与门,这样当计数达到设定值时(即分钟和秒为 60,小时为 12)它们就会复位。
电路的第三部分允许您设定时间。对于小时,操作方式很简单:用于小时的时钟脉冲会通过一个“或”门。另一个按钮位于该“或”门的另一输入端,按下该按钮即可推进小时计数。对于秒和分,情况就复杂一些。主时钟设定为 8 赫兹,并进入一个 3 位计数器,其输出为 1 赫兹和 4 赫兹。这两个时钟输出分别连接到多路复用器中,按下秒或分设置按钮会使 4 赫兹的时钟接入并迅速推进分钟或秒计数器中的数值。这些按钮还开启了传输门,这样在设置过程中让秒或分计数通过 60 进行累加不会导致下一个数字在设置过程中向前推进。
本文编译自hackster.io





