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

时间:2013-01-13 00:59:44

标签: loops circuit digital-logic

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

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

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

根据模拟的确切内容,除了“高”和“低”之外,我建议为组件提供多种输出状态。即使添加“不确定”状态也是有帮助的,当组件的输入以可能影响其输出的方式改变时,输出将在最小传播时间之后变为“不确定”,并且在最大值之后呈现合法值。输入变为有效之后的传播时间。请注意,当信号通过更多级别的逻辑时,它们“不确定”的时间量将增加。模拟任何有意义的东西的唯一方法是让一个假设稳定的时钟,并确保时钟周期足够长,以便事物可以在它们之间完全稳定。

以这种方式模拟事物的优势在于,虽然模拟将在许多电路上“失败”(产生“不确定”值),而这些电路在现实中起作用,但这样的模拟产生确定性结果的事实将表明真实的电路也是这样建造的。不幸的是,对于依赖于边沿触发锁存器的电路,最常见的仿真结果将是“不确定的”,即使对于具有100%实际工作机会的电路也是如此。为了解决这个问题,人们常常想要“jinx”几个门,以免延长“不确定”的间隔。这样做会产生“欺骗”,并且可能会使电路在模拟中起作用但在现实中失败。尽管如此,如果仔细地应用这些作弊,它们可能使模拟比其他方式更有用。