创建逻辑门模拟器

Fir*_*cer 9 boolean-logic

我需要创建一个用于创建逻辑电路和查看结果的应用程序.这主要用于A-Level(英国,一般为16-18岁)计算机课程.

我从来没有做过这样的任何应用程序,所以我不确定存储电路和评估结果的最佳设计(以可重复的速度,比如1.6Ghz单核计算机上的100Hz).

我希望允许这些门用于制作"芯片",然后可以在其他电路中使用(例如,你可能想要制作一个8位),而不是从基本门(和,或者nand等)构建电路.寄存器芯片,或16位加法器).

问题是这些电路的门数大量增加,这样如果模拟工作在每个单独的门上,它将有1000个门进行模拟,所以我需要简化这些可以放在电路中的元件,这样它们就可以了快速模拟.

我考虑为每个组件生成一个真值表,然后模拟可以使用查找表来查找给定输入的输出.虽然这些表的大小随着输入而大量增加,但问题出现了.如果芯片有32个输入,那么真值表需要2 ^ 32行.这在很多情况下使用大量内存比使用更多,因此对于非平凡组件不实用,它也不能用于存储其状态的芯片(例如寄存器),因为它们不能简单地表示为简单投入和产出表.

我知道我可以硬编码注册芯片之类的东西,但是因为这是出于教育目的,我想要它,以便人们可以制作自己的组件,以及查看和编辑标准的实现.我考虑过允许使用代码(例如dll或脚本语言)创建和编辑这些组件,以便例如加法器可以表示为"output = inputA + inputB",但是假设学生已经完成了足够的编程.给定语言能够理解和编写这样的插件来模仿他们的电路结果,这可能不是这样的...

是否有其他方法可以采用布尔逻辑电路并自动简化它,以便模拟可以快速确定组件的输出?

至于存储组件,我正在考虑存储某种树结构,这样一旦评估了链接到其输入的所有组件,就会评估每个组件.

例如,考虑:AB + C模拟器首先评估AND门,然后使用AND门和C的输出来评估OR门.

然而,我刚刚想到,如果输出链接回输入,将导致死锁,因为输入将永远不会被评估...我如何克服这个问题,因为程序只能评估一个门时间?

Vil*_*lx- 1

如果您可以禁止循环(输出链接回输入),那么您可以显着简化问题。在这种情况下,对于每一个输入,都会有一个明确的输出。然而,循环可能使输出无法确定(或者更确切地说,不断变化)。

评估没有循环的电路应该很容易 - 只需使用 BFS 算法,并将“结点”(逻辑门之间的连接)作为列表中的项目。首先,所有门的所有输入都处于“未定义”状态。一旦门“定义”了所有输入(1 或 0),就计算其输出并将其输出结点添加到 BFS 列表中。这样您只需评估每个门和每个连接点一次。

如果存在循环,则可以使用相同的算法,但可以以永远不会“休息”的方式构建电路,并且某些连接点始终在 1 和 0 之间变化。

哎呀,实际上,在这种情况下不能使用该算法,因为循环门(以及依赖于它们的门)将永远保持“未定义”状态。