D-FFを作成する SystemC

SystemCでD-FF(Dフリップフロップ)を作成します。

dff.cpp
#include <systemc.h>

SC_MODULE(DFF) {
    // ポート宣言
    sc_in_clk clk; // クロック入力
    sc_in<bool> d; // 入力
    sc_out<bool> q; // 出力

    // DFFの動作を記述するメソッド
    void dff_process() {
        while (true) {
            // rising_edge関数はクロックの立ち上がりエッジを検出
            if (clk.posedge()) {
                // データをクロックエッジでフリップフロップに反映
                q.write(d.read());
            }
            // waitメソッドでイベントを待つ(この場合、1クロックサイクル分)
            wait();
        }
    }

    // コンストラクタでSC_THREADマクロを使用
    SC_CTOR(DFF) {
        // dff_processメソッドをSC_THREADで登録
        SC_THREAD(dff_process);
        sensitive << clk;  // クロックが変化するとスレッドが起動するように設定
    }
};

int sc_main(int argc, char* argv[]) {
    sc_signal<bool> d, q;
    sc_clock clk("clk", 10, SC_NS);  // 10ナノ秒周期のクロック生成

    // DFFモジュールのインスタンス化
    DFF i_dff("i_dff");
    i_dff.d(d);
    i_dff.clk(clk);
    i_dff.q(q);

    // シミュレーションの実行
    d.write(0); // 0 を書き込み
    sc_start(100, SC_NS); // 100ナノ秒のシミュレーションを実行
    std::cout << q.read() << std::endl;

    // 入力データを変更
    d.write(1);
    sc_start(100, SC_NS);
    std::cout << q.read() << std::endl;

    return 0;
}

実行結果

0
1

まとめ

SystemCでD-FFを作成しました。

コメント

タイトルとURLをコピーしました