Digital 是一款易于使用的数字逻辑设计器和电路模拟器,专为教育目的而设计。
下载与安装
无需安装,只需解压Digital.zip文件即可下载。在 Linux 上启动 shell 脚本,在 Windows 和 MacOS 上可以直接启动 JAR 文件。运行 Digital 需要 Java 运行时环境(至少 JRE 8)。在 Windows 上,获取 Java 的最简单方法是安装 Eclipse Temurin项目提供的二进制文件。
如果在您的系统上启动 Digital 时出现任何问题,请尝试从Digital文件夹中的命令行运行 Digital :
java -jar Digital.jar
以下是数字化的主要特点:
- 通过测量图可视化信号状态。
- 用于分析振荡的单门模式。
- 组合和时序电路的分析和综合。
- 简单的电路测试:您可以创建测试用例并执行它们来验证您的设计。
- 许多示例:从传输门 D 触发器到完整(简单)的类似 MIPS 的单周期 CPU。
- 包括有限状态机 (FSM) 的简单编辑器。然后,FSM 可以转换为状态转换表和实现 FSM 的电路(参见屏幕截图)。
- 包含最常用的 74xx 系列集成电路的库。
- 支持通用电路。这允许创建在使用时可以参数化的电路。以这种方式,例如可以创建具有可选择位宽度的桶形移位器。
- 良好的性能:示例处理器的时钟频率为 120 kHz。
- 支持大型电路:“Conway's Game of Life”示例由大约 2400 个有源组件组成,并且运行良好。
- 可以使用用 Java 实现并打包在 jar 文件中的自定义组件。有关详细信息,请参阅此示例。
- 简单的远程TCP 接口 ,例如允许汇编器 IDE控制模拟器。
- 可以使用 VHDL 或 Verilog 来描述组件。模拟VHDL 定义的组件需要安装开源VHDL 模拟器ghdl ,模拟Verilog定义的组件需要安装开源Verilog模拟器Icarus Verilog 。
- 电路可以导出为 VHDL 或 Verilog。还直接支持 BASYS3 板和 TinyFPGA BX板。有关详细信息,请参阅文档。示例文件夹包含示例 CPU 的变体,它在 BASYS3 板上运行。
- 直接导出 JEDEC 文件,您可以将其闪存到GAL16v8 或GAL22v10。这些芯片有些过时(1985 年推出!),但对于初学者练习来说足够了,易于理解且有详细记录。还 支持ATF150x芯片,该芯片提供多达 128 个宏单元和系统编程。有关详细信息,请参阅文档。
- 电路的 SVG 导出,包括 LaTeX/Inkscape 兼容的 SVG 版本(请参阅 ctan)
- 没有遗留代码。
- 良好的测试覆盖率(大约 80%;GUI 测试和 HDL 模拟器集成测试都没有在 Travis-CI 构建服务器上运行,因此 CodeCov 测量的覆盖率仅为 50% 左右)。几乎所有示例都包含确保它们正常工作的测试用例。
发行说明中列出了尚未发布的最新更改 。您可以在此处找到最新的预发布版本。在预发布版本中,通常不执行自动化 GUI 测试。所有其他测试(包括 HDL 测试)均执行无误。
该文档有英语、德语、西班牙语、葡萄牙语、法语、意大利语和简体中文版本。它仍然很不完整,但其中包含“第一步”一章,解释了 Digital 的基本用法。该文档还包含可用 74xx 芯片的列表和可用键盘快捷键的列表。
到目前为止,Digital 有英语、德语、西班牙语、葡萄牙语、法语、意大利语和简体中文版本。如果有人想添加新的翻译,请告诉我。我可以为您提供一个特殊的翻译文件。 该文件比Digital 直接使用的文件更容易翻译。因此您不必处理 GitHub 或 Java 源代码。只需将英文文本的相应翻译添加到此文件中并将其发回给我即可。如果您想了解如何自己创建必要的文件,请参阅 此处。
如果您想发送错误报告或功能请求,请使用 GitHub 问题跟踪器。这有助于我提高数字化水平,所以不要犹豫。如果您有一般性问题,您还可以使用新的 GitHub讨论 来提出问题,而无需创建问题。
也可以发送私人消息至[email protected]。
在开发 Digital 之前,我使用了Carl Burch 开发的Logisim 。如果您熟悉 Logisim,您就会认出电线颜色方案。
Logisim 是一款出色且经过验证的教学工具,一直到 2011 年才得到积极开发。2013 年 Carl Burch 开始开发一款名为Toves的新模拟器。在他的博客中,他解释了为什么他决定开发一个新的模拟器而不是改进 Logisim。简而言之:在他看来,Logisim 的架构存在难以克服的弱点。不幸的是,Toves 的开发很早就停止了。
2014年,Carl Burch最终停止了Logisim的开发。由于 Logisim 作为开源发布,有许多分支可以继续 Logisim 上的工作:
- 瑞士多个学院(Haute École Spécialisée Bernoise、Haute École du paysage、d'ingénierie et d'architecture de Genève 和 Haute École d'Ingénierie et de Gestion du Canton de Vaud)的人们对Logisim 的发展
- Logisim,作者:Joseph Lawrance,马萨诸塞州波士顿温特沃斯理工学院
- 印度理工学院德里分校的Logisim-iitd
- 康奈尔大学CS3410课程的Logisim
但据我所知,这些项目并没有致力于解决架构上的困难。它们更多地是关于添加功能和修复错误。例如,在Logisim-evolution中,添加了 VHDL/Verilog 导出和非常好的 FPGA 板集成。
所以我也决定完全从头开始实现一个新的模拟器,并于2016年3月开始实施Digital。同时已经达到了与Logisim相当的开发水平。在某些领域(性能、电路测试、电路分析、硬件支持)Logisim 已经被超越。
下面我想简单解释一下促使我开始新的开发的原因:
在 Logisim 中,没有真正的电路“接通”。当您修改模拟时,模拟也在运行。这有时会导致意外的行为。因此可以构建一个工作正常的简单主从触发器。但电路复位后,触发器不再工作。由于电路未接通,因此在电路完成后没有稳定时间使电路达到稳定状态。主从JK触发器只能通过复位输入来实现,并且需要激活该复位输入以使电路正常运行。
要了解 Digital 如何处理这个问题,您必须了解 Digital 中的模拟如何工作:Digital 使用基于事件的模拟器方法,即每次门的输入之一发生变化时,都会读取新的输入状态,然而,门的输出不会立即更新。仅当所有涉及的门都读取了其输入时,所有门的输出才会更新。所有门似乎都同步变化,即它们似乎具有完全相同的门延迟时间。然而,这种方法的一个不良特征是,即使是简单的 RS 触发器也可能无法达到稳定状态。Logisim 也有同样的问题。
为了解决这个问题,引入了“接通”,并在电路接通后的稳定时间内使用了不同的模拟模式:每次门在其输入之一发生变化时,都会读取所有门输入及其输出立即更新。这种情况按随机顺序按门发生,直到不再发生任何变化并且电路达到稳定状态。现在,门似乎有随机延迟时间。这样,主从触发器在“接通”后达到稳定状态,但最终状态仍然是未定义的。
为了在定义的状态下启动电路,需要使用特殊的复位门。该门具有单个输出,该输出在稳定时间内为低电平,并在稳定时间结束时变为高电平。
这种方法的缺点是无法更改正在运行的模拟。为此,需要关闭电路、修改并再次打开。然而,这个过程也适用于实际电路。
使用 Logisim 很难找到振荡电路的根本原因。如果 Logisim 检测到振荡,则会发出相应的消息,但无法更详细地调查原因,因此很难了解发生了什么。
所有门的同步更新(其输入之一发生变化)也可能会导致数字振荡。在这种情况下,会检测到振荡并停止模拟。然而,还有一种单门模式,允许逐个门地传播信号变化。此功能允许跟踪电路中的路径。每一步之后,所有输入发生变化的门都会突出显示。通过这种方式,您可以看到信号变化如何在电路中传播,从而找到振荡的根本原因。
与 Logisim 类似,Digital 还允许将以前保存的电路嵌入到新设计中,因此可以创建分层电路。然而,数字嵌入式电路的使用频率与电路的使用频率相同。这类似于 C 程序,其中所有函数调用都编译为内联函数。这也类似于真实电路:每个子电路“物理上存在”的频率与设计中使用的频率相同。虽然这种方法增加了内存中仿真模型的数据结构的大小,但它简化了仿真本身。因此,例如,嵌入式电路的输入和输出没有被特别对待,它们在仿真模型形成之后就不再存在了。即使是双向连接也可以轻松实现。由于这种方法,例如子电路中的嵌入式与门的行为与在顶层插入的与门完全相同,尽管从仿真模型的角度来看,这两种变体之间实际上没有区别。Logisim 的工作方式有些不同,这有时会导致意外的情况,例如意外的信号传播时间,并且使得使用双向引脚变得困难。
如果模拟完整的处理器,则可以在不更新图形表示的情况下计算模拟。可以使用 120kHz 时钟(Intel® Core™ i5-3230M CPU @ 2.60GHz)模拟简单的处理器(参见示例),这也适用于更复杂的组装练习,例如康威的生命游戏。有一个具有单个输入的断门。如果该输入从低变为高,则快速运行将停止。这样就可以实现一条汇编指令BRK,然后可以使用该指令在汇编语言程序中插入断点。这样汇编程序的调试就变得非常简单。
在 Logisim 中,没有简单的方法可以在模拟处理器中调试汇编程序。Digital提供了一个简单的基于TCP的远程控制接口,因此可以使用汇编IDE 来控制模拟器并将汇编程序加载到模拟处理器中、启动程序、执行单步等。如果汇编IDE触发“单步”或“运行到下一个BRK指令”,则将程序存储器的实际使用地址返回给汇编IDE。这允许汇编器 IDE 突出显示实际执行的指令。通过这种方式,调试由模拟处理器执行的汇编程序是非常容易的。
Logisim 能够从真值表生成组合电路,反之亦然。在数字领域,这也是可能的。另外,可以从适当的状态转换表生成时序电路。您可以指定转换电路和输出电路。表达式的最小化是通过Quine 和McCluskey 的方法完成的。真值表还可以从包含简单组合逻辑、D触发器或JK触发器的电路中导出,包括状态转换表的生成。但请注意,组合门的触发器构建不被这样识别。时序电路的分析仅适用于与内置 D 或 JK 触发器相结合的纯组合逻辑。创建真值表或状态转换表后,可以为 GAL16v8或GAL22v10导出 JEDEC 文件。之后,可以将该文件刷新到适当的 GAL 上。如上所述,这些 GAL 相当旧,但具有 8/10 宏单元足以适合初学者练习。如果需要更多宏单元,请参阅 PDF 文档,了解有关如何设置 Digital 以支持 提供 32/64 宏单元和系统内编程的ATF1502和 ATF1504 CPLD 的详细信息。还可以将电路导出为 VHDL 或 Verilog,以便在 FPGA 上运行。但必要的 HDL 合成有时有点耗时,根据我的经验,这会大大减慢实验室练习的工作流程,特别是如果只需要简单的电路并且学生一遍又一遍地更改电路。
如果您想从源代码构建 Digital:
- 首先克隆存储库。
- 需要 JDK(至少 JDK 8)(Oracle JDK 或 OpenJDK)
- maven 用作构建系统,因此最简单的方法是安装maven。
- 之后,您可以简单地运行
mvn install
构建 Digital。 - 运行
mvn site
以创建 findbugs 和 JaCoCo 代码覆盖率报告。 - 大多数 IDE(Eclipse、NetBeans、IntelliJ)都能够导入
pom.xml
来创建项目。
- 如果您想贡献,请先打开 GitHub 问题。
- 讨论应避免重复或不必要的工作。
- 在发送拉取请求之前,请确保至少
mvn install
运行时没有错误。
- 不要引入新的 findbugs 问题。
- 尽量保持高测试覆盖率。目标是至少 80% 的测试覆盖率。
- 到目前为止,只有少数 GUI 测试,因此总体测试覆盖率仅略低于 80%。尽量减少未经测试的 GUI 代码的数量。
非常感谢以下人士的帮助:
- 洪都拉斯中美洲科技大学的 Ivan de Jesus Deras Tabora 实现了 verilog 代码生成器和几乎所有必需的 verilog 模板。
- 来自巴西米纳斯吉拉斯天主教大学的 Theldo Cruz Franqueira 提供了葡萄牙语翻译。
- 来自西班牙佩尼亚弗洛尔(塞维利亚)的 Instituto de Educación Secundaria Ies Virgen de Villadiego 的 Ángel Millán 提供了西班牙语翻译。
- XinJun Ma ( @itviewer ) 提供了中文翻译。
- Nicolas Maltais ( @maltaisn ) 提供了法语翻译。
- Luca Cavallari ( @psiwray ) 提供了意大利语翻译。