こんにちは。さばねっこです。
突然ですが皆さん、次のコードをご覧ください。
+++++++++[>++++++++>+++++++++++>+++>+<<<<-]>.>++.+++++++..+++. >+++++.<<+++++++++++++++.>.+++.------.--------.>+.>+.
実はこの記号の羅列はBrainfuckと呼ばれる、 + - > < [ ] . , のたった8つの命令で構成される難解プログラミング言語で記述された Hello World! を出力するコードです。
意味不明ですね。
とりあえずこちらのエミュレータに上のコードを貼り付けて実行してみてください。ちゃんとHello Worldできたでしょ?
まあ基本的なことはこのあたりの記事を読んでいただくのが速いと思います。 qiita.com
一見何にもできなさそうな言語ですが、チューリング完全なので理論上は何でもできるそうです。すごい。
さて、 ここまででBrainfuckのことは完ぺきに理解していただけたと思いますが(?)、残念ながら実用言語ではないため、先ほどのようにちょっとした文字列を表示する+α程度のことにしか使われていません。
かわいそう…。
というわけで(?)Brainfuckでモーターを制御してみようと思います。
皆さんも標準入出力に囚われ続けるBrainfuck君に翼を授けてあげたいですよね!そうだよね!!
ということでやっていきます。
あ、もちろんブラシ付きモーターですよ?ベクトル制御は流石にちょっと…。
FPGA上に実装する
さて、Brainfuck君に翼を授けるべく活動を始めたわけですが、当然生のBrainfuckで動かせるマイコンなんて存在しません。
まずはBrainfuckを動かすことのできるハードウェアを用意しなければなりませんね。
というわけでFPGA(Tang Primer 25K)上に生のBrainfuckをそのまま実行できるCPUを作りましょう。
実はBrainfuck CPUを実装している方はすでに幾人かいらっしゃるのでその方々のブログを参考にしつつ実装していきます。
というわけで適当に実装。
(verilogはつい最近始めたばかりで何もわからないので、コードレビューしていただける方がいたら本当にうれしいです。)
生のBrainfuckを動かす、とか言いましたが、さすがにソースコードの文字コードをそのまま入れているわけではなく、3bit幅の機械語に変換して書き込んでいます。
実際に動かしてみるとこんな感じ。
brainfuck cpu実装できた!
— さばねっこ🐟@NT京都3/23 (@sabanekko1) 2024年12月27日
文字列をシリアルで出力できるようになったよ pic.twitter.com/WwwJMCLhhh
uartから出力バッファを垂れ流しているのでteraterm等でPCから確認できます。
動画では
--[----->+<]>----.[--->+<]>----.+++[->+++<]>++. ++++++++.+++++.-[->+++<]>-.>-[--->+<]>.-[----->+<]>-.++++++++.-[-->+<]>----..
という感じのコードを実行しており、 brainFUCK!! と表示されています。
コードはこちらのサイトで生成しました。
すごく便利。
ちなみに、CPU自作するならFPGAなんかに甘えずロジックICで作れ!、という派閥の皆さんもいらっしゃるかと思います。
が、一応このプロジェクトは最終的にモーターを制御することを目的としています。
Brainfuckとかいうバカ効率の悪い言語を使うとなると、それなりの周波数で動かさなければなりません。
ロジックICで全て作るのはいろいろ難しそう…と判断しFPGAを採用しました(本当はせっかく買ったFPGAをタンスの肥やしにしたくないだけ)。
ここからの展望
ひとまずBrainfuckの実行環境は実装できたのでここからはPWM等を出力したりエンコーダーのフィードバックを受け入れるSFRを実装しなければなりませんね。
また、そもそも手元にFPGAから使えるモタドラがないのでそれも用意しないといけません。めんどくさぁ。
そういえば、ループ命令を抜ける際にいちいち ] を探索しており滅茶苦茶効率が悪いのでそれもどうにかしたいです。
というかいい加減真面目に卒論書き始めないとやばいんじゃないですかね。やばいですね。
まあこんな感じでダラダラやっていく予定なので気長にお待ちいただけると幸いです。
参考文献
偉大なる先人の皆さん
その他
uartの送信部分はこのコードを丸パクリしました。
--
全然関係ないですがはてなブログのMarkdown編集モード便利ですね。なんで今まで使ってなかったんだろう。
続編はこちら