ズッキーニの味噌煮込み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>;がコンパイルエラーになる。ヘッダファイルとして別にすると解決したという情報を見つけたのでやってみたが、このケースでは解決しないようだ。なんなんだかわからないが、まぁいいや。^^;

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


FPGAでFORTHマシンを作る(かどうかできるかどうかわからんので単なる希望)

2016年04月26日 12時29分47秒 | FPGA

決してメジャーではないがそれなりに使われている、FORTHという言語がある。

関数(FORTHではワードと称する)の引数と戻り値がともにスタックを経由する。またコンパイラは中間コード(threadedコード)を生成し、インタプリタがこれを実行するという構造。そのため文法も普通じゃない(笑)という強烈な個性を持つ。

この系統のSTOICというコンパイラを開発した人が「EPSONが私のこのSTOICを開発に使ってくれたんじゃないかと想像している」と書いていたり、実はアタシはEPSONに在籍していたことがありプリンタのファームウェアの開発現場で端末画面にFIFTHというおなじくFORTH系のコンパイラが使われていたことを知っていたり、まぁアタシにとってはいろいろとご縁のある言語なんだ。

しかしなんといってもアタシをこのクセの強い言語に結び付けたのは、この世界での最初の恩師、三浦高志さんだ。アタシに8bitマイコンプログラミングの手ほどきをしてくれた三浦さんがその教材に選んだのが、I/O誌に掲載されたTinyFORTHのアセンブルリストだったからだ。ご自身で何枚かのフローチャートを書いてくださり、「ね、ここでEnterを押すといままで入力された文字列の先頭アドレスをDEレジスタに持ってディクショナリ、辞書ね、ここをサーチするわけ。で、見つけたらその先頭番地を持ってこっちの実行時インタプリタに飛ぶのさ」とていねいに教えられた。いまその場面を思い出してもドキドキワクワクしてくるが、おかげでアタシはZ-80のアセンブラよりむしろ早く、FORTHというコンパイラを覚えたわけだ。

もちろんそのときそう思ったわけではないが、その後のプログラマ人生の中で何度か自分自身でFORTHコンパイラを開発するたびに「これをそのまま実行するFORTHエンジンがあったらなぁ、ほしいなぁ」と思ったものだ。FORTHという言語の核は「スタックアーキテクチャのFORTHというCPU」であり、それをソフト的にシミュレートすることでシステムが実装されているのだ。だからこれをソフトシミュレータではなく専用のハードで動かすことができたらと思っても、そう不思議はないだろう。普通のソフト屋(?)ならそう思わないかも知れないが、アタシはソフト屋にしてはかなりハードに詳しかったので。まぁ普通のソフト屋はFORTHとか使わんか。^^;

------- *

FPGAやろうかなと思ったのはFORTHとは関係ない話なんだが、上に述べたような願望があったのですぐに「あ、こいつであれ作れるじゃん」とひらめいたのだ。そうなると俄然やる気が湧いてきた。Google先生を蹴飛ばして情報集めをすると、最近のFPGAは能力が高く、CPUをその内部に構築することも可能だと書かれている。つまりFPGAを汎用CPUにすることができるというのだ。

FORTHマシンを作るといっても、ソースコードを食わせるコンパイラは文字列を扱うので、さすがにデジタルロジック回路では実装しにくかろう。それはFPGA内に構築した汎用CPUに任せる。そして空いたスペースを使ってFORTHの核となるデータスタックとリターンスタック、そしてそれらを操作する機能を実装すればいい。とまぁ、バラ色の脳味噌で夢は膨らむ。

最初のうちはハードであるFPGAも、それにロジックを教え込むソフトであるHDLという言語も、なによりそれらをすべて含むカスタムICの世界観というものがなかなか頭に入ってこない。無理やり押し込んでも今度は腹にストンと落ちない。数日ジタバタしたあげく、まぁいいか、とにかくFPGAの中にスタックマシンを実装してみよう。その動きを見ながら先のことを決めていけばいいじゃないかと腹を固めた。

そう決めたので改めて、その方向で勉強を始めた。まずはVerilog HDLという言語の勉強を始めたわけだが、どうもなぁ…スッキリしない。今朝わかったんだが、HDLがなまじ言語の体裁を持っているため、どうしてもソフト屋の頭で考えてしまうようだ。違う違う、そうじゃなくて、アタシはいまICを設計しているのだ。父ちゃん、わかったよ。

どうすれば使いやすいスタックマシンが作れるか、その一点に集中すればいい。FORTHコンパイラが吐き出したthreadedコードを実行する際に肝心要のスタック操作、たとえばDUPというプリミティブなスタック操作ワードをこの専用ICにどう実行してもらえばいいのか、結果をどうもらえばいいのか、そう考えたらいいんだと気が付いた。やれやれトシは取りたくない。若かったころなら一瞬でここまで行き着いたものだろうに。まぁそれでも一瞬と数日の違いだ。たいした差ではない。あはは。

------- *

という次第で、お勉強は続くのだった。


FPGAの勉強のために買った本

2016年04月24日 10時34分24秒 | FPGA

あくまでも現時点(2016/04/24)の話ね。昨日も投稿をひとつ書いたばかりなんだけど、忘れないうちに書いておこうと思っているだけだ。「これから毎日ばりバリ書きますよぉーっ」というつもりじゃない。そんなエネルギーも根気も真摯さも、ない。^^;

8bitマイコンの時代にこの世界に入った。工業高校電子科卒業後に勤めたのが電力会社の通信部門、趣味はアマチュア無線と来たもんだから、ソフトかハードかというとハードに近いところにいた。初めて手にしたマイコンはCRC-80というZ-80搭載のワンボードマイコンキットで、もちろん自分でハンダ付けして動かした。それからはほとんどソフトの世界にいたんだが、ハードがわからないわけじゃないので機会があるとボードコンピュータで遊んだりはしていた。74xxシリーズみたいな基本的なロジック回路はそんなことをしながら自然に身に付けていった。遡れば父親は旧国鉄の通信屋で、物心ついたときにはオモチャ代わりに父親が与えた[*1]ジャンクの電子部品に囲まれていた。恵まれているっちゃあ、そうだ。

ハードウェアとソフトウェアのどこかにいたわけじゃなくて、この間をフラフラしていたわけだ。しかも子供のころのハードウェアはどちらかといえばアナログ系で、おおざっぱに言えばいまのこの業界では「ソフトもハードもやってます。ハードはデジタルだけじゃなくアナログも経験ありますが、なにか」的な立場だ。もちろんウソではないが、それぞれそんなに深くはない。まぁ冗談のつもりで言っているんだよね。

[*1] 既に他界した父親は「与えた覚えはない。気が付いたら息子が勝手にバラして部品取りしていた」と目を細めていたそうだ。

------- *

さてFPGAをやろうと思い立ったんだが、ほとんどわかっていない。わかっているのは、なにかC言語みたいなもので書いた論理を焼き込む(これがFPGAに関してはあまり正確な表現ではないことはあとで知った)ことで自分仕様のICを作ることができるということくらいだ。やる人はこれで自分用のCPUを作ったりしているらしい。すす、すげぇ。

とにかく敵(テキなのか?)を知らなくてはと思ってGoogleをぶん回した。一番ピンと来たのがこのリンクだ。

ハード素人が32bit CPUをFPGAで自作して動かすまで読んだ本のまとめ

読んでいくと、この本にぶち当たった。

CPUの創りかた

これはFPGAの参考書ではない。TTLロジックIC10数個で4bitマイコンを作っちゃおうという「気は確かか」な内容だ。詳しい説明はしないが、ちょっと惹かれた人は表紙には目をつぶっていますぐポチるべきだ。内容はごく真面目なんだが筆者の昭和なギャグセンスが炸裂して、面白いなんてもんじゃない。腹筋が崩壊する。

さてそれで思わぬ寄り道をすることになったが、元に戻る。脱線人生のアタシには珍しいことだ。

------- *

いろいろ調べてみると、新しい情報にやたらと「MAX10」というキーワードが出てくる。どうやらこれがいま注目の最新FPGAらしい。FPGA評価用ボードの価格はちょっと前までは安いものでも1万円を超えていたのに、こいつは6千円~8千円ほどで手に入りそうだ。せっかくだから(なにが?)これでいこうかと仮決めし、この子の情報をたどり始めた。

見ていくと、安いけれども決してホビースト相手のオモチャではないことがわかってきた。シリーズ中の小規模なものでも実装できるロジック数は充分で、32bitCPUを余裕で実装できるとある。しかもコンフィグレーション用にフラッシュメモリが内蔵されていて、扱いやすい。CPUの実装くらいはほとんどのFPGAで可能だが、コンフィグレーション用フラッシュメモリ在中というのが気に入った。

FPGAは基本的にRAMなので、電源が切れるとせっかく実装したロジックをすべて忘れてしまう。だからFPGAの外になんらかの不揮発性メモリを用意しておき、起動するたびにこいつからFPGAにロジックを書き込んでやらなければならない。当然そのためのスペースと回路構成が必要なので面倒だ。これがなくてもいい(内蔵しているから)というのは将来評価用ボードから自前の基板を起こすことを考えたときに嬉しい。ちょっとだけだけどね。たぶんそれよりは「やり方、新しい」というのが気に入ったんだろう。

さらに調べていくと、どうもMAX10の評価用ボード(全部品実装済み)が付録になっている書籍があることがわかった。電子部品通販のマルツさんからもボードが出ているが、書籍付録のものはこれと同等でタッチピンとDRAMが省略されているらしい。タッチピンくらいハンダ付けできるし、そう巨大複雑なものは最初は無理だから、DRAMはなくてもいい。ほしければあとからハンダ付けできるようにパターンは引かれている。それでまずこれを注文した。

FPGA電子工作スーパーキット

あ、言っとくけどCQ出版の書籍はCQのWebショップから買った方がいい。いつものクセでAmazonから買おうとすると、Amazon本体ではなく出展業者がとんでもなく高い値段を付けて売っている場合がある。CQのWebショップで4,860円で売っている(これが定価)ものがAmazonでは7,788円(2016/04/24現在)だ。気をつけようね。

これで評価用基板は手に入った。部品を揃えてハンダ付けすれば使える書き込み用の基板も付いている。準備(の準備)は整った。しかし書籍の内容が入門者のアタシにはかなり高度だ。はっきり言って治療中の虫歯が痛むくらい歯を食いしばっても追いつかない。全然わからないものでも何度も何度もしつこく読むとわかってくることがあるのは経験済みだが、ここは楽をしたい。

そこでこの本はそれなりの力が付いてからまた読むことにして、もう少し入門レベルの本がないかと探した。さっきのリンクにそれを見つけたので、さっそく注文。

インターフェースZERO No.04 Hello Worldから始めるFPGA入門: 2大メーカXilinx,Alteraのお手軽ボードでチョコッと体験!

これはわかりやすい。これでも壁が高すぎると感じる人は、基本的なロジック回路の勉強辺りからちゃんとやらないとダメかも知れない。フリーのHDL開発環境のインストールがWindows以外だとちょっと面倒かも知れない(ちなみにアタシはMacOSⅩ)が、そこはGoogle先生のお尻を叩いて「iverilog MacOS インストール」くらい食わせれば必要な情報は見つかる。アタシの場合は、ビールが浸みた脳味噌でも30分程度でなんとかターミナルモードで動く環境は手に入った。

この「Hello Wordから始めるFPGA入門」というのがアタシみたいに中途半端に知識のある人間には「なんぢゃそれ」だが、ウソは書いていない。要するにIcarus VerilogというソフトにはHDLのソースコードにコンソール入出力を記述する能力があるので、それでコンソールに文字列を表示することができる。まぁちょっと譲れば「VerilogでHello World」と言えなくもない。これで取っつきの悪さを解消できるならばいいことで、編集者のセンスと度胸をむしろ褒めたい。

いまはこれを勉強中だが、もう1冊注文している。

FPGAマガジンNo.13 入門もホビーもピッタリ! ワンチップFPGA=MAX 10

いま読んでいる方はFPGAとVerilogの入門書だが、こちらはMAX10の入門書として役に立ってくれることを期待している。まだ発売になっていないので予約注文の段階だが、いまから届くのを楽しみにしているところだ。

次回の投稿(いつだかわからんが)では、MAX10に実装しようとしているFORTHという言語システムについて少し書こうと思う。技術解説をするつもりではないことをあらかじめお断りしておく。(^^)


FPGAを始めた理由(わけ)

2016年04月23日 16時01分47秒 | FPGA

何度でも自由に書き換えが可能で、ユーザが自分用に好きなロジックICを作ることができるFPGA(Field Programmable Gate Array)には前から興味があったが、心理的ならびに経済的(笑)障壁が高くて手が出せないでいた。あるシステムハウスの自社製品開発にコンサルとして参加させてもらうようになり、このごろようやく障壁(主に経済的な)が低くなってきたので、ちょっと手を出してみるかという気になった。

以下、今日から始めたFPGA入門者が書くことなので間違いだらけかも知れない。頭から信じ込んだりはしないようにお願いしたい。いやまぁ信じるのは勝手だが、なにがあっても訴えるのだけはやめてね。^^;

これは大変魅力的な製品だ。HDLという言語でロジックを記述すると、FPGAの中にそのとおりのICが実現される。74XXシリーズはもとより、力量と暇な時間が山ほどあれば、CPUさえ実装することが可能だ。「だ」と言い切ってしまったが、やったことがないので聞いた話だ。まぁ、正しいんだろう。

実は30数年前にマイコンの世界に飛び込んだときから、夢に見ていたことがある。FORTHのプログラムを実行するFORTHマシンを自分の手で作ることだ。スタックオリエンテッドなこの言語は、そのほとんどがスタック操作ワード群をソフト的にシミュレートする仮想FORTHマシンによって構成されている。だからほら、普通のCPUにアセンブラとかコンパイラでFORTHのコンパイラや実行時インタプリタを実装しているんだよ。

しかしこれはあくまでもシミュレータだ。そうじゃなくて、FORTHのオブジェクトをそのまま実行できるCPUがあったらすげーなと思っていた。実際、当時のマイコン誌でそうした製品を見たことがある。いや、もしかしたらPASCALのPコードを実行するPASCALマシンだったのかも知れないけど。

------- *

FPGAを自由に操るにはHDLという言語を使わなくてはならない。言語というものはなんであれ、「誰かに何かを伝えるもの」だ。それなしに言語を学ぶというのは日本の学校の英語教育みたいなもので、何年学んでも誰にも何も伝えられない。教育論を展開するつもりはないしその資格もないんだけど。

んでアタシの場合はこれがはっきりしていて、FORTHマシンを作りたいのだ。つまりFPGAにFORTHを実行する方法を伝えたい。ずいぶんはっきりとした話で、我ながら恍惚となっている。目的がはっきりしているので、たぶんこの学習はうまく行くだろう。FORTHマシンが無事に、いやヨタヨタとでも動き始めたころには、FPGAとHDLに関してあらかたの知識は身に付いているはずだ。しかも長年の夢が叶っている。こんなうまい話はない。

------- *

それで取りあえず、参考書なんぞ買ってみることにした。もちろん最近は何でもGoogleに聞けば教えてくれる時代だ。それもやってみたが、やはり書籍としてちゃんとまとまったものにはそれなりの力がある。どんな本を買ったのか? そうだ、それをまずまとめておくことにしよう。


スマホを買い換えないということ

2016年04月21日 09時02分53秒 | iPhone
発売当初は毎年のように、最近でも2年おきに、iPhoneを買い換えてきた。

月賦は借金なので、経済的長期低空飛行を長年続けた経験から敬遠している。よって機種変更時には端末代金を現金で用意するんだが、昨年末初めて機種変をスキップして気付いたことがある。お金をいいことに使える。

もともと現有機がこわれたのでも調子が悪くなったわけでもない。単に新しいのがほしいというだけなので、機種変をしなくても特に困ることはない。現状維持なんだから。その上端末代金相当額が手元に残る。去年は8万円あって、ほしかった部品や測定器を買ったり、お世話になった方にささやかなものを送らせていただけた。自分としてはずいぶん心豊かな年末を迎えることができた。あぁ、そうだ。暮れから正月にかけて飲む酒類に少し、贅沢もできたのだった。

それに味を占めたというわけではないが、今年こそはと思っていたSEへの機種変もどうやら飛ばしそうだ。まだ決めてはいないつもりで表層意識は抵抗しているが、深層意識はさっさと決めてしまったようだ。気が付けば熊本への義援金を奮発(当人意識上の規模感)したり、なかなか手を出せなかったFPGA学習用の書籍を3冊も発注したりしている。臨時講師としてお世話になっている専門学校の生徒さんたちのために、自腹を切ってデバイスを配ったりもした。まったく困ったものだが、深層意識には逆らえない。それにたいていは深層意識の方が、表層意識の浅はかな知恵よりは正しい。直感を信じよ。そして従え。てやつね。

まだこわれないよね?> iPhone5s