FPGAにBrainF**kインタプリタを実装する話

Pocket

+-><[].の羅列によるプログラミング言語BrainF**kは,使うには苦労しますが,実装するのは簡単です.

というわけで(?),Synthesijerのサンプルとして同梱されている実装の試し方を紹介します.このサンプルは同じソフトウェア(BarinF**kインタプリタのカーネル)がPCでもFPGAでも同じように動作する事例です.

準備

Synthesijer-1.1からjarファイル(本体)とサンプルのzipファイルをダウンロードしてください.ダウンロードしたら解凍してソースコードをコンパイルします.

cd $WORK/synthesijer_samples/sample/bf
export $WORK/synthesijer-20140818.jar make

PCで動作を確認する

FPGA上で動かす場合にはRS232C越しでプログラムの入出力や結果の表示を行いますが,ソフトウェアとして実行する場合には,標準入出力を使うのがよいでしょう.また,プログラムの実行を開始するためのmainメソッド(とそのクラス)も必要です.

そのために用意されているシミュレーションのためにだけ必要なソースコードが,

  • sim/IO.java
  • sim/Sim.java

です.次のようにしてコンパイルします.

cd sim
javac -cp .:.. *.java

実行するときは,$WORK/synthesijer_samples/sample/bf/IO.javaに優先するように,クラスパスの指定順序に気をつけて次のようにして実行します.

java -cp .:.. Sim

$WORK/synthesijer_samples/sample/bf/sim の下に brainf*ck で紹介されているコードをおいていますので,コピー&ペーストすれば結果が得られます.

FPGAで動かしてみる

Avnetの評価ボードであるMicroBoardで簡単に試せるようにサンプルのトップモジュールとUCFファイルが$WORK/synthesijer_samples/sample/bf/microboardの下に用意されています.もしISEにパスが通っている場合,次のようにして一気にbitファイルまでできあがります.

make all

出来上がったbitファイルをMicroBoardに送り込みシリアルターミナルを9600bpsに設定すれば,BrainF**kインタプリタにアクセスできます.もちろん,BrainF**kプログラムをペーストすれば,シミュレーションで確認したのと同じように実行されます.

MicroBoard以外の場合には,

make microboard_top.vhd

としてトップモジュールを生成し,クロックとRS232Cの入出力ピンを適切にucfやxdcで設定,ISEやVivadoで必要なファイルを含むプロジェクトを作って合成すれば動作を確認できるはずです.