Loops 如何在数字逻辑模拟器中处理循环?

Loops 如何在数字逻辑模拟器中处理循环?,loops,circuit,digital-logic,Loops,Circuit,Digital Logic,我正在开发一个数字逻辑模拟器,以便以后在其中构建我自己的CPU(因此这是一个长期项目)。对于没有环路的电路,例如全加器,一切都很好。然后还有类似SR锁存器的电路,其中一个门的输入连接到另一个门的输出。所以我在一个循环中,因为两个门都需要另一个门的输出来计算它们自己的输出。 解决这个问题的最好办法是什么?我以某种方式实现了它(当检测到循环时),它将返回它的最后一个输出。或者,当此运行是第一次运行时(因此没有以前的输出),我将返回零(低)。所以我假设所有的输出在开始时都是低/零。到目前为止,这是可行

我正在开发一个数字逻辑模拟器,以便以后在其中构建我自己的CPU(因此这是一个长期项目)。对于没有环路的电路,例如全加器,一切都很好。然后还有类似SR锁存器的电路,其中一个门的输入连接到另一个门的输出。所以我在一个循环中,因为两个门都需要另一个门的输出来计算它们自己的输出。
解决这个问题的最好办法是什么?我以某种方式实现了它(当检测到循环时),它将返回它的最后一个输出。或者,当此运行是第一次运行时(因此没有以前的输出),我将返回零(低)。所以我假设所有的输出在开始时都是低/零。到目前为止,这是可行的,但我相信这不是解决问题的好办法


有什么想法吗?

在许多情况下,简单地将每个门建模为具有单位传播延迟是一种很好的方法。一个稍微复杂的替代方案是让大多数组件的“模拟步骤”例行程序检查模拟时间是否提前了“完整步骤”,并且只有在这样的情况下才更新其输出;一些组件可以忽略该检查,但在其他组件有机会更新后,请求在模拟步骤上再次运行它们。这将允许一些组件假装具有零传播延迟,前提是它们没有嵌套太深(模拟应限制在确定组件不会达到稳定状态之前尝试运行每个组件的评估状态例程的次数)

根据模拟的具体情况,我建议您的组件除了“高”和“低”之外还有多种输出状态。即使添加“不确定”状态也会有所帮助,因为当组件的输入以可能影响其输出的方式更改时,输出将在最短传播时间后变得“不确定”,并在输入生效后的最长传播时间后假设一个合法值。请注意,随着信号通过更多级别的逻辑,它们“不确定”的时间量将增加。要有意义地模拟任何事物,唯一的方法就是拥有一个假定为稳定的时钟,并确保时钟周期足够长,使它们之间的事物完全稳定


以这种方式模拟事物的优点是,虽然模拟将在许多实际工作的电路上“失败”(产生“不确定”值),但这种模拟产生确定性结果的事实表明,以同样方式构建的真实电路也会这样做。不幸的是,对于依赖于边缘触发锁存器的电路,最常见的模拟结果将是“不确定的”,即使对于实际工作几率为100%的电路也是如此。为了缓解这一问题,人们通常希望“倒霉”几个门,以免延长“不确定”的间隔。这样做会有点“欺骗”,并造成电路可能在模拟中工作,但在现实中失败的可能性。尽管如此,如果仔细应用这些欺骗,它们可能会使模拟比其他情况更有用。

在循环中,是计时还是使用异步?在初始值上,通常硬件假设为随机状态,并且需要一个外部触发的复位功能来为程序计数器等最少需要的东西创建已知状态。在这个级别模拟异步数字逻辑是很棘手的,因为某些行为(如边缘触发逻辑)依赖于传播延迟等。的确,即使是建模简单的东西,如SR闩锁,在一般的方式是不平凡的;你是如何处理外部输入的?你可以问,在这里好运气确实很有意义。我没想到会这么复杂。我不知道为什么我认为,我可以忽略传播延迟。谢谢我会尝试一些方法,看看是否有效。