【问题标题】:How to detect oscillations in gate logic simulations?如何检测门逻辑仿真中的振荡?
【发布时间】:2023-03-27 04:53:02
【问题描述】:

我正在用 C# 编写基于循环的逻辑仿真。我想模拟组合电路和时序电路。组合电路很简单,但顺序电路给我带来了麻烦。

我想检测振荡并显示适当的警告消息。有没有一种简单的方法可以检查单个门可以改变多少次状态并仍然保持电路稳定?

我想到了“最小反馈弧集算法”,但它似乎有点矫枉过正。许多桌面应用程序执行速度很快,所以我怀疑他们是否在使用它。

我还发现了建议使用三元逻辑(0、1、未知)的论文,并将算法分为两部分 - 一个初始化电路,一个进行实际计算 - 但它说的是“如果算法 A 不终止电路有振荡'这对我没有任何帮助,因为没有办法停止时钟周期并警告用户。

您知道“Logisim”或“数字作品”等应用程序如何检测振荡吗?

【问题讨论】:

  • 我能想到一个简单的算法:计算整个网络的所有逻辑层两次。如果(至少)其中一个值发生了变化,那么你就有了振荡。
  • 简单 RS 触发器中的门可以改变其状态两次并保持电路稳定(第三次评估可以判断是否存在振荡) - 如果以正确的顺序计算。正确的顺序是指人类使用手动解决电路的顺序。如果我使用简单的 DFS 算法,同一个门可以多次更改其状态。 tinyurl.com/py4z7ol我不是很确定,但我怀疑如果门在更多的反馈周期内,它需要计算三、四、五次——如果有人能证实这一点,我将非常感激。
  • 对,我没想到。是的,第三轮会有所帮助。至于正确的顺序:不就是从输入开始那么简单吗?
  • 很遗憾,没有。如果门 A 连接到门 C,门 B 连接到门 C,则顺序为:A 然后 B,然后 C。不能直接到 C,否则您必须稍后重新计算。
  • 在我的阅读中,“输入”是整个电路的输入;只有门的输入连接的结。

标签: algorithm simulation boolean-logic circuit


【解决方案1】:

Verilator 是一个逻辑模拟器,它通过将可综合的 Verilog 编译成 C 代码来工作。

它尝试构建一个保证稳定的逻辑顺序,但如果失败,它会发出一些 UNOPT 和 UNOPTFLAT 警告,并简单地重复模拟多次,直到没有任何变化。

默认情况下,在报告收敛失败之前使用 100 轮,但这可以使用参数 converge-limit 进行更改。

【讨论】:

  • 这在检查电路是否稳定时很好。但是在桌面应用程序上,我想让用户构建非门控 rs 触发器和计算 sin(x) 的简单 cpu。恐怕我不能每个时钟周期检查整个电路 100 次。
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多