これだけ技術が進んでも、意外と大変な作業となるのが「移植」という仕事です。
開発当初から、「これと、これと、この環境で動作するマルチプラットフォーム開発を行う」等と決めて進めた場合なら、まだ良いのかもしれません。しかし、一旦開発が終了した後で、何らかのソフトウェアを別な環境(別なOS等)に移植するのは、大変骨が折れます。
ハードウェア開発(RTL)では、どうなのでしょうか?
今まで、中華製のFPGAボード(Primerボード)を使って開発していたオリジナル16ビットCPUコアMoscoviumの、新規購入したFPGAボード(Cmod A7ボード)への移植を通して確認して行こうと思います。
前回、Cmod A7ボード固有の機能について対処した内容を報告しました。今回は、完成したデザインを公開し、実際にCmod A7ボードに回路とプログラムを書き込み、動作を検証してみたいと思います。
Cmod A7ボード用Moscoviumマイコンの設計データ(Vivadoプロジェクト)は、GitHubにて配布しております。以下バナーよりアクセスしてください。
ダウンロード方法などについては、トップのREADME.mdをご覧ください。
本HPの記事やデータは全て、「サポート無し、無保証」です。ご自身の責任にてご利用くださいますよう、お願いいたします。
なお、前回の記事に於いて、MCOC115MN0408をターゲットとして移植してきたところ、Cmod A7ボードのユーザLEDを駆動するためのLED用PWMタイマTIMLED5ユニットを新規設計して追加しました。その型名をMCOC115CA0408としたので、以降、MCOC115CA0408を使って解説を続けます。
Vivadoのプロジェクトファイル(MCOC115.xpr)をダブルクリックして開いてください。
以下表に示すMoscoviumマイコンの中から、所望の型名を選択してください。型名規則についてはこちらをご参照ください。
※現時点で移植が完了していて、選択可能な型名の列以外は灰色で見せ消しになっています。Cmod A7ボードに搭載されていない、SDRAMなどのユニットは将来に渡って対応不可ですが、その型名も見せ消しで残します。
「<型名>.vh」という名前のファイルで、どのユニットを使うか?どのCPUを使うか?等の設定を記述してあります。
たとえば、型名mcoc115ca0408のマイコンを使いたい場合、プロジェクトファイル(MCOC115.xpr)を開いたVivadoの「Sourcesサブウインドウ ⇒ Design Sources ⇒ Non-module Files」のリストから、mcoc115ca0408.vhを探し、「右クリック ⇒ Set Global Include」を実行して、Global Includeファイルに指定します(下図)。
Global Includeファイルには、地球儀(globe)みたいなアイコン🌐が付きます。
「Non-module Files」内の、他のファイルに地球儀アイコンが付いていたら、「右クリック ⇒ Clear Global Include」を実行して、mcoc115ca0408.vhだけに地球儀アイコンが付いた状態にしてください。
最上位モジュール(mcoc115ca0408)には、青●の右側にアイコン(■■■)が付きますので、これも確認してください。もし、アイコンが付いていなかった場合、mcoc115ca0408を「右クリック ⇒ Set as top」を実行して、最上位モジュールに指定してください。
以上でmcoc115ca0408マイコンを使う準備ができましたので、後は、SYNTHESISなり、SIMULATIONなり、所望の処理を実行可能です。
※手元にArtix-7ファミリのFPGAボードしか無いので未確認ですが、デザインデータは恐らく、Vivadoで開発可能なFPGAボードで使用可能だと思われます(未確認かつ、無保証)。ただ、MMCMマクロ(クロック生成回路)に関しては、FPGA毎に作成し直す必要があるみたいです。当方ではサポートできませんので、試してみる方は各自の責任でお願いします。
Moscoviumマイコンの端子配置図を以下リンクからご確認いただけます。
Moscoviumマイコン端子配置図
現時点では、まだ、未割り当ての端子も存在しています。既に割り当たっている端子も含めて、今後、予告なく変更する場合があります。
時に、Cmod A7ボードにはピンヘッダがはんだ付けされていて、一応、「48ピンDIP」と同じフットプリントになっている様です。最近では、そんな巨大なパッケージのLSIは見なくなりました。48ピンともなると、ブレッドボードに挿すにも、硬くて一苦労です。
沢山のI/Oポートを使いたいFPGAボードで48ピンも使えるのは素晴らしいのですが、ブレッドボードに挿すにも苦労する様では、良し悪しですね。外部回路を接続する必要が生じた場合には、ブレッドボードに挿さないと使い勝手が悪いので、ちと、憂鬱です。
※Primerボードの時は、ピンヘッダがはんだ付けされていなかったので(手抜きの中華製半完成品)、自分で「ピンソケット」をはんだ付けして使っていました。ピンソケットなら、ブレッドボードに挿さなくてもジャンパ線で配線を引き出せるので……。
まず、Moscoviumで実行するアセンブラ(ASM)ソースファイルを作成します。
アセンブラマニュアルはこちらです。
それを以下手順でアセンブルすると、メモリ(MEM)ファイルが完成します。
アセンブル手順:
アセンブラ(asm_mcvm.olv)で生成したVerilogメモリ(MEM)ファイルをVivadoのRAMマクロに初期値として設定しています。格納場所は以下の2か所となります。
FPGAボードに書き込む時も、シミュレーションする時も、同じMEMファイルを使うようなプロジェクトにすることもできるのですが、通常、FPGAボードに書き込んで動作させるプログラムと、シミュレーションで機能確認用に使用するプログラムは別々であろう、という配慮です。用途に応じて、適切なファイルを更新してください。
Moscoviumマイコンのブートリセットを使うと、FPGAボードに回路を書き込んだ後、命令ROMに別なプログラムを書き込み直すことができます。ブートモードについては、こちらの記事「#16-7 Moscoviumにブートローダを」をご確認ください。
プログラムが変わっただけでは回路そのものに変更がないため、コンパイル(論理合成・配置配線)をし直す必要が無く、時間を短縮することができるため、プログラムのデバッグ時などに威力を発揮します。
ブートモード:
ブートモードによる命令ROMの書き込みは、プログラム(ソフトウェア)のデバッグ時に有効です。
回路のデバッグなどでRTLを変更した場合には、コンパイル(論理合成・配置配線)から、やり直す必要があります。
Vivadoを使った論理シミュレーションの実行手順を以下に示します。
シミュレーション実行手順:
Vivado固有の「お作法」が少々ありますが、シミュレーションさえ実行できれば、後は外部ソフトウェアのGTKWaveを活用するなり、使い慣れた環境に持ち込むことも可能です。デバッグ中は何度も実行する手順ですので、お好みの環境を構築して使ってください。
Vivadoでのコンパイル(論理合成・配置配線)結果を以下にまとめます。
コンパイル結果:
当初、クリティカルパスは、読み出しレイテンシ0の命令ROMへ出力したアドレス信号のセットアップパスでした。
タイミング的に厳しいであろうことは解っていたので(故意犯)、それはそれで良かったのですが、今までTD IDEでは、タイミング結果報告(STA)のクリティカルパスとして報告されたことが有りませんでした。そのせいで、タイミング的にどの程度厳しいパスなのか?と言う感覚が有りませんでした。
※TD IDEでレポートされなかった理由は不明。TD IDE(Primerボード)は所詮、中華品質の製品なので、さもあらむ。深追いしても無意味、無視。
Vivadoでは、クリティカルパスとして報告されたため、漸く、厳しさの程度が判りました。GitHubのデザインデータは、上述のクリティカルパスに関して対策済みです。
対策の内容に付いては、後日報告したいと思います。
新しい環境を入手すると必ず作ってみる、最初のアプリケーションは「Lチカ」です(1^^)。今回も初心に戻って、Lチカしてみましょう。
以下に、Cmod A7ボード対応のLチカプログラムをリンクしておきます。最初にPrimerボードでMoscoviumマイコンを設計した時に作ったプログラムの小修整版です。
プログラム:mcoc_blink.asm
新規追加したTIMLED5ユニットなどの動作検証用に、シリアルモニタコマンドをいくつか追加しています。
アセンブルしてFPGAボードに書き込むと、シリアルモニタから以下のコマンドを受け付けるようになっています。
シリアルモニタコマンド仕様:
MoscoviumマイコンがCmod A7ボード上で起動すると、シリアルモニタから上に示したコマンドを受け付けるようになっており、並列してオンボードのRGB LEDが7色に点滅します。
では、完成したデザイン(回路)をCmod A7ボードへ書き込んで、実機での動作確認へ移りましょう。
さて前節にて、Cmod A7ボードへMoscoviumマイコンの回路をCmod A7ボードへ書き込みました。この時点で、Cmod A7ボードはお使いのPCとUSB接続されているはずです。
(中華製)Primerボードの時には、回路書き込みの為に接続したUSBを使うと回路書き込みだけが可能で、シリアルモニタなどの通信には使用できませんでした。このためPrimerボードでは、別途外付けにFTDI等のUSB⇔UART変換モジュールを接続する必要があり、PCのUSB端子を2本も塞いでいました(下図)。
中華品質のショボイPrimerボードと異なり、Cmod A7ボードでは、書き込み用のUSB⇔JTAG変換と、シリアルモニタなどの通信用USB⇔UART変換がデュアルモード接続なので、書き込み/電源供給用に接続したUSBで、そのままシームレスに、シリアルモニタを確立できるのです(下図)。
Cmod A7ボードでは占有するUSB端子は1本なので、とても使い易くなっています。良き事(1^−^)/〜。
Cmod A7ボードへの書き込みが成功すると、オンボードのRGB LEDがピカピカ光っているはずです。以下の様に色を変えながら光っていることを確認してください。
消灯 | ↓ | |||||||
↑ | 青 | ↓ | ||||||
↑ | 赤 | ↓ | ||||||
↑ | 紫 | ↓ | ||||||
↑ | 緑 | ↓ | ||||||
↑ | 水 | ↓ | ||||||
↑ | 黄 | ↓ | ||||||
↑ | ← | ← | ← | ← | ← | ← | 白 | |
消灯へ戻って繰り返し。 |
各色の点滅パタンは、「短く2回光って、長めに消灯、周期約1秒」です。
新規設計したTIMLED5ユニットのPWM出力が利いているので、RGB LEDの明るさ自体は、デューティレジスタで制御可能です。シリアルモニタに追加したコマンドを使って、動作を確認しておきましょう。
実験サンプル:
【wr,f160,0f】 …… tledctlレジスタのRGBE,LEDG,R,Bビット=1書き込み
OK: write[0xf160]=0x000f
【wr,f166,00】 …… tleddtyrレジスタ=0x00書き込み
OK: write[0xf166]=0x0000
【wr,f168,40】 …… tleddtygレジスタ=0x40書き込み
OK: write[0xf168]=0x0040
【wr,f16a,30】 …… tleddtybレジスタ=0x30書き込み
OK: write[0xf16a]=0x0030
RGB LEDが「緑色がかった水色」に光りましたか?
loop処理内でチカチカ点滅させているのは、従来通り汎用I/Oポート(PORT[2:0])を使っているので、上サンプルの様にTIMLED5ユニットのRGBEビット=1を設定してジャックすると、乗っ取ることができます。乗っ取った時点で、点滅は停止します。
点滅を再開するには、以下のコマンドを実行してください。
【wr,f160,00】 …… tledctlレジスタのRGBEビット=0書き込み
OK: write[0xf160]=0x0000
RGBEビット=0としたことで、また汎用I/Oポートに制御が戻って、点滅が再開します。
その他、【rd】コマンドを使ってI/Oレジスタ値を読み出してみたり、単色LEDの制御等を確認して見てください。
※点滅が再開しても、先ほど実験で書き込んだデューティの制御は活きているので、赤色が光らない等、最初の状態とは変化しているはずです。完全に元へ戻す場合は、デューティレジスタ×3個にも初期値0x80を書き込むか、いっその事、システムリセットをかけてしまってください。
新生(?と、言うほどの事も無いけれど……)Moscoviumマイコンの動作を確認できました。これまでに設計してきた様々なI/Oモジュールの、ほんの一部しか確認できておりませんが、まず、最初の一歩と言う事になります。