公開日:2024/07/27
title.png

31st Season


#31-3 Moscoviumの開発環境(アゲアゲ)

 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.olvblky2mcvm.incl

 拡張子OLVの方がスクリプト本体です。
 拡張子INCLの方は、Moscoviumアセンブラでアセンブルする時に必要となる、インクルードファイル(所謂、ランタイムライブラリ)です。

※スクリプト(.olv)の実行には拙作Olive+をWindowsにインストールしてください。

 以下リンクにマニュアルを作成しておきました。

  Blockly.XML→Moscovium.ASM変換スクリプトマニュアル

制限upd

================================

BlocklyDuinoページで作成したXMLファイルの対応は、廃止しました。

================================
 現在、Google Blocklyデモ環境のエディタを使用可能ですので、こちらの記事「#31-6 Moscoviumの開発環境(カスカス)」をご確認ください。

 Blocklyが出力するXMLファイルには、各サードパーティ毎に方言があるため、BlocklyDuino以外の開発環境が出力したXMLは読み込み不可です。

 非対応のブロックが見つかった場合、変換スクリプトは、エラーを発出して停止します。ただし、方言があるとは言え、基本的な部分は同じだったり、似通っていたりするため、エラー無く変換が終了する場合もあり得ます。
 非対応のXMLを読み込ませた場合、「エラーが発生しなかった」と言うだけで、正しくMoscoviumアセンブラに変換できた保証はありません。中途半端に、ノーエラーで終了してしまうだけに質が悪いです。BlocklyDuino以外の開発環境が出力したXMLの読み込みは実行しない様にしてください。

 ターゲットとして設定したBlocklyDuinoに関しても、全てのブロックに対応したわけではありません。例えば、ArrayやInterruptsと言ったブロックには、現時点では非対応です。これらの非対応ブロックを読み込んだ場合には、エラーとなります。
 広い心で、エラーに出会ったら、「このブロックには対応してないのね?」と、理解、回避してくださいませm(1__)m。

a313_bino_blks.png

 上図は、変換に対応しているブロックを、いい加減に組み合わせたものです。プログラムとしての意味は無いので、ブロックの種類だけに着目して見てください。

 各ブロックについての説明は、こちらを参照してください。

数値演算

 今回の変換プログラムは、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ブロック(下図)を使い、明示的に型変換してください。

a313_castblk.png

 int型もしくはfloat型への変換に対応しています。他の型を指定するとエラーとなります。Type Castブロックは、オプション"@int@"/"@float@"指定に関わらず、想定した型であるという前提で、強制的に変換します。

ランタイムチェック

 指定した変換オプション次第では、FPGAに構築した回路に特定の演算ユニットが必要となります。

 これらのユニットは、Moscoviumマイコンのコンパイル(論理合成・配置配線)時にユーザが選択できる様になっています。このため、プログラム実行時にランタイムライブラリが、必要なユニットの存在を確認し、条件を満たさなかった場合には、エラーを発生して停止する様になっています。

文字列処理

 符号付整数や浮動小数などの数値型と比べ、抽象度の高いデータ型である文字列型に関しては、制限を設けています。

a313_strblk.png

 上図の様な文字列型変数への代入(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。


btn_arduino.png

btn_prev.png btn_next.png

home