Moiz's journal

プログラミングやFPGAなどの技術系の趣味に関するブログです

Brainf**k CPU でマンデルブロー集合を試してみた

FPGA上で動作するBrainf**k CPUを使ってマンデルブロー集合を表示させてみる

Brainf**kで書いたマンデルブロー集合を計算するプログラムがある、と聞いてずっと自作のBF CPUで動作させたいと思っていました。HDLを改造することで動作させることに成功したので、紹介します。

f:id:uzusayuu:20170529031603j:plain

変更点

Brainf**kでマンデルブルロー集合を計算するプログラムはこちらのものを使用

Index of /brainfuck/utils/mandelbrot

作者はErik Bosman氏だとクレジットがありますが、氏のホームページやオリジナルのリポジトリなどは見つかりませんでした。ちなみにコードの抜粋はこんな感じです。

A mandelbrot set fractal viewer in brainf*** written by Erik Bosman
+++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[
>>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+
<<<<<<<+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>>

こちらのプログラムは約12KBですが、BF CPUは4Kまでのプログラムしか保存できないので、ROM容量を16KBまで増やしました。Brainfu**kのコードをROMのデータ(MIF形式)に変換するツールtxt2mifも16KB対応にしました。

また、Manderblot.bの出力は128x48文字ありますが、BF CPUが動作するDE0の液晶には16x2文字しか表示できないので外部に出力させる必要があります。そのため、UART出力(TXDのみ)をVerilo-HDLで実装し、PCのコンソールに表示できるように変更しました。

 

f:id:uzusayuu:20170529031111j:plain

今回の変更点はgithubリポジトリーに反映させてあります

github.com

結果

シミュレーションによる検証をへて、実機で動作させたところ一回目のテストで実行できました。(検証大事!超大事!) 

www.youtube.com

これでも50MHzで動作して、ほぼ毎クロックに1コマンド実行しているはずなんですが、いやはや、遅いですね。

まとめ

Brainfu**kを直接実行するCPUをFPGA上で動作させて、マンデルブロー集合を計算し、UART経由でPCのコンソール上に表示させました。内容はすべてGithubで公開しています。

これでBrainf**k CPUでやりたかったことは一通り終わりましたが、何か思いついたらまたやってみようと思います。