【发布时间】:2009-06-10 12:11:22
【问题描述】:
我需要创建一个应用程序来创建逻辑电路并查看结果。这主要用于 A-Level(英国,一般为 16-18 岁)计算机课程。
我从来没有做过这样的应用程序,所以我不确定存储电路和评估结果的最佳设计(以可恢复的速度,比如 1.6Ghz 单核计算机上的 100Hz)。
我不想让电路由基本门(and、or、nand 等)构建,我想让这些门用于制造“芯片”,然后可以在其他电路中使用(例如,您可能想要做一个8bit的寄存器芯片,或者一个16bit的加法器)。
问题在于,此类电路的门数量大量增加,因此如果模拟在每个单独的门上工作,它将有 1000 个门要模拟,所以我需要简化这些可以放置在电路中的组件因此可以快速模拟它们。
我考虑为每个组件生成一个真值表,然后模拟可以使用查找表来查找给定输入的输出。尽管这样的表格的大小随着输入的增加而大幅增加,但我遇到了这个问题。如果一个芯片有 32 个输入,那么真值表需要 2^32 行。在许多情况下,这使用了大量的内存,因此对于重要的组件是不实用的,它也不适用于可以存储其状态的芯片(例如寄存器),因为它们不能简单地表示为输入和输出表。
我知道我可以对寄存器芯片之类的东西进行硬编码,但是由于这是出于教育目的,我想要它,以便人们可以制作自己的组件以及查看和编辑标准组件的实现。我考虑允许使用代码(例如 dll 或脚本语言)创建和编辑此类组件,例如,加法器可以表示为“输出 = 输入 A + 输入 B”,但是假设学生已经完成了足够的编程给定的语言能够理解和编写这样的插件来模仿他们电路的结果,这很可能不是这种情况......
是否有其他方法可以采用布尔逻辑电路并自动对其进行简化,以便仿真可以快速确定组件的输出?
至于存储组件,我正在考虑存储某种树结构,以便在评估链接到其输入的所有组件后评估每个组件。
例如考虑:A.B + C 模拟器将首先评估 AND 门,然后使用 AND 门和 C 的输出来评估 OR 门。
但是我突然想到,在输出链接回输入的情况下,将导致死锁,因为输入永远不会全部被评估...我该如何克服这个问题,因为程序只能评估一个一次关门?
【问题讨论】:
-
我想知道......在这样的通用模拟器中,是否可以创建“蜂鸣器”(自创术语)?这是一些可以尽可能快地打开和关闭的电路。如果是这样,您还需要建立类似时间参考框架的东西,否则结果可能会变得不确定......
-
啊,我已经想到了这样的方案。想象一个 XOR 门,其中它的输出连接到它的一个输入,而另一个输入是用户可控的。一旦用户给可控输入 1,XOR 门就会变得疯狂。那么在这种情况下正确的行为是什么?
-
错误,未定义。当然,唯一要做的就是检测它并告诉用户它不允许吗?实际上,根据现有的模拟器 (tetzl.de/java_logic_simulator.html),输出为零,我确定这不是真的……
-
好吧,如果您禁止循环(链接回输入的输出),您将大大简化任务。如果你不能禁止循环,那么我内心的声音告诉我,检测到这种“蜂鸣器”将等同于停止问题(虽然没有证据,只是一种“直觉”)。
-
好吧,我需要允许类似用于制作人字拖的电路(例如 play-hookey.com/digital/rs_nand_flip-flop.html/...)。但是,循环返回自身的 XOR 永远不会产生定义明确、稳定的结果,因此不应该被允许。
标签: boolean-logic