当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]如果你喜欢设计逻辑电路,那么 Logisim 这款工具非常不错。它能让你设计电路,并对电路进行模拟以查看其工作原理。我猜想如今很多电子工程专业的学生都已经熟悉 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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在电子电路领域,比较器和R-S触发器作为基础核心器件,广泛应用于信号处理、时序控制、电源管理等众多场景。深入掌握它们的工作特性与仿真方法,是电子工程师进行电路设计与优化的关键环节。本文通过Multisim仿真平台,对比较...

关键字: 比较器 触发器

FIFO 设计并不罕见。我们能够找到大量相关信息,包括公开可用的代码。你认为在 2026 年,FIFO 设计仍然重要吗?是的,当然。FIFO(先进先出存储器)在基于现代 FPGA 的解决方案中仍然非常重要,这类解决方案要...

关键字: 寄存器 FPGA FIFO

在工业控制、音频处理等高性能嵌入式场景中,某电机驱动项目通过混合使用寄存器操作与CMSIS-DSP库,将PID控制周期从120μs缩短至38μs,系统响应速度提升3倍。本文将揭秘这种"底层+高层"混合编程模式的核心技巧。

关键字: HAL STM32 寄存器

Linux驱动寄存器操作是硬件交互的核心环节。然而,多核处理器架构、中断异步性以及编译器优化等因素,可能导致寄存器访问出现竞态条件(Race Condition)和内存乱序(Memory Reordering)问题。这些...

关键字: Linux驱动 寄存器

在嵌入式系统开发中,寄存器操作是控制硬件外设(如GPIO、UART、SPI)的核心环节。传统方法通过直接读写寄存器地址(如*(volatile uint32_t *)0x40021000)实现控制,但存在可读性差、易出错...

关键字: 硬件描述语言 寄存器

在资源受限的嵌入式系统中,C语言的位操作不仅是硬件控制的核心工具,更是实现内存压缩与性能优化的关键技术。通过直接操作寄存器位域,开发者能够以极低的资源开销完成复杂功能,同时显著减少内存占用。本文将结合实战案例,解析位操作...

关键字: 嵌入式C语言 寄存器

在嵌入式系统开发中,DMA(直接内存访问)控制器作为硬件加速的核心模块,通过独立于CPU的数据搬运能力显著提升系统性能。以STM32H7系列为例,其双DMA控制器(各含8通道)可实现高达480MHz总线频率下的数据传输,...

关键字: 驱动开发 DMA 寄存器

在嵌入式系统开发中,硬件抽象层(HAL)通过隔离底层硬件细节与上层应用逻辑,成为实现跨平台移植的核心设计模式。本文以STM32与NXP LPC系列MCU为例,系统阐述寄存器操作封装方法与移植优化策略。

关键字: 硬件抽象层 HAL 寄存器

在数字电子技术领域,逻辑电路是构成各类数字系统的核心,根据电路输出与输入信号的关系,可分为时序逻辑电路和组合逻辑电路两大类。这两种电路在工作原理、结构组成和应用场景上存在显著差异,其根本区别源于核心构成单元的不同——时序...

关键字: 逻辑电路 时序 组合

在物联网、工业自动化和医疗诊断等领域的快速发展中,高精度逐次逼近寄存器(SAR)模数转换器(ADC)已成为信号采集系统的核心组件。这类器件以中等速度(kSPS至MSPS量级)和中等分辨率(8-18位)著称,能效比优异,广...

关键字: ADC 寄存器
关闭