2012-02-03 5 views
0

入出力回路に基づいて、C++でデジタル回路のシミュレーションを作成する必要があります。C++でデジタル回路をシミュレートする方法(入出力のみ、グラフィックスなし)

入力は一連の要素(and、and、nandなど)として、またそれらの要素のピン間の接続のリストとして与えられます(要素1の入力ピン1は要素の出力ピンに接続されます2)。

ソースは出力ピンだけの要素とみなされ、入力ファイルの終わりには、周期的なものと同様に、またはカスタム1または0のランダムな瞬間が記述されます。

プローブは回路の終わりにあり、入力ピンだけの要素と考えられ、信号の値がいつでも0または1であることを自然にチェックします。

私の質問は、どのように回路を表すデータ構造を作成するのですか?それは要素の接続リストのようなものか、あるいは各要素が他の要素へのポインタを持っているべきか?また、回路モデル全体に​​信号を転送するにはどうすればよいですか?

+0

これが宿題の場合は、そのようにマークします。これまでに何を試しましたか? –

+2

この質問には、多くの重要な詳細がないため、明確な答えはありません。例えば、回路が要素の出力を直接的または間接的にそれらにフィードバックすることができるかどうかによって、答えは全く異なるであろう。これはQ&Aサイトの質問より多くの研究プロジェクトです。 – dasblinkenlight

答えて

1
  1. スタート:

    class Component 
    { 
        Component** inputs; 
        Component** outputs; 
        int numOfInputs; 
        int numOfOutputs; 
        virtual PropagateLogic() = 0; 
    } 
    
  2. サブクラス特定の論理imlpementationsのための基本コンポーネント。

  3. コンポーネントに予想される入力/出力の数を伝えるコードを追加します。
  4. ポインタを割り当てることによって回路を接続してください。
  5. ...最後に、回路を実行するときは、入力から開始し、チェーン呼び出しの伝播を歩きます。
+1

私は '' Component ** ''と '' int''の組み合わせの代わりに '' std :: vector ''を使うことをお勧めします。こうすることで、手作業でアレイを管理する必要がなくなり、煩雑で危険です(エラーが発生しやすい)。 – wolfgang

+0

はい、公正なポイント。 –

+0

ありがとう、これは多くの助けを借りていました:) – Vidak

1

私は、構造のようなグラフを探すべきだと言いたいと思います。アクティブ/オンをオンにするかどうかを指定するフィールドを追加し、すべての着信データをアクティブな隣接ノードにリレーすることができます。しかし、これはANの方向にもう少し進むかもしれません。

+0

実際には、プリフューズライブラリで何かをすることができます。これはJavaライブラリですが、Objective-Cに変換しました。少し時間がかかりましたが、それは十分に簡単でした。 –

+0

グラフのような構造を作成するにはどうしたらいいですか? Digital ElementsでCompositeソフトウェアデザインパターンをLeavesとして使用できますか?どのようにして隣接ノードにデータをリレーできますか? :) – Vidak

+0

私はこのようなことはしていませんが、入力の配列を受け入れるノードを想像でき、情報を中継する能力に依存します。あなたはブールで再現することができ、その隣人に情報を送ることができます。これにはさまざまな方法があります。新しいノードを特定のノードに登録する、ある種のパブリッシュ/サブスクライブメカニズムを想像することができます。パブリッシングノードが何らかの情報を送信すると、さらなるアクションをとることができるサブスクライバ内でイベントがトリガされます。パブリッシュ/サブスクライブまたはオブザーバーのパターンを探すことができます。 – fuaaark

0

確実にグラフに格納します。

単純なシミュレーションでは、接続はデータフローシミュレーションで十分である必要があります。

さらに複雑な作業、たとえばhazardsを検出したい場合は、基本ビルディングブロックの遅延と配線の長さを保存する必要があります。次に、ワイヤの各変更が、デバイスの出力ワイヤ上の特定の(完全には決定的でないかもしれない)時間にトリガする時間ベースのシステムを構築することができます。あなたのコンポーネントの基本クラスと

1

Flow-Based Programming」というプログラミングパラダイムについて説明しました。

興味があれば、DSPatch(または「ディスパッチ」)と呼ばれるC++オブジェクト指向のフローベースプログラミングライブラリを作成しました。ジェネリックオブジェクト指向APIを使用すると、基本ロジック回路から本格的なエレクトロニクスシミュレーションまで、ほとんどあらゆるタイプのプロセスチェーンを作成してルーティングできます。その高速で、使いやすく、個人的な/独自の使用のための自由。

関連する問題