我正在开发一个数字逻辑模拟器,以便稍后在其中构建我自己的 CPU(所以这是一个长期项目)。对于没有循环的电路,例如全加器,一切都非常有效。还有像 SR 锁存器这样的电路,其中一个门的输入连接到另一个门的输出。所以我陷入了循环,因为两个门都需要另一个门的输出来计算自己的输出。
解决这个问题的最佳方法是什么?我以某种方式实现它,(当检测到循环时)它将返回最后的输出。或者,当这是第一次运行时(因此没有先前的输出),我将返回零(低)。所以我只是假设所有输出一开始都是低/零。到目前为止它有效,但我确信这不是解决问题的好方法。
有任何想法吗?
在许多情况下,简单地将每个门建模为具有单位传播延迟是一种很好的方法。一个稍微复杂的替代方案是让大多数组件的“模拟步骤”例程检查模拟时间是否提前了“整步”,并且仅在是的情况下才更新其输出;一些组件可以省略该检查,而是请求在其他组件有机会更新后在模拟步骤中再次运行它们。这将允许某些组件假装具有零传播延迟,只要它们没有嵌套太深(模拟应该限制在决定组件不会执行之前尝试运行每个组件的评估状态例程的次数)达到稳定状态)。
根据具体模拟的内容,我建议您的组件除了“高”和“低”之外还有多种输出状态。即使添加“不确定”状态也会有所帮助,因为当组件的输入以可能影响其输出的方式发生变化时,输出将在最短传播时间后变得“不确定”,并在最大传播时间后呈现合法值输入有效后的传播时间。请注意,随着信号通过更多级别的逻辑,它们“不确定”的时间将会增加。有意义地模拟任何事物的唯一方法是拥有一个假设稳定的时钟,并确保时钟周期足够长,以便事物可以在它们之间完全稳定。
以这种方式进行模拟的优点是,虽然在许多实际工作的电路上模拟会“失败”(产生“不确定”值),但这种模拟产生确定性结果的事实表明,构建的真实电路同样的方式也会这样做。不幸的是,对于依赖边沿触发锁存器的电路,最常见的模拟结果将是“不确定的”,即使对于实际工作的可能性为 100% 的电路也是如此。为了缓解这个问题,人们通常会想对一些门进行“恶咒”,以免延长“不确定”的间隔。这样做有点像“作弊”,并且可能会导致电路在模拟中工作但在现实中失败。尽管如此,如果仔细应用这些作弊手段,它们可能会使模拟比其他方式更有用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)