- 1回目: 開発環境の準備
- 2回目: Hello Worldプロジェクト
- 3回目: PSのGPIOでLチカ
- 4回目: PLのAXI GPIOでPSからLチカ
- 5回目: PLだけでLチカ
- 6回目: 自作IPでLチカ
- 7回目: ブートイメージを作る <--- 今回の内容
- 8回目: Linux起動する
- 9回目: Linuxカーネルを少しカスタマイズする
- 10回目: LinuxのRootFSをカスタマイズする / PythonでHello World
- 11回目: LinuxユーザアプリケーションでLチカ
- 12回目: LinuxカーネルモジュールでLチカ
- 13回目: LAN(Ethernet 0)を使う
- 14回目: Linuxユーザアプリをデバッグする / RootFSに取り込む
- 15回目: Linux起動時にアプリケーションを自動実行させる
- 16回目: Linuxから自作IPをUIOで制御する
- 17回目: Linuxで自作IPのデバイスドライバを作る
- 18回目: IoT化してスマホからLチカ
この記事の内容を2分で見る ( https://www.youtube.com/watch?v=tiS0v1DPRL0 )
環境
- 開発用PC: Windows 10 64-bit
- Vivado 2017.4 WebPACKライセンス
- Xilinx SDK 2017.4
- ターゲットボード: ZYBO (Z7-20)
Windows環境は1回目を参照。
使用するハードウェア(hdf)は6回目を参照。
Boot Imageを作る
これまで、バイナリファイルの書き込みはJTAGで行っていました。そのため、電源をOFF/ONするたびに書き込みが必要でした。今回は、ブートイメージを作成して、それを使ってSDカード/QSPIから起動するということをやります。
使用するプロジェクトは何でもいいのですが、前回のプロジェクトを使います。これは、PL単体だと全LEDがONになる。PSから制御するとLEDがチカチカするというものです。
Zynq起動の流れ
Boot Image作成に必要なファイルを理解するために、起動シーケンスについて簡単に説明します。詳細はZynqやZyboのリファレンスマニュアルに記載されています。
Zynqの起動は以下の3つのステージに分かれています。設定によって色々と変わりますが、典型例は以下の通りです。
- Stage 0 (内蔵BootROMの起動コードが働く)
- 内蔵BootROMの起動コードがCPU0で動く。これが、FSBL (First Stage Boot Loader)を読み込み、制御を移譲する。FSBLをどこから読むかはジャンパーで決まる。
- Stage 1 (FSBLが働く)
- FSBLがPS周辺回路(DDRなど)をコンフィギュレーションする
- もしもビットストリームファイルがあれば、PLのコンフィギュレーションをする
- もしもユーザーアプリケーションがあれば、ロードする
- Stage 2
- ユーザプログラムを実行する。 (もしもLinuxの場合は、U-BootなどのSecond Stage Boot Loaderが呼ばれる)
Boot Imageの構成
作成するブートイメージは、BOOT.binという1つのバイナリファイルです。この中に、以下のデータを格納します。
- FSBLバイナリ (これから作る)
- PL用のビットストリーム (Vivadoで作成済み)
- PS用のユーザアプリケーションバイナリ (SDKで作成済み)
BOOT.binを作る
FSBLバイナリを作る
前回のプロジェクトの続きとして考えます。SDK上に、blinkというLEDチカチカ用のプロジェクトと、blink_bspプロジェクトが既にあります。ここに、FSBL用のプロジェクトを追加します。
- Xilinx SDKのメニューバー -> File -> New -> Application Projectで新しいプロジェクトを作る
- プロジェクト名は適当に、「fsbl」とする (何でもいい)
- テンプレートとして、「Zynq FSBL」を選んでFinish
- fsblプロジェクトをビルドして、fsbl/Debug/fsbl.elfを作っておく
BOOT.binを作る
- Project Explorerで、搭載したいユーザアプリケーションプロジェクト(今回はblink)を選んでおく
- メニューバー -> Xilinx -> Create Boot Image
- BOOT.binに含めるバイナリを追加する。前述したように、以下のバイナリを含める。順番もこの通りにする必要がある。
- FSBLバイナリ (さっき作った、fsbl.elf)
- PL用のビットストリーム (Vivadoが出力した、design_1_wrapper.bit)
- PS用のユーザアプリケーションバイナリ (SDKで作った、blink.elf)
- Create Imageをクリックすると、blink\bootimage\BOOT.binが作られる
SDカードから起動する
- FAT32でフォーマットしたSDカードにBOOT.binをコピー
- JP5のジャンパピンで「SD」を選ぶ
- 電源を入れなおすと、SDカード内のBOOT.binで起動する
QSPIから起動する
- 念のため、JP5のジャンパピンで「JTAG」を選んで電源OFF/ONしておく
- メニューバー -> Xilinx -> Program Flash
- Image Fileに、blink\bootimage\BOOT.binを指定
- FSBL Fileに、fsbl\Debug\fsbl.elfを指定
- Programをクリック
(ここで、なぜfsbl.elfの指定が必要なのかが不明。バイナリ自体はBOOT.binに含まれているはずなのに。。。アドレス情報とかが必要なのかな?)
QSPIへの書き込み完了後、JP5のジャンパピンを「QSPI」にして、電源を入れなおすと、QSPI内のBOOT.binで起動する
おまけ: PLだけのプロジェクトの場合
PSで動くユーザアプリケーションがない場合(ZynqをFPGAとして使う場合)、必要なのはFSBLとビットストリームファイルだけになります。fsblプロジェクトを選んだ状態で、Create Boot ImageすればOKです。