7

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

有任何想法吗?

4

1 回答 1

4

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

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

以这种方式模拟事物的优点是,虽然模拟会在许多实际可行的电路上“失败”(产生“不确定”值),但这种模拟产生确定性结果的事实表明,构建的真实电路同样的方式也会这样做。不幸的是,对于依赖边沿触发锁存器的电路,最常见的仿真结果将是“不确定的”,即使对于实际工作机会为 100% 的电路也是如此。为了缓解这个问题,人们经常想要“诅咒”几个门,以免拉长“不确定”区间。这样做是一种“作弊”,并且会产生电路可能在模拟中工作但在现实中失败的可能性。尽管如此,如果小心地应用这些作弊,

于 2013-01-13T01:17:05.667 回答