Cmod A7ボード(FPGA)を使って開発しているオリジナル16ビットCPUコアMoscoviumの開発環境は、アセンブラです。筆者の実力では、GCCやClang(LLVM)等への適応は困難だったから、ですm(1__;)m。
止む無く、別な解も探っていました。今回、一筋の光が見えたので、GCCやClang等のC言語コンパイラ適応は諦めて、別な解を模索して行きたいと思います。
前回、Google Blockly開発環境について一通り解説しました。今回は、いよいよ、Blocklyで開発したプログラムをMoscoviumアセンブラソースリストに変換して、動かしてみたいと思います。
XMLからMoscoviumアセンブラへ変換するソフトウェアは、いつもの通り、拙作Olive+のスクリプトで作製しました。以下にBlockly.XML→Moscovium.ASM変換スクリプトをリンクしておきます。
完成したプログラム:blky2mcvm.olv,blky2mcvm.incl
拡張子OLVの方がスクリプト本体です。
拡張子INCLの方は、Moscoviumアセンブラでアセンブルする時に必要となる、インクルードファイル(所謂、ランタイムライブラリ)です。
※スクリプト(.olv)の実行には拙作Olive+をWindowsにインストールしてください。
以下リンクにマニュアルを作成しておきました。
Blockly.XML→Moscovium.ASM変換スクリプトマニュアル
================================ BlocklyDuinoページで作成したXMLファイルの対応は、廃止しました。 ================================ |
現在、Google Blocklyデモ環境のエディタを使用可能ですので、こちらの記事「#31-6 Moscoviumの開発環境(カスカス)」をご確認ください。 |
Blocklyが出力するXMLファイルには、各サードパーティ毎に方言があるため、BlocklyDuino以外の開発環境が出力したXMLは読み込み不可です。
非対応のブロックが見つかった場合、変換スクリプトは、エラーを発出して停止します。ただし、方言があるとは言え、基本的な部分は同じだったり、似通っていたりするため、エラー無く変換が終了する場合もあり得ます。
非対応のXMLを読み込ませた場合、「エラーが発生しなかった」と言うだけで、正しくMoscoviumアセンブラに変換できた保証はありません。中途半端に、ノーエラーで終了してしまうだけに質が悪いです。BlocklyDuino以外の開発環境が出力したXMLの読み込みは実行しない様にしてください。
ターゲットとして設定したBlocklyDuinoに関しても、全てのブロックに対応したわけではありません。例えば、ArrayやInterruptsと言ったブロックには、現時点では非対応です。これらの非対応ブロックを読み込んだ場合には、エラーとなります。
広い心で、エラーに出会ったら、「このブロックには対応してないのね?」と、理解、回避してくださいませm(1__)m。
上図は、変換に対応しているブロックを、いい加減に組み合わせたものです。プログラムとしての意味は無いので、ブロックの種類だけに着目して見てください。
各ブロックについての説明は、こちらを参照してください。
今回の変換プログラムは、MoscoviumおよびNihoniumのアセンブラソースリスト出力に対応しております。Tennessineには非対応ですので、ご了承ください。各CPUコアにて扱う事のできる数値としては、以下の通りとなります。
出力するアセンブラソースリストのターゲットCPUは、変換オプション(McまたはNh)にて、指定します。変換オプションの仕様は、以下の通りです。
変換オプション仕様:
ブロック毎に"@int@"/"@float@"オプションを切り替える事で、符号付整数演算と、浮動小数演算を混在する事は可能です。
ただし、変数の型チェックは実行しないので注意してください。float型演算した結果を記憶した変数を、int型として読み出してもエラーになりません。この場合、強制的にint型(符号付整数)と見なして演算しします。逆(int型で演算→float型で参照)の場合も同じです。
例)
最後の行では、変数flt_varから読み出した値を、そのままのビット値で強制的に符号付整数と見なし、演算してしまいます。int型 → float型の型変換は実行しませんので、多くの場合、この演算は正しくありません。
基本的には、符号付整数または、浮動小数の何れかに統一して使用する事を推奨します。
また、BlocklyDuinoでは、変数の型をC言語の型の中から選択可能なのですが、変換スクリプト(blky2mcvm.olv)は、この機能には非対応です。どの型を指定しても無視するので、数値型の変数にはデフォルトの「int」を指定する事を推奨します。
変換スクリプト(blky2mcvm.olv)では、暗黙の型変換は一切、行いません。BlocklyDuinoのType Castブロック(下図)を使い、明示的に型変換してください。
int型もしくはfloat型への変換に対応しています。他の型を指定するとエラーとなります。Type Castブロックは、オプション"@int@"/"@float@"指定に関わらず、想定した型であるという前提で、強制的に変換します。
指定した変換オプション次第では、FPGAに構築した回路に特定の演算ユニットが必要となります。
これらのユニットは、Moscoviumマイコンのコンパイル(論理合成・配置配線)時にユーザが選択できる様になっています。このため、プログラム実行時にランタイムライブラリが、必要なユニットの存在を確認し、条件を満たさなかった場合には、エラーを発生して停止する様になっています。
符号付整数や浮動小数などの数値型と比べ、抽象度の高いデータ型である文字列型に関しては、制限を設けています。
上図の様な文字列型変数への代入(setブロック)と、文字列をシリアルモニタへ送信する機能(Serial Printブロック)が使用可能となっています。
文字列、文字列型変数の仕様制限:
文字列型変数の文字列バッファとしてcstr_sizバイトを確保します。それを超えた領域に書き込んでしまうと、隣接する何らかのデータエリアを破壊してしまう事に注意が必要です。cstr_sizの値は、変換オプションで指定可能です。
符号付整数型の数値や変数を、文字列型変数への代入、Serial Printブロックへの引数に指定すると、自動的に符号付整数→文字列変換が実行されます。
文字列処理に数値を適用可能な例)
各々、<数値または数値型変数>を符号付整数と見なして、10進数の文字列に変換後、処理します。浮動小数には非対応です。
全ての変数はグローバル変数🌐です。関数内だけで使用可能なローカル変数と言う概念は存在しません。元々のBlockly自体が、こういう仕様みたいです。
∵UIFlowにて、Pythonに変換されたコードを眺めていると、わざわざ、全ての変数をグローバル変数として関数内に引き込んでいる様に見える。
変換スクリプト(blky2mcvm.olv)では、より厳密に、すべての変数をグローバル変数として扱います。
Blocklyの関数定義ブロックを使って、関数を定義し、呼び出すことは可能です。ただし、関数へ引数を渡す場合、引数変数もグローバル変数である事に注意してください。
関数の引数として使った変数も、その他、関数内で使用した変数も、全てグローバル変数なので、同名のグローバル変数と同じ記憶領域を共有します。
BlocklyDuinoを使って作成したプログラムの動作作状況を、Vivadoのシミュレーションにて確認してみましょう。
フィボナッチ数列計算プログラム:bino_fibonacci.xml
※ブラウザによっては、XMLファイルをレンダリングして表示してしまうので、「右クリック ⇒ リンク先を保存」などしてください。
フィボナッチ数列計算プログラムは、符号付整数の加算しか使っていないので、16ビットで収まるフィボナッチ数までしか計算させないなら、適切なMoscoviumマイコンを使ってシミュレーションが可能です。もし、乗除算や浮動小数、32ビット演算などを使用する場合、こちらに従って、敵切な型名のシミュレーションモデルを使用してください。
シミュレーションサンプル:
FIBO: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987
WRN: program encountered a halt code.
Test Finish, you need verify waveform.
CPI: 5792/ 4239( 0)= 1366/1000
finish: 251520 ns
Blocklyでプログラムした通り、1,000以下のフィボナッチ数列がカンマ(,)区切りで出力されました。
最後に、FPGAにMoscoviumマイコンを書き込み、実物で動作確認しておきましょう。BlocklyDuinoで作成した、Lチカプログラムを以下にリンクしておきます。
MoscoviumマイコンLチカプログラム:bino_blink_rgb.xml
※ブラウザによっては、XMLファイルをレンダリングして表示してしまうので、「右クリック ⇒ リンク先を保存」などしてください。
BlocklyDuinoで読み込むと、プログラムを確認できます。
以下の様にして、LチカプログラムからROMデータへ変換し、デザインと一緒にCmod A7ボードへ書き込んでください。
このプログラムは、Moscovium(16ビット)モードで実行可能なので、例えば、mcoc115ca0408.vh等、Tennessineコア以外のデザインを書き込んでください。
書き込みが終了すると、Cmod A7ボードのオンボードRGB LEDが、「短く二回、周期約1秒、青→赤→緑→繰り返し」で点滅しているはずです。
折角、抽象度の高いBlocklyでプログラムできるので、こんな、Lチカなんかでは、その効果を実証できないのだけど、まずは、第一歩です。Blockly+Moscoviumで、楽しくプログラミングできそうですv(1^−^)v。