【Hello World編(2)】Vitisで”Hello World”プログラムを実行してみた – プログラムの作成と実装 –

Vitis
スポンサーリンク

本記事の概要

本記事の概要は以下の通りです。

概要

Zynq上のCPUで動作する“Hello World”プログラムを、Vitis 2020.2で作成し実装。動作確認を行った。

  • Vitis 2020.2上でプラットフォームプロジェクトとシステムプロジェクト(アプリケーションプロジェクト)を作成
  • Vitisに用意されている”Hello world”のテンプレートからアプリケーションを作成
  • UART経由でZynqから送信された”Hello world”の文字列を確認

これまでFPGAを用いたシステム開発には、ハードウェア設計にVivado、ソフトウェアアプリケーションの開発にXilinx SDKを用いられてきました。
しかし、2019年以降、ソフトウェアアプリケーションの開発は、Xilinx SDKから統合ソフトウェア開発環境「Vitis」へと移行しています。
「Vitis」での開発環境に慣れ親しんでおくためにも、Xilinx SDK 2019.1で作成した”Hello World”アプリケーションを、Vitis 2020.2でも作成してみました。

前回の記事に引き続き、今回の記事では、統合ソフトウェア開発環境Vitis 2020.2とXilinx FPGA向け設計ツール Vivado 2020.2を用いて、開発ボードZybo (搭載SoCチップ Zynq)に実装する”Hello World”アプリケーションを作成する方法についてまとめます。

この記事の対象読者
  • FPGAプログラミングの初学者
  • Zynqを用いた設計は未経験のエンジニア
  • FPGAの開発に興味のある学生
ひがし
ひがし

それでは、興味のある方はぜひ最後までご覧ください!

今回、以下の書籍を参考にさせていただきました。

目標と工程

開発目標

本記事では、前回の記事に引き続き、以下の目標で開発を進めています。

統合ソフトウェア開発環境VitisとFPGA設計環境Vivadoを用いて
“Hello World”文字列をZynqからホストPCへと送信するアプリケーションを作成する

開発工程

今回はやり残していた開発工程のうち②と③を行います

開発工程

① FPGA内部のハードウェア構成を定めるプロジェクトを作成
② Zynq CPUで動作する”Hello World”プログラムを作成(本記事)
③ ①と②を実装(本記事)

システムの構成

開発環境

環境
  • 開発用PC: Windows 10, 64bit
    • Vivado Design Suite – HLx Edition – 2020.2
    • Vitis コア開発キット – 2020.2
  • 開発用基板: Zybo Zynq-7010評価ボード(Board Rev.4)
    • Zynq XC7Z010-1CLG400C

開発ボード Zybo Zynq-7010評価ボード

Vitisプロジェクトの作成

Vitis 2020.2のワークスペースの作成

前回の記事では、Vivado 2020.2を用いて、“Hello World”プログラムをFPGAに実装するためのハードウェア部分の設計を行いました。

今回の記事では、前回ハードウェア設計したシステム上で動作するアプリケーションをVitis 2020.2上で作成します。

まず、前回作成したVivadoプロジェクトを立ち上げます。
[Tools]タブから、[Launch Vitis IDE]をクリックします。

Vitis IDE Launcherというウィンドウが立ち上がります。
アプリケーションプロジェクトのファイル群を格納する“Workspace”のディレクトリを指定します。指定が完了したら、[Launch]をクリックします。

新しくウィンドウが立ち上がります。[Create Application Project]をクリックし、新しいアプリケーションプロジェクトを作成していきます。

最初のウィンドウでは、各プロジェクトの位置づけを説明しています。
このウィンドウではそのまま[Next]をクリックします。

Vitis上では、プラットフォームプロジェクトとシステムプロジェクトの大きく2つのプロジェクトが作成されます。システムプロジェクトは、一つのデバイス上で同時に実行される複数のアプリケーションプロジェクトをグループ化したものになります。

Vitis上に作成されるプロジェクト
  • プラットフォームプロジェクト
    • ハードウェアデザイン(XSAファイル)
    • ドメイン… BSP (Board Support Package)やOSなどのハードウェアを動作させるための基本ソフトウェアのグループ
  • システムプロジェクト
    • アプリケーションプロジェクト…ドメイン上で動作する、”Hello World”のような各アプリケーションソフトウェアのグループ

ハードウェアデザインの読み込み

まずは、プラットフォームプロジェクトの初期設定です。
Vivadoで作成したハードウェアデザイン(XSAファイル)を読み込んでいきます。
[Create a new platform from hardware (XSA)]タブを選択します。

[Browse]をクリックし、前回の記事で作成した“hello_world_system_wrapper.xsa”を選択します。

選択が完了したら、[Next]をクリックします。

システムプロジェクト(アプリケーションプロジェクト)の作成

次に、システムプロジェクトを作成していきます。
今回、システム上で動作するアプリケーションが一つだけなので、アプリケーションプロジェクトとシステムプロジェクトはほぼ同じような位置づけになります。

アプリケーションプロジェクト名を入力し、アプリケーションを動作させるプロセッサの種類を選択したら、[Next]をクリックします。
今回、アプリケーションプロジェクト名は“hello_world_application”としました。

ドメインの指定

次に、ドメインです。
今回は特に設定変更不要ですので、そのまま[Next]をクリックします。

このようにハードウェアデザインを読み込めば、ドメインは自動で作成されます。

ひがし
ひがし

一つのハードウェアに複数のドメインを作成することもできるようです(リンク)。いろいろと応用の幅が広がりそうですね!

システムプロジェクト(アプリケーションプロジェクト)のテンプレートの読み込み

次に、先ほど名称を決めたアプリケーションプロジェクトの中身を作成していきます。

ゼロからソースコードを自作していくことも可能ですが、今回は”Hello World”プログラムのテンプレートが用意されていますので、それを読み込んでいきます。

“Hello World”を選択し、[Finish]をクリックします。

ここまで完了すると、Vitis IDEのウィンドウが立ち上がります。

左のExplorer内には、大きく2つのプロジェクト(hello_world_system_wrapper と hello_world_application)が作成されていることがわかります。
この2つのプロジェクトがそれぞれプラットフォームプロジェクトとシステムプロジェクトに対応しています。

ひがし
ひがし

メインアプリケーションとなるhelloworld.cは、アプリケーションプロジェクトのsrcフォルダ内に格納されています。

ちなみに、プログラムは下のソースコードのように非常にシンプルです。

int main()
{
    init_platform();

    print("Hello World\n\r");
    print("Successfully ran Hello World application");
    cleanup_platform();
    return 0;
}

「初期化 → ”Hello World”表示 → 終了」といったシンプルなプログラムとなっています。

プロジェクトのビルド

プラットフォームプロジェクトのビルド

まず、プラットフォームプロジェクトをビルドしていきます。
エクスプローラ内のプラットフォームプロジェクト(hello_world_system_wrapper)を選択し、右クリックします。[Build Project]を選択すると、ビルドが始まります。

ビルドは数秒~10秒程度で完了します。

システムプロジェクトのビルド

次に、システムプロジェクトをビルドしていきます。
エクスプローラ内のシステムプロジェクト(hello_world_application_system)を選択し、右クリックします。同様に[Build Project]を選択すると、ビルドが始まります。

以上でCPUを動かすためのプログラムが完成しました。

ひがし
ひがし

とはいえ、ほぼ自動でプログラムが生成されたので、作成したという実感が湧きませんね。

プロジェクトの機能や階層構造などの細かい考察は今後深めていきましょう
まずは、プログラムを実装し、回路基板上で動かしてみることが大事です。

実装と動作確認

実装

回路基板をホストPCにつなぎます。
つないで電源を入れたら、PC側からFPGAへのbitstreamファイルの書き込み(コンフィグレーション)とアプリケーションソフトウェアのDDRへの書き込みを実行します。

“hello_world_application_system”を右クリックし、[Debug as]>[Launch Hardware]を選択すると、コンフィグレーションとソフトウェアの書き込みが実施されます。

Zynq SoCへの書き込みが完了したら、デバッガ操作画面に切り替わります。
中央のソースコードでは、“init_platform()”が緑色にハイライトされていて、ここで処理が停止していることを示しています。

動作確認

動作確認のために、ホストPCのCOMポートを設定します。

UARTからの信号を受信して、表示するのは[Vitis Serial Terminal]です。
[Vitis Serial Terminal]の右上の[+]マークをクリックすると、”Connect to serial port”というウィンドウが立ち上がります。
このウィンドウ内の[Port:]から[COM4]を選択し、[OK]をクリックします。

これにより、COMポートの設定が完了しました。

COMポートの設定が完了したら、いよいよ実行です。
init_platformで動作が停止しているアプリケーションを再開します。[Resume]マークをクリックされば、再開されます。

無事に”Hello World”の文字列が表示されました!!

ひがし
ひがし

文字列が表示されるだけだと、Zynq経由で送信されたものなのかどうか、実感が湧きづらいかもしれませんが、これで成功です。
次回はCPUのプログラムで、実際の回路基板上のLED点滅回路を動かしていき、理解を深めたいと思います。
ここまで読んでいただき、ありがとうございました。

次回の記事へのリンク

コメント