こんにちは。FPGAプログラミング初学者の「ひがし研究所」です!
企業のエンジニアとして働きつつ、FPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。
これまで、Verilogを用いたハードウェア言語での回路記述をメインに行ってきましたが、スキルを広げるためにソフトウェアでのシステム構築の勉強をしています。
初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にしていこうと思いますので、ぜひご覧いただければと思います!
では、前回の記事に引き続き、今回の記事では、Xilinx社のCPUが内蔵されたFPGAチップZynqを初めて扱う人が、最初に作る”Hello World”のプログラムを実行する方法についてまとめます。
それでは、興味のある方はぜひ最後までご覧ください!
1. 目標と工程
開発目標
本記事では、前回の記事に引き続き、以下の目標で開発を進めています。
Zynq CPUで処理した”Hello World”プログラムからの出力をホストPCで受信する
これを目標とします。
開発工程
今回はやり残していた開発工程のうち②と③を行います。
今回、以下の書籍を参考にさせていただきました。
2. システムの構成
開発ボード Zybo Zynq-7010評価ボード
Zyboのシステム構成図
Zyboのマニュアルを参考にまとめると、以下のようなシステム構成になります。
※本記事で必要なところのみを抜粋しています。実際の回路基板には他にも多くの有用な機能が含まれます。
3. プロジェクトの作成
ソフトウェア設計
前回の記事では、統合開発環境Vivadoを用いて、“Hello World”プログラムをFPGAに実装するためのシステム構成を設計しました。
今回の記事では、Zynqのハードウェア上で動作するソフトウェアプログラムを作成します。
まず、前回作成したbitファイルを“Export Hardware”でXilinx Software Development Kit、通称SDKにエクスポートします。
そして、SDKを起動し、アプリケーションファイルを作成していきます。
Vivadoの“Launch SDK”をクリックすると、SDKが図のように起動します。
このウィンドウ上でアプリケーションファイルを作成していきましょう。
メニューから[File]>>[New]>>[Application Project]を実行します。
アプリケーションプロジェクトを作成するための、ウィンドウが新たに立ち上がります。
アプリケーションプロジェクトの名前を”hello”と選択すると、ライブラリやヘッダファイルが格納されたBSP(Board Support Package)プロジェクトの名前も”hello_bsp”と自動で入力されます。
ちなみに、作成したハードウェアプロジェクトは中段の”Target Hardware”の欄に予め自動入力されています。
入力が完了したら、[Next]をクリックします。
次のダイアログでは、Xilinx社が提供しているプログラムのテンプレートが各種用意されているので、今回の目的の[Hello World]を選択し、[Finish]をクリックしましょう。
”Hello World”のプログラムはテンプレートがあるので、テンプレートを選択するだけで簡単です。
SDKで作成したプロジェクトは左の”Project Explorerペイン”に表示されています。
”Project Explorer”上には、次の3つのプロジェクトが作成されました
メインアプリケーションとなるhelloworld.cは、アプリケーションプロジェクトのsrcフォルダ内に格納されています。
ちなみに、プログラムは下のソースコードのように非常にシンプルです。
int main()
{
init_platform();
print("Hello World\n\r");
cleanup_platform();
return 0;
}
「初期化 → ”Hello World”表示 → 終了」といった一連のプログラムとなっています。
以上でCPUを動かすためのプログラムが完成しました!
とはいえ、ほぼ自動でプログラムが生成されたので、作成したという実感が湧きませんね。
プロジェクトの機能や階層構造などの細かい考察は今後深めていきましょう!
まずは、プログラムを実装し、回路基板上で動かしてみましょう!
4. 実装と動作確認
ハードウェアの実装
回路基板をホストPCにつなぎ、PCで[Program FPGA]を選択します。
Xilinx Software Development Kit(通称SDK)のウィンドウ上で、図のようなショートカットをクリックします。
ウィンドウが立ち上がりますので、そのまま[Program]をクリックしましょう。
これをクリックすると、先ほどコンパイルしたビットストリーム(bit)ファイルがFPGAに送信され、コンフィグレーションされます。
これにより、ハードウェアの実装が完了しました。
つまり、ソフトウェアを書き込むための環境(プラットフォーム)が基板上に用意されたといえます。
ソフトウェアの実装
次に、ソフトウェアの書き込みを行います。
引き続きSDKのウィンドウ上でアプリケーションプロジェクト”hello”を選択します。
そして、メニューから[Run]>>[Debug Configurations…]を実行します。
そうすると、Debug Configurationsウィンドウが立ち上がります。
このウィンドウの“Xilinx C/C++ application (System Debugger)”をダブルクリック(①)すると、新しいデバッグ設定が作成されます(②)。
デバッグ設定を確認できたら、[Debug]をクリックしてください(③)。
次のウィンドウは操作画面をデバッガの画面に切り替えることを確認するダイアログなので、気にせずに[Yes]をクリックするのでよいでしょう(④)。
デバッガ操作画面に切り替わります。
中央のソースコードでは、“init_platform()”が緑色にハイライトされていて、ここで処理が停止していることを示しています。
動作確認
UARTからの信号を受信して表示するSDKターミナル上で、ホストPCのCOMポートを設定できれば、いよいよプログラムの実行です!
[Resume]アイコンをクリックしてプログラムを実行しましょう。
無事に”Hello World”の文字列が表示されました!!
文字列が表示されるだけだと、Zynq経由で送信されたものなのかどうか、実感が湧きづらいと思います。
次回はCPUのプログラムで、実際の回路基板上のLED点滅回路を動かしていき、理解を深めたいと思います。
まとめ
以上をまとめると、この通りです。
本日の記事を踏まえて、次回はLED点滅回路を動かしていきましょう!
ここまで読んでいただき、ありがとうございました。
コメント