Shrike-Liteを入手した時、ボード上に搭載されたFPGA(SLG47910)へユーザ論理を書き込んでおき、MCU(RP2040)とFPGA間で通信する事でFPGA上に書き込んだユーザ論理を制御しようと考えました(以下記事を参照)。
「#38-9 週刊「スタックマシンを作る」創刊号」
前回、必要なSPIBUSユニットの詳細設計が終了していますので、上にリンクした記事の結果を受けた「最挑戦」が、今回締まります。
この後の実験で、SNDG1PBユニットを使った音楽演奏プログラムを作成するので、SNDG1PBユニットを搭載したMBOC115GS3208にSPIBUSユニットを追加します。SPIBUSユニットを追加するに当たり、制約ファイルに以下の改定が必要となります。
制約ファイル(mcoc_constr.xdc)の改定:
Cmod A7ボード等、XilinxのFPGAへ書き込むのに必要な、Moscoviumマイコンの設計データ(Vivadoのプロジェクトファイル一式を含む)はGitHubで提供しています。以下バナーよりアクセスしてください。

デザイン(回路)をCmod A7ボードへ書き込む手順については、こちらをご確認ください。
SPIBUSユニット搭載版MBOC115GS3208マイコンのコンパイル(論理合成・配置配線)結果を以下に示します。
コンパイル結果:
SPIBUSユニット単体では、約60LUT(+80FF)程の論理規模でした。次節の実験では、Shrike-LiteのMCU(RP2040)からSPIBUSユニットを通して、Cmod A7ボード上のSNDG1PBユニットを制御します。SNDG1PBユニットの論理規模は約200LUT(+130FF)です。いずれもCmod A7ボードに於ける6入力LUT(LUT6、Vivado)での論理規模です。
今回はFPGAとしてCmod A7ボードを使いますが、もし、Shrike-LiteのFPGA(5入力LUT、Go Configure)に、これらのI/Oユニットを搭載するなら、以下の論理規模となる事が予想されます。
| I/O unit |
Cmod A7 [LUT6] |
Shrike-Lite (estimation) | ||
| [LUT5] | [CLB] | |||
| SPIBUS | 60 | 107 | 24 | |
| SNDG1PB | 200 | 357 | 81 | |
| Total | 260 | 464 | 106 | |
| Maximum | 20,800 | 1,120 | 140 | |
※上表の根拠: こちらの比較考察より、LUT5とLUT6の論理規模換算式は、LUT5≒LUT6÷56%。更にLUTペアの活用率を考慮すると、CLB≒LUT5÷8÷55%。
Shrike-LiteのFPGA(SLG47910)は最大1,120LUT(または140CLB)の論理規模ですので、上表の推定が正しければ、まあまあ何とか載るのではないでしょうか?
ここまで回路を縮小しても、論理規模的には結構大きい(CLB使用率106÷140≒76%)のですね……。
上表のSNDG1PBユニットは×1チャンネルの論理規模です。もし、二音同時演奏の為に×2チャンネル載せようと思ったら、CLB数がオーバして「素子不足」エラーが発生するでしょう。もう少し大きな回路を書き込める論理規模を有したFPGAだったならば、使い出があるんじゃないかな?
今回の実験では、Shrike-LiteとCmod A7ボードをSPIインターフェイスで接続します(以下接続表を参照)。その状態で、Shrike-LiteからSPI通信を通してサウンドジェネレータSNDG1PBユニットを制御し、音楽を演奏🎸して見ます。
| Shrike-Lite | 接続 | Cmod A7ボード | 接続 | パッシブブザー回路 |
| VCC3V3 | → | Vcc | ||
| GND | ⇔ | GND | ⇔ | GND |
| IO26(SPI1_SCK) | → | spis_sck | ||
| IO29(SPI1_CSn) | → | spis_ss | ||
| IO27(SPI1_TX) | → | spis_mosi | ||
| IO28(SPI1_RX) | ← | spis_miso | ||
| × | spis_irq_n | |||
| sndg0_pwm | → | PWM0 |
※割り込み信号spis_irq_nに関しては、今回は未使用(接続不要)。
以下に、実験中の様子を示します。

今回のお買い物は以下の通りです。
他の商品と一緒に、Amazonの3,500円以上配送料無料で購入しました。

音楽演奏に使用しているパッシブブザーには個体差があって、同じ電圧を印加しても音の大きさにばらつきがあります。ブザー1個だけ使うなら気になりませんが、2個以上使って複数の音を同時に奏でようとする場合、音の大きさが異なると、気になります。
そこで、音の大きさが同程度になる様に抵抗値で調整していました。今回購入した半固定可変抵抗器を使用する事によって、その調整が容易になりました。あ、今回はパッシブブザー×1個しか使わないのですけれど……。お好みの音量に調整できます(1^^;)。
Shrike-Liteで実行するプログラムを以下にリンクします。
Shrike-Liteプログラム:shrk_jukebox.ino
演奏データ:
| ヘッダファイル | 曲名 | 備考 |
| mmlb_ardious.h | Ardious |
UNO+TFTシールドで作成した自作ゲームの テーマ曲、飛行音、墜落音 |
| mmlb_bee_march.h | みつばちマーチ |
「子犬のマーチ」という場合もあるみたい 英名は「Bee March」 |
| mmlb_carp.h | こいのぼり | 「屋根より高い〜♪」 |
| mmlb_for_elise.h | エリーゼのために | オルゴールなどで流れるお馴染みの曲 |
| mmlb_parade.h | おもちゃの兵隊の観兵式 | キユーピー3分クッキング |
| mmlb_rudolph.h | 赤鼻のトナカイ | クリスマスソング |
| mmlb_sakura.h | さくらさくら | 「さくら、さくら〜♪」 |
| mmlb_silent.h | きよしこの夜 | クリスマスソング |
| mmlb_twinkle.h | きらきら星 | アルファベットA〜Zも、この曲? |
※すべてダウンロードして、プログラム(shrk_jukebox.ino)と同じディレクトリに配置してからコンパイル&書き込みしてください。
サウンドジェネレータSNDG1PBユニットの制御方法に関しては、こちらの記事をご確認ください。
コンパイルしてShrike-Liteへ書き込むと、シリアルモニタから以下のコマンドを受け付ける様になっています。
シリアルモニタコマンド仕様:
SPI通信速度ですが、こちらで検討した理論上の最大受信可能周波数36MHzに多少余裕をもって、20MHzを設定しておきました。Shrike-Liteのシステムクロック周波数から分周で作り出せる周波数に調整されているはずですが、実際にSPIライブラリが出力したSCKの周波数は未確認です。20MHzクロックをサンプリング可能なロジックアナライザ等の測定機器が手元に無いため確認不能です。
※なお、SPIライブラリのSS出力は、各バイトデータ送信の度にネゲートされ、SPIBUSユニットと不適合だったため、digitalWrite()関数を用い、手動でSS信号を制御しました。
Cmod A7ボード上のMoscoviumが実行するプログラムに関しては、今回、何もしなくて良いです。
実際、Cmod A7ボードの論理回路で必要なのは、SPIBUSユニットとSNDG1PBユニットだけです。現在のMoscoviumマイコンプラットフォームでは、「CPU無し」を選択できないので、止むを得ず、Moscoviumが搭載されているだけのことです。
言い換えるとMoscoviumでは、Shrike-Liteからの制御を邪魔しないプログラムを実行しておく必要があります。よって、こちらのLチカプログラムを書き込んでおきました。
以下実験サンプルに従って、実験してみましょう。以下の実験は、Shrike-Lite側のシリアルモニタを使います。
実験サンプル:【 】内はシリアルモニタからの送信データ
【srd,f000】
OK: srd[0xf000]=0x115b
SPIBUSユニットを通して、Moscovium側のアドレス0xf000からワードデータを読み出しました。アドレス0xf000はIDREGユニットのidrgcodeレジスタです。Cmod A7ボード(FPGA)には、MBOC115GS3208マイコンが書き込んでありますので、Moscovium-BSコアを表す0x115bが読み出せて正解です。
これが期待通りに動くようなら、SPIBUSユニット経由のアクセスは成功していると思って良いので、実験を先へ進めます。
【jbox】
OK+ 1)Ardious
OK+ 2)Bee March
OK+ 3)Carp Streamer
OK+ 4)For Elise
OK+ 5)Parade
OK+ 6)Rudolph
OK+ 7)Sakura
OK+ 8)Silent Night
OK+ 9)Twinkle
OK: jbox
【jbox,2】
OK+ 2)Bee March
OK: jbox
実験中の様子を以下動画に起こしてみました。
Shrike-LiteのFPGA(SLG47910)へ、MoscoviumマイコンのI/Oユニットを書き込んで制御するために始まったテーマだったのですが……。蓋を開けたらShrike-Lite+Cmod A7ボードって、何か変じゃない?
何処で話がずれた?
Shrike-Liteに搭載されたFPGAのEDAツールGo Configureが生理的に合わず、アンインストール(放棄)してしまったところが分岐点でした。筆者が生理的に合わなかったEDAツールに関しては、「ウザい」を連発した以下の記事を参照して見てください。
「#38-3 Shrike-LiteのFPGAを使う」
「#38-4 Shrike-LiteのFPGAを使う(続き)」
※「ウザい」で検索推奨(1^_^;)。
決定的だったのが、Cmod A7ボードのEDAツールVivadoで問題なく使えているRTLが、「暗黙のワイヤ宣言」だと言ってエラーで弾かれる件でした。Go Configureで使う為だけに、RTLを改定しなくてはならない事が不愉快で、どうしても我慢できなかったのです。
まあ、仕方ないですよね?個人的な好みの問題だから……。
ですので、FPGAとしてはCmod A7ボードを使う事になった事が、当初想定と異なる状況です。今回作成したSPIBUSユニットはShrike-LiteのFPGAへ書き込むのに十分小さいので、本来ならば、Shrike-Liteだけで閉じる事が可能でした、とさ。
改めて、今回の系を図解しておきます(下図)。

Cmod A7ボード側のMoscoviumでは、RGB LEDのLチカプログラムが実行されている(赤色点線)ので、外部からSNDG1PBユニットを制御されているなんて事は知らぬ顔で、ひたすらLチカしながらシリアルモニタにも反応しています。
一方、Shrike-Lite側のRP2040では、音楽演奏プログラムが実行されていて、SPIBUSユニット経由でSNDG1PBユニットを制御して音楽演奏しています(青色点線)。
見方によっては、RP2040とMoscoviumの非対称並列処理(AMP;Asymmetric Multi-Processing)と言って良いでしょう。もうお気づきかと思いますが、Cmod A7ボードの外部に接続するマイコンボードがShrike-Liteである必要は全くありません。Arduino DUEでも、M5StickC Plusでも、電圧レベルさえ合わせればArduino UNOでも、OKです。
FPGAも、Cmod A7ボードである必要は無く、小規模で使い易いFPGAボードがあれば連携可能です。
ターゲットがShrike-LiteのオンボードFPGAからCmod A7ボードへ転向してしまいましたが、当初のテーマであった、「マイコンボードとFPGAボードの連携」は完遂できたと思います。テーマ完結です。


