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を作成しました。
コメント