Verilogライクなシミュレータ
2009年2月24日
C++で次のように書ける、ロジック回路のシミュレータを作ってみた。
これは、NANDを二つつなげただけの、もっともシンプルなフリップフロップ。前にPHPで書いたものと違って、今回のは回路の内の遅延などもシミュレーションできるようにしてある。なので、ラッチやフリップフロップを組み合わせた複雑な回路のシミュレーションにも使えるはず。
使ったことないし良く分からないが、Verilogというものに構文が良く似ているようだ。既存のソフトの使い方を覚えるより、使いにくくても自作して細かな調整を自身で行うほうが、私には向いている。今回のシミュレータは、遅延時間を素子ごとにランダムに設定することもできるので、多分、回路を設計するさいの動作確認にも使える。
当該プログラムの、回路図に相当するファイル(mainboard.cpp)のソースコードは、次の通り。
実行結果は、次の通り。
bool input1,input2; logic* na1=nandGate(); logic* na2=nandGate(); na1->connect(&input1,&na2->output); na2->connect(&na1->output,&input2);
これは、NANDを二つつなげただけの、もっともシンプルなフリップフロップ。前にPHPで書いたものと違って、今回のは回路の内の遅延などもシミュレーションできるようにしてある。なので、ラッチやフリップフロップを組み合わせた複雑な回路のシミュレーションにも使えるはず。
使ったことないし良く分からないが、Verilogというものに構文が良く似ているようだ。既存のソフトの使い方を覚えるより、使いにくくても自作して細かな調整を自身で行うほうが、私には向いている。今回のシミュレータは、遅延時間を素子ごとにランダムに設定することもできるので、多分、回路を設計するさいの動作確認にも使える。
当該プログラムの、回路図に相当するファイル(mainboard.cpp)のソースコードは、次の通り。
#include "stdafx.h" #include "circuit.h" mainBoard::mainBoard(){ std::cout<<"The main board loaded.\n"; bool input1,input2; logic* na1=nandGate(); logic* na2=nandGate(); na1->connect(&input1,&na2->output); na2->connect(&na1->output,&input2); input1=H; input2=L; checkSignals(); std::cout<<input1<<input2<<na1->output<<na2->output<<"\n"; input1=H; input2=H; checkSignals(); std::cout<<input1<<input2<<na1->output<<na2->output<<"\n"; input1=L; input2=H; checkSignals(); std::cout<<input1<<input2<<na1->output<<na2->output<<"\n"; input1=H; input2=H; checkSignals(); std::cout<<input1<<input2<<na1->output<<na2->output<<"\n"; }
実行結果は、次の通り。
The main board loaded. 1001 1101 0110 1110 Push enter to exit.