(ほんとは5命令だったんだけど、このネタに使うのに1命令追加した)以下が命令です。内部的には最初のコマンド以外、殆ど同じ動きをします。GO_IF_NON_ZERO_ELS_SUBスタックがゼロなら引数xxで示したアドレスへ、否ならスタック-xxをスタックに格納。bitだけ取得したストリームの下位8bitをスタックする。マシン語0x81,xxPIPE_EXTERNAL_TO_FIFO外部のデータをxxビットだけFIFOにセットする。マシン語0x82,xxGET_STREAM_AND_SUBSTスタックの値-取得したストリームxxを計算しスタックを上書き。マシン語0x83,xxPIPE_SEEK_BITS(通常は命令としては使わない。Nop命令の代わりにはなるかもしれない)。マシン語0x84,xxGET_STREAM_PUSH_OUT(これがネタ用に追加した命令)GPIOに引数xxを反映させる。これで思う存分Lチカができるってワケ。マシン語0x85,xx命令から推測がつくかもしれませんが、シリアルデータを右から左に流したり、条件によって複数あるデータ出力先を切り替えたりする「少し気の利いたFIFO」的なものを作ってました。条件が増え、デバイスによっては複雑な初期化シーケンスが必要なものもあると、回路規模が増大します。AlteraのMAXII/MAXVはデバイスの規模にかかわらず1KByteのユーザーフラッシュ(UFM)があるので、初期化手順をここに記述してしまい、回路規模を抑えようというのが経緯です。冒頭で示した図が、今回作ったCPUのブロック図です。UFMのデータを操作する手段はいくつか提供されていますが、どの手段でもユーザーロジックを消費します。Mode)としてインスタンスしています。回路規模はたったの40LEです。このCPUはこのUFMからコマンドとデータをシリアルリードする設計のため命令体系も回路も独特な構成になっています。EEPROMを接続したFPGAなら少しの変更で実装可能なはずです。使い方1.コマンドとプログラムを格納するUFMをMegaWizardでインスタンスします。modeを選択しました。CPUメインのverilogコードがプロジェクトトップに来るようにします。コード中の8bitカウンタCountrは今回のブログ記事のためにクロックを分周するのに使っています。必要ない場合は取り除きます。(コードはブログ最後に記述しました)3.Lチカマシン語でLチカプログラムを書きUFMに保存します。II上でUFMに流し込むバイナリを作ります。アドレスは16bitモードであることに注意してください。