【问题标题】:How to simulate a digital circuit with C++ (just input/output, no graphics)如何用 C++ 模拟数字电路(只有输入/输出,没有图形)
【发布时间】:2012-02-03 14:40:45
【问题描述】:

我需要基于输入/输出基础在 C++ 中创建数字电路的仿真。

输入以一系列元素(或、and、nand 等)和这些元素的引脚之间的连接列表给出(即元素 1 的输入引脚 1 连接到元素 2 的输出引脚)。

源被认为是一个只有一个输出引脚的元素,在输入文件的末尾,源被描述,比如它是周期性的,还是它在随机时刻的自定义 1 或 0。

探针位于电路的末端,它被视为只有一个输入引脚的元件,自然会在任何时间点检查信号的值是 0 还是 1。

所以我的问题是,如何创建表示电路的数据结构?它可以像一个元素的连接列表,还是每个元素都应该有指向其他元素的指针?以及如何在整个电路模型中传输信号?

【问题讨论】:

  • 如果这是家庭作业,请标记为这样。到目前为止,您尝试过什么?
  • 这个问题没有一个明确的答案,因为它缺少很多重要的细节。例如,根据电路是否允许将元件的输出直接或间接反馈给它们,答案将完全不同。这更像是一个研究项目,而不是问答网站的问题。

标签: c++ oop data-structures signals simulation


【解决方案1】:

您所描述的是一种名为“Flow-Based Programming”的编程范例。

如果您有兴趣,我开发了一个 C++ 面向对象的基于流的编程库,名为 DSPatch(或“dispatch”)。通用的面向对象 API 允许您创建和路由几乎任何类型的流程链,从基本逻辑电路到成熟的电子仿真。它快速、非常易于使用,并且免费供个人/专有使用。

【讨论】:

    【解决方案2】:
    1. 从组件的基类开始:

      class Component
      {
          Component** inputs;
          Component** outputs;
          int numOfInputs;
          int numOfOutputs;
          virtual PropagateLogic() = 0;
      }
      
    2. 为特定的逻辑实现子类化基础组件。

    3. 添加代码以告知组件预期有多少输入/输出。
    4. 通过分配指针连接您的电路
    5. ...最后,当您想要执行您的电路时,从输入开始并沿着调用传播链走下去。

    【讨论】:

    • 我建议使用std::vector<Component*> 而不是Component**int 的组合。这样一来,您就不需要手动管理数组,这既麻烦又危险(容易出错)。
    • 是的,公平点。有各种方法可以简化/复杂化/改进我的建议,我只是想举一个非常基本的例子..
    • 你能提供一个传播方法的例子吗?我将如何实现它以遍历整个结构?
    【解决方案3】:

    我会说你应该寻找一个类似结构的图形。您可以添加一个字段,指定其是否处于活动/打开状态,并将所有传入数据中继到活动的相邻节点。但这可能会更倾向于 AN。

    【讨论】:

    • 事实上,您可以使用 prefuse 库做一些事情。是一个Java库,不过我把它转成Objective-C,花了点时间,不过还是够简单的。
    • 如何创建类似图形的结构?我可以使用带有数字元素作为叶子的复合软件设计模式吗?如何将数据中继到相邻节点? :)
    • 我没有做过这样的事情,但我可以想象一个节点接受一组输入,并且依赖于它传递信息的能力 c.q.开启或关闭,你可以用一个布尔值来表示,向它的邻居发送信息。有许多不同的方法可以解决这个问题。我可以想象某种发布/订阅机制,您可以在其中将新节点订阅到某个节点。当发布节点发送一些信息时,订阅者中会触发一个事件,您可以对其采取进一步的操作。您可以查找发布/订阅或观察者 oattern。
    【解决方案4】:

    绝对将其存储在图表中。

    对于简单的模拟,存储连接应该足够了,带有数据流模拟。

    如果你做一些更复杂的事情,例如想要能够检测到hazards,你必须存储基本构建块的延迟和电线的长度。然后,您可以构建一个基于时间的系统,其中线路上的每次更改都会在设备输出线路上的特定(可能不是完全确定的)时间触发。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 2020-02-13
      • 2021-04-29
      • 2020-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多