公開日:2024/08/31
title.png

31st Season


#31-6 Moscoviumの開発環境(カスカス)

 Cmod A7ボード(FPGA)を使って開発しているオリジナル16ビットCPUコアMoscoviumの開発環境として、Blocklyを使える用に整備しました(以下記事を参照)。

  「#31-2 Moscoviumの開発環境(ワクワク)

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

 暫く使って見たところ、Moscoviumとしてのハードウェアを最大限活用するためには、Blocklyにカスタムブロックの追加が必要だと判りました。上の記事でターゲットとしたBlocklyDuinoページでは、カスタムブロックを追加することができないため、ローカルハードディスク上にBlocklyの動作環境を構築して、カスタムブロックを追加したいと思います。

Blockly動作環境の構築

 早速、Google Blocklyの動作環境をローカルハードディスク上に構築して行きましょう。

  手順:

 完了です。

Blocklyデモを使って見る

 前節で構築したblockly\mcvm\index.htmlをブラウザで開くと、Blocklyを使ってプログラミングすることができます(下図)。ローカルディスク上に動作環境が構築されていますので、ネットワークに接続していない状態でも、Blocklyデモを実行することができます。

a316_blky_demo.png

a316_blky_edit.png

カスタムブロックの設計

 Moscovium用に追加するカスタムブロックは、以下4つのカテゴリに分類して準備しようと思います。

 より低層の基本的なカテゴリ(Moscovium)から、だんだん高層の高度なカテゴリ(Library)に向かって分類してあります。

カスタムブロックを作る

 こちらのBlocklyデモから、Blockly Developer Toolsを使って、カスタムブロックを作成して行きます。エディタページの使い方については、Googleのドキュメントを参照してください。

 例えば、mem writeブロックは、以下の様に生成しました。

a316_blky_cstm.png

 パラメータの数や型等によって、生成方法は異なります。同様にして、全てのカスタムブロックを定義したら、JavaScript形式で書き出し(mcvm_blocks.js)ます。

Blocklyデモへの組み込み

 前節で書き出したファイル(mcvm_blocks.js)をblockly/mcvm/code/へコピーし、blockly/mcvm/code/index.htmlに反映させます。

  blockly/mcvm/code/index.htmlの変更箇所:

 Blocklyデモは、BlocklyDuinoに比べて使用可能なブロック種が追加されていて、格段に使い易くなっています。そこへ更に、Moscovium用のカスタムブロックが追加できたので、鬼👹に金棒です。

Blockly.XML→Moscovium.ASM変換スクリプト

 変換スクリプト自体は、BlocklyDuinoの時と同様な物が使用可能です。
 しかし、BlocklyDuino → Blocklyデモで追加になった新しいブロックや、Moscovium用に追加したカスタムブロックに対応したバージョンを使う必要があります。
 以下リンクよりダウンロードしてお使いください。

  変換プログラム:blky2mcvm.olv

  ランタイムライブラリ:blky2mcvm.incl

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

 使用可能なブロックの詳しい説明は、こちらのマニュアルを参照してください。


 なお、今回のGoogle Blocklyデモ環境への対応を機に、BlocklyDuinoページが出力するXMLファイルへの対応は廃止します。
 Moscovium用にカスタマイズしたBlocklyデモ環境の立ち上げが必要です。


※本HPの設計データは全て、「サポート無し、無保証」であることを前提としています。ご理解の上、ご活用ください。

デザイン

 Cmod A7ボード用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、GitHubにて配布しております。以下バナーよりアクセスしてください。

btn_moscovium.png

 ディレクトリ「blky」に、Blockly.XML→Moscovium.ASM変換スクリプトを含む、Blockly関係のファイルを格納しています。

 今回は、こちらのfdownブロックを実装するため、半精度浮動小数H-FPUユニットとMoscoviumコアにhdown命令を追加したので、最新のデザインを使ってください。

 fdown命令は、元々、Nihonium+単精度浮動小数S-FPUユニットには実装済みだったため、未実装だったH-FPUで直交性を確保する目的で拡張したものです。

もぎ実験

 例えばこちらの手順の内、実際にFPGAへ回路とプログラムを書き込んで動作検証する手順には、既に十分な実績があります。実物のFPGAで動作確認するのは、とても重要な検証では、あるけれど、内部の細かな動作が追いかけ難かったりして、検証内容は限られる場合があります。
 今回は、Vivadoを使ったシミュレーションにて、内部の動作などを含めて検証する事といたします。

 以下、Blocklyでサンプルプログラムを作成し、シミュレーションによって、動作を確認して行きたいと思います。Cmod A7ボード(FPGA)でMoscoviumのシミュレーションを実行する手順については、こちらをご確認ください。

素因数分解

 まずは、Blocklyを使って、任意の整数を素因数分解してみましょう。以下にBlocklyデモ環境用のXMLファイルをリンクしておきます。

  Blocklyプログラム:blky_prime_factor.xml (PNG)

※Blocklyで作成したプログラム(XMLファイル)から、Vivadoを使ってシミュレーションする手順については、こちらをご参照ください。以降のサンプルも同じです。

 指定した整数値(変数名はnn)を素因数分解して表示するプログラムと、なっています。アルゴリズムは愚直に2,3,4,……と割り算して行って、割り切れた時の値を素因数だと判定しています。
 整数割り算を使用しているため、除算命令を使用可能なCPU(DIVC32ユニット+Moscoviumまたは、Nihonium)が必要です。従って、例えば以下の様なデザインを使ってシミュレーションを実行してください。

 エディション表はこちらです。

  実験サンプル:シミュレーション結果ログ
  1134 = 2 * 3 * 3 * 3 * 3 * 7
  WRN: program encountered a halt code.
  Test Finish, you need verify waveform.
  CPI: 3258/ 2357( 0)= 1382/1000
  finish: 150160 ns

 サンプルとして、nn=1,134を素因数分解した結果が表示されました。検算してみると、結果は正しいことが解ります。もし、16ビット符号付整数を超える大きさの整数nnを指定する場合、変換オプション"@Nh@"を指定して、デザインもNihoniumコアを搭載した物を選択してください。

※素数は、1と自分自身以外で割り切れない数なので、「素数判定プログラム」としても使用可能です。

最大公約数・最小公倍数

 続いて、2つの整数から最大公約数(GCD;Greatest Common Divisor)と最小公倍数(LCM;Least Common Multiple)を求めるプログラムを試してみましょう。

  Blocklyプログラム:blky_gcd_lcm.xml (PNG)

 指定した整数値2個(変数名はSA,SB)の最大公約数をユークリッド互除法で求め、その結果を使って最小公倍数も求めるプログラムです。
 乗除算命令を使用可能なCPU(MULC16ユニット+DIVC32ユニット+Moscoviumまたは、Nihonium)が必要です。従って、例えば以下の様なデザインを使ってシミュレーションを実行してください。

 シミュレーションしてみましょう。

  実験サンプル:シミュレーション結果ログ
  GCD(119, 272) = 17; LCM = 1904
  WRN: program encountered a halt code.
  Test Finish, you need verify waveform.
  CPI: 2518/ 1866( 0)= 1349/1000
  finish: 120560 ns

 サンプルとして、SA=119とSB=272の最大公約数・最小公倍数を求めた結果が表示されました。
 前節の素因数分解プログラムを使ってみると:

と、計算されました。素因数分解した結果を使うと:

と、計算できますので、結果の正しさも確認できました。

※最初のSA,SB値次第では、最小公倍数LCMが符号付整数値の範囲を超えてしまう場合があります。

円周率の計算

 最後に、円周率を求めておきましょう。

  Blocklyプログラム:blky_calc_pi.xml (PNG)

 浮動小数を使って、円周率πを求めるプログラムです。
 本HPで何度か取り上げている、多倍長固定小数を使った円周率の計算(数1,000桁以上)とは異なり、浮動小数を使うので、精度によって有効桁数が限られます(下表)。

変換オプション 浮動小数 有効桁数 期待値
@Mc,float@ 半精度(16ビットhalf型) 約3.01桁 3.14
@Nh,float@ 単精度(32ビットfloat型) 約6.92桁 3.141592

 浮動小数を使うこと以外、アルゴリズムは同じで、マチン公式を使っています。

 変換オプションで"@Nh@"を指定した場合、シミュレーションに使用するデザインも、CPUコアにNihoniumを搭載した型名を使う必要があります。また、浮動小数演算が必須なので、FPUも搭載している必要があります。従って、例えば以下の様なデザインを使ってシミュレーションを実行してください。

 シミュレーションしてみましょう。

  実験サンプル:シミュレーション結果ログ
  PI = 3.1415915
  WRN: program encountered a halt code.
  Test Finish, you need verify waveform.
  CPI: 4510/ 3162( 0)= 1426/1000
  finish: 200240 ns

 Nihonium+単精度浮動小数S-FPUユニットで実行した結果です。最後の数桁は正しくありませんが、有効桁数の誤差範囲内で、期待値通りです。


 楽しくなってきました(1^−^)♪。自作のオリジナルCPUなのに、アセンブラでゴリゴリとプログラミングしなくても、Blocklyを使って楽しくプログラミングできるなんて、想像もしていませんでした。らぶ。


btn_arduino.png

btn_prev.png btn_next.png

home