どもです。
どうやらEfinixのFPGA書き込み用ドライバによって標準ドライバ環境を破壊されたらしく、
いや草
— AUDIY (@AUDIY14) October 28, 2023
(T20開発ボードとTang Primer 20Kを一台ずつ接続) pic.twitter.com/qNDx7guTc2
Cmod S7繋いでみたが
— AUDIY (@AUDIY14) Janulary 21, 2024l
・・・・・・お前もかw
(Trion T20 Development Boardとして認識している) pic.twitter.com/EdHNebn2XY
もう二度とメインマシンにEfinix FPGAの開発環境入れませんわ・・・・
ドライバ環境を一からやり直すとなるとWindowsのクリーンインストールしかなさそうなのですが、それはそれで時間がかかって面倒くさいのと、C言語でのソフトウェア開発でLinuxマシンがないと不便なこともあり・・・・・・
・・・・・・導入しました。
キタァァァァァァァァァァァァァァァ pic.twitter.com/RUeIv2FG0P
— AUDIY (@AUDIY14) January 24, 2024
今は購入したThinkPadにUbuntu入れてVitisやらDockerやらC/C++コンパイラやら入れて使ってます。
やっと開発環境も整いつつあるんで、今回は前回の続きとして、
歩きそう pic.twitter.com/TGyU8jBkQt
— AUDIY (@AUDIY14) January 9, 2024
CMOD S7にMicroBlazeを実装して動かすところから初めて、VivadoとVitisに一度触れてみたいと思います。
DigilentのMicroBlazeチュートリアルを試す
DigilentのFPGAボードのIntroductionを読んでいると、ページ下部に複数のチュートリアルが提供されています。
今回はこれに沿ってMicroBlazeをCMOD S7上のSpartan-7 FPGAに構築し、LチカおよびPCとのUSB-UART通信を実装してみたいと思います。
と、その前に・・・
DigilentのFPGAボードですが、Digilentが公式でボードファイルを提供しているため、これを自身のVivado環境に導入します。
(多分なくてもできますが、あったほうがピン周りの配線の自動設定とかしてくれるので大変便利です。)
Digilentの"Installing Vivado, Vitis, and Digilent Board Files"にアクセスします。
(この時点でVivadoやVitisをインストールしていない方は合わせてやっちゃいましょう。)
digilent.com"Install Digilent's Board Files"の項までジャンプします。
そこから最新版のボードファイル一式をダウンロードするリンク("Master Branch ZIP Archive"と記載があります)をクリックするとDigilentのボードファイル一式がダウンロードされます。
ダウンロードされたZIPファイルを展開し、new/board_filesの中身をVivadoをインストールしたフォルダの/Xilinx/Vivado/<version>/data/boards/board_files内にコピー&ペーストします(board_filesフォルダがない場合は新規に作成し、その中にコピー&ペーストします)。
ここまでできたらチュートリアルを始めていきたいと思います。
本家のチュートリアルはDigilentのあらゆるボードでできるようにところどころ表現がボカされていますので、ここではCMOD S7 & Ubuntuの開発環境に合わせ改変していきたいと思います。
やっていこう
以下リンク先に従ってチュートリアルをやっていきます。
digilent.com
Vivadoの立ち上げ
Vivadoを立ち上げます。
いろんなサイトを確認するとsettings64.shを使って環境変数を通してコマンドを叩いて開いていますが、Version 2023.2だとアプリケーション一覧のアイコンで開くことができました。
プロジェクトの作成
プロジェクトを作成していきます。
Quick Startから"Create Project"を選択します。
"Next"をクリックします。
プロジェクト名とプロジェクトの保存場所を決めます。
今回のプロジェクト名は"Digilent_Microblaze_Tutorial"としました。
プロジェクト形式を決めます。
"RTL Project"に設定し、"Do not specify sources at this time"のチェックボックスにチェックをつけて"Next"をクリックします。
使用するFPGAを選択します。デバイスから選択もできますが、今回はBoardから選択します。
Searchの欄に"cmod"と入力すると"Cmod S7-25"が出てくるので選択します。Digilentのボードファイルを導入していないと表示されないので注意してください。
ボードファイルを導入済みなのに出てこない場合は左下の"Refresh"をクリックしてみてください。それでも出てこない場合はボードファイルを格納した場所を再確認する必要があります。
以下はRefreshボタンをクリックした際の画面です。少し待ちます。
使用するボード(今回はCmod S7-25)を選択して"Next"をクリックします。
プロジェクトの概要が表示されますので、問題なければ"Finish"をクリックします。間違いがあれば"Back"をクリックして設定し直します。
ブロック図からMicroBlazeと周辺回路を構築する
現在開いているVivadoですが、RTLやIPの設定や配線、シミュレーション、ビットストリーム書き込みを行うための「AMD製FPGAやSoCのハードウェアを担当するツール」となります。
ここからはCMOD S7上のSpartan-7にMicroBlazeを構築していきます。
AMD FPGAやSoCに初めて触れるかたは"MicroBlaze"や"Zynq"など混乱するかもしれませんが、
- MicroBlaze:AMD FPGAまたはSoCのユーザロジック(PL)上に構築されるCPU IP。ユーザロジックを使用するため自前のRTLを構築できる領域が減少し、動作速度も期待できないが低コスト。
- Zynq:AMD SoC内にFPGA(PL)とは別に存在しているARMアーキテクチャのハードウェアCPU(PS)。ユーザロジックを使用せず、専用のマイコンが配置されているため動作速度はMicroBlazeより期待できるが、専用のマイコンがある分高コスト。
となります。
まぁAMDの場合はSoCそのものがZynqと命名されている(Versal除く)ため間違いは起きにくいと思いますが、今回使用するCMOD S7に配置されているSpartan-7は純粋なFPGAなので、今回はMicroBlazeを構築します(実はIntelがこのあたりちゃんと調査しないと分かりにくいんですよ・・・)
余談はこのあたりにしておきまして・・・
Vivado左側のメニューより"IP INTEGRATOR"一覧から"Create Block Design"を選択します。
以下のようなウィンドウが出てくるのでDesign nameを決めます。今回は"MicroBlaze_blink"としました。
DirectoryやSpecify source setの項目は何も触らず、"OK"をクリックします。
※Design nameには" "(スペース)を使用しないようにしてください!代わりに"_"(アンダーバー)、"-"(ダッシュ)、キャメルケース(各単語の冒頭を大文字にする。今回のDesign nameだと"MicroblazeBlink")の使用が推奨されています。
ブロック図にMicroBlazeを配置する
いよいよMicroBlazeを構築していきます。
まずはMicroBlazeを動作させるためのクロックを設定します。
Diagramの隣にある小さなウィンドウから"Board"を選択し、"Clocks"一覧の"System Clock"を右クリックして"Connect Board Component"を選択します。
以下のウィンドウが出てくるので"clock_CLK_IN1"にのみチェックがついていることを確認して"OK"をクリックします。
外部リセットを自動で配置します。Diagram上に緑色のバーで表示されている"Run Connection Autometion"をクリックします。
以下のようなウィンドウが出てきます。左側のresetにチェックがついていることを確認します。Digilentのほとんどのボードで自動でリセットに繋がれるポートが選択されるので"OK"をクリックします(CMOD S7では基板上のBTN0をリセットとして配置します)。
ここで、Diagram上の"Clocking Wizard"をダブルクリックしてみます。
IPの設定画面が出てきます。詳細は割愛しますがリセットの極性やIP動作モード、出力数、出力クロックの周波数など細かく設定できます。
Output Clocksのタブをクリックするとクロック周波数や出力数がわかります。現在の設定では100MHzをclk_out1から出力します。
今回は何も設定を変更しないので、"Cancel"をクリックしてウィンドウを閉じます。
次にMicroBlazeを配置します。Diagramから上列の"+"ボタンをクリックします。
検索欄が出てくるので、"microblaze"と入力し、"MicroBlaze"をダブルクリックすると・・・
MicroBlazeが配置されます。
必要な周辺IPを配置する必要がありますがここはVivadoにまかせてしまいます。緑色のバーに表示されている"Run Block Alutomation"をクリックします。
以下のようなウィンドウが出てきます。MicroBlazeの設定に合わせ周辺ブロックも自動設定してくれます。
今回のチュートリアルをCMOD S7で行う場合は以下のように設定します。l
- Preset: None
- Local Memory: 32KB
- Local Memory ECC: None
- Cache Configuration: None
- Debug Module: Debug Only
- Peripheral AXI Port: Enabled
- Interrupt Controller: チェックをつける
- Clock Connection: /clk_wiz_0/clk_out1 (100MHz)
各項目の設計基準は以下のようになります(本家チュートリアルより抜粋)。
OKをクリックすると周辺ブロックの配置および配線が自動で行われます(すげぇなVivado!)
次にPCとのUSB-UART通信部を配置します。Diagram横の小さなウィンドウから"Board"タブを選択し、"UART"から"USB UART"を右クリックして"Connect Board Component"をクリックします。
以下のウィンドウが出てきます。"AXI Uartlite"下部にある"UART"を選択し、"OK"をクリックします。
Diagram上にUART通信部が配置されるので、緑色のバーに表示される"Run Connection Automation"をクリックします。
以下のウィンドウが出てきます。画面左側の"S_AXI"にチェックが入っていることを確認し、あとは設定を変更せず"OK"をクリックします。
こんな感じのブロック図になっていると思います(ブロックの位置や配線は環境により異なるかもしれません。)
ちょうど公式チュートリアルが半分進んだ感じなので、今回はここまでとします。
Vivadoのブロックの自動配置・配線機能は大変ありがたい機能に感じました。
ただ、各ブロックの接続が基本AXIなのと、触れないであろうブロックまで表示されるので全体の視認性は少々悪く感じます(それ故に自動配置の機能があるんだと思いますが)。
次回はボタンやLED等に接続されるGPIOの配置、コンパイルの制約、コンパイル、ビットストリームの生成、VitisでのLチカソフトウェア実装とソフトウェアの書き込みをやっていきます。