ズッキーニの味噌煮込みBlog版

コンピュータのこと、食べ物のこと、なんでもないこと、とんでもないこと。

FPGAでFORTHマシンを楽しみながら作る方法

2016年04月28日 18時08分38秒 | FPGA

まだやる気が失われていないことを天に感謝しよう。珍しいことだ。

もともとの話はこうだ。少し生活に余裕ができた安心感と、そろそろ始めとかんとつぎの大波(開発屋さん的にだね)に乗れないかも知れないという不安感があって、FPGAの勉強を始めようと思い立った。こう見えても(見えないだろうが)ハードもソフトもひととおりの知識は持っている組み込み系。言っておくが「ひととおり」は謙遜だ。

やるからには、楽しくやれるネタがほしい。あるいは願望でも欲望でもいいが、なにかそういうエネルギーを持続させられるものでもいい。そこで思いついたのがFORTHという言語だ。

この言語には思い入れがたっぷりあるんだが、それはどこかに最近書いたような気がする。それはともかく、この言語はデータの受け渡しにスタックというデータ構造を使う。しかしスタックを効率的に扱える命令群を持ったCPUはこの世に存在しない。そこで仕方なく、そういうCPUをソフトでシミュレートする。まぁおおかた想像が付くように配列とインデクスを使って実現するわけだが、あまり効率はよろしくない。FORTHプログラマの多くが一度は望むことだが、CPUがFORTHが要求するスタック操作をネイティブで実行してくれたらどんなに気持ちがいいか。

もちろんFORTH「で」書くこともFORTH「を」書くことも経験してきたアタシも、そう思っていた。しかしよほどの大金持ちの道楽でもなければ、CPUを自作することなんてできようはずはない。数年前まではね。でもいまは違う。FPGAという、何度でも自由に書き換え可能なロジックデバイスがある。価格が下がってきて、評価用ボードがついに1万円を切った。すべてではなくとも、スタック操作系のプリミティブワードだけでも実行できるスタックマシンを作ることができたら、どれだけ面白いか。わかるか?わからんか?そうだよな。でも面白いんだこれは。絶対楽しいんだ。

FPGAでこれをやったら楽しい上に、FPGAそのものの勉強にもなる。長年の夢を叶えて、しかもつぎの飯の種を手にすることにもなる。スゴいじゃないか。

------- *

さて、どうやって作るかだ(え?)。

仕事ならばお客さんと打ち合わせをしながら仕様を詰めていくんだが、ここはアタシがお客さんでもある。楽しみながら自由にやっていい。先に書いたがスタックを効率的に扱えるCPUなんて秋月にもマルツにもaitendoにも取り扱いがない。前例がないんだから、試行錯誤で行くしかない。他人からみたら行き当たりばったりかも知れないが、その過程自体が楽しいんだ。だって自分で設計したFORTHマシンだぞ(はいはい、わかったよ)。

どんな仕様にすればいいのかわからないときは、まず作ってみるのが一番だ。作ってみて動かしながら、こうすればいい、ああすれば失敗だ、というふうに学んでいく。最初から全体を作り込んでしまうのは大変だから、FORTHオブジェクトを生成するコンパイラの部分は普通のCPU + C言語でやっちゃう。実行時インタプリタもまずは同様に。そこから呼び出されるプリミティブワードの処理をFPGAで記述することにしよう。これなら目的がはっきりしているので設計がしやすいし、規模が小さいから作り直しが何度でもできる。

最終的な目標はFPGAの中に、コンパイラと実行時インタプリタを駆動する汎用CPUと、スタック操作に長けた専用CPUを作り込むことだ。つい先週からFPGAの勉強を始めたトーシロにとって、これがどれだけ大それたコトかは容易に想像が付くだろう。そこでステップを踏むことにする。時間はかかるが、それだけ長く楽しめる。ぐふ。

Arduinoで、ちっちゃなFORTHを作る。ソースコードはiMacの開発環境からシリアルで流し込む。必要最小限の機能があればいい。ここはすべてが純粋にソフトの世界だ。つぎに、ソフトで実装されているスタック操作ワードを実行する機能をFPGAに作り込む。ArduinoからFPGA内のスタック操作機能を呼び出す方法は何か考える。実行速度はまだ考えなくていい。これでいろいろ使ってみて、使用感を確認して細かな仕様を練り直していく。その後でいよいよ、Arduinoよりはずっと能力が高いであろう汎用CPUをFPGAに作り込む。既に動いているスタックマシンとおなじFPGAの中にだ。

------- *

まぁそんなこんな。(^^)

------- *(本日追記)

FORTHコンパイラの入り口のところ。ソーステキストからワードを切り出すところを書いてみたが、思わぬはまりようで時間を食った。

Arduino IDE のバグなんだろうか、typedef enum{~}<name>;がコンパイルエラーになる。ヘッダファイルとして別にすると解決したという情報を見つけたのでやってみたが、このケースでは解決しないようだ。なんなんだかわからないが、まぁいいや。^^;

今夜イッパイ飲りながらオブジェクトコードのフォーマットでも考えることにしよう。コンパイラを書くことが目的ではないんだが、これはこれで楽しい。