LoginSignup
6
3

More than 5 years have passed since last update.

SDSoCチュートリアル with ZYBO (Zynq) (2)Linuxプラットフォーム

Last updated at Posted at 2018-08-05

この記事について

XilinxのSDSoC環境を使った開発の流れをステップバイステップで紹介していきます。
(僕自身、この記事を書いている時点でSDSoCを初めて使ってから1日も経っていないので、間違えがあるかもしれません。その際は教えてください)

環境

  • 開発用PC: Windows 10 64-bit
    • Vivado 2018.2 WebPACKライセンス
    • Xilinx SDK 2018.2
    • SDx IDE 2018.2
  • 開発用PC (Linux): Ubuntu 16.04 本家 (日本語版じゃない) (on VirtualBox 5.2.4)
    • PetaLinux 2018.2
  • ターゲットボード: ZYBO (Z7-20)

事前知識

ZYBO (Zynq) 初心者ガイド シリーズの1, 2, 3, 4, 7, 8, 9, 10, 11の内容を理解してあると捗ると思います。

参考資料

  • ug1027-sdsoc-user-guide.pdf
  • ug1028-sdsoc-intro-tutorial.pdf
  • ug1146-sdsoc-platform-development.pdf
  • ug1236-sdsoc-platform-tutorial.pdf

今回やること

  • Linux用のSDSoCプラットフォームを作る
  • 作成したSDSoCプラットフォーム上で、行列積の計算を高速化するアプリケーションを作る

ハードウェアは前回 のものを使います。

SDSoCプラットフォームを作る

ハードウェア

以下のファイルが既にあるとします。

  • design_1.hdf (ビットストリームなし)
  • design_1.dsa

ソフトウェアコンポーネントを作る (on PetaLinux)

用意したハードウェア用のLinuxイメージを、PetaLinuxを使って作成します。SDSoCで使用できるようにいくつか設定を変更する必要がありますので、そこも見ていきます。

design_1.hdfをPetaLinuxインストール済みのubuntuの~/workにコピーしておきます。

PetaLinux プロジェクトを作る

PetaLinuxプロジェクトを作る(ターミナルonUbuntu)
cd ~/work
petalinux-create --type project --template zynq --name design_1_linux
cd design_1_linux/
petalinux-config --get-hw-description=../

ブートローダの設定画面が表示されるので、generate boot args automaticallyのチェックを外して、user set kernel bootargsconsole=ttyPS0,115200 earlyprintk quietを設定します。

追記: この設定はなくても大丈夫でした。

01.jpg
02.jpg

PetaLinux カーネルコンフィグ

プロジェクトが作成されたら、下記コマンドでカーネルコンフィグをします。

PetaLinuxカーネルコンフィグ
petalinux-config -c kernel 

Device Drivers -> Generic Driver Options -> Size in Mega Bytesに256を設定します。

03.jpg

Device Drivers -> Staging driverをイネーブル(*)にして、その中の Xilinx APF Accelerator driverと、Xilinx APF DMA engines supportもイネーブル(*)にします。

04.jpg
05.jpg
06.jpg

PetaLinux rootfsコンフィグ

下記コマンドでrootfsのコンフィグをします。

PetaLinuxrootfsコンフィグ
petalinux-config -c rootfs

Confiburation -> Filesystem Packages -> misc -> gcc-runtime -> libstdc++をイネーブル(*)にします。

07.jpg

デバイスツリーの編集

デバイスツリーにAPFドライバ用の設定を追加します。

デバイスツリーの編集
code project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi &
system-user.dtsi
/include/ "system-conf.dtsi"
/{
    xlnk {
        compatible = "xlnx,xlnk-1.0";
    };
};

PetaLinuxのビルド

PetaLinuxのビルド
petalinux-build

必要なファイルをまとめる

ビルド結果はimage/linux/に生成されます。その下にboot/image/ディレクトリを作って、必要なファイルをまとめておきます。

必要なファイルをまとめる
cd images/linux/
mkdir ./boot
mkdir ./image
cp u-boot.elf ./boot/u-boot.elf
cp *fsbl.elf ./boot/fsbl.elf
# cp bl31.elf ./boot/bl31.elf   ## zyboの場合不要
# cp linux/pmufw.elf ./boot/pmufw.elf   ## zyboの場合不要
cp image.ub ./image/image.ub

また、以下のようなbifファイルを作成します。code boot.bif&

boot.bif
/* linux */
the_ROM_image:
{
    [bootloader]<fsbl.elf>
    <bitstream>
    <u-boot.elf>
}

最終的に、まとめたすべてのファイルをWindows側にコピーしておきます。(~/Desktop/win_shareを共有フォルダとします)

Windows側へコピー
cp -rf boot ~/Desktop/win_share/design_1_linux
cp -rf image ~/Desktop/win_share/design_1_linux
cp boot.bif ~/Desktop/win_share/design_1_linux

生成物

  • boot/
    • fsbl.elf
    • u-boot.elf
  • image/
    • image.ub
  • boot.bif

以上で、必要なものは全てそろいました。PetaLinuxはもう使用しないのでUbuntuは閉じてしまってOKです。

SDSoCプラットフォームを作る (on SDx)

SDxを使用してSDSoCプラットフォームを作ります。design_1というハードウェア用のプラットフォームは前回既に作成済みです。今回はそこに、Linux用のSystem Configを追加します。

SDxを起動します。前回と同じworkspaceを開くと、既にdesign_1があります。そこで① Define System Configurationをクリックして、システム設定をします。今回作成するのはLinux用のプラットフォームなので、Nameはlinuxにします。ここで、先ほど作成したbootフォルダと、boot.bifを指定します。

08.jpg
09.jpg

② Add Processor Group/Domainをクリックします。OSにlinuxを設定し、Prebuilt Linux Imageに先ほど作成したimageフォルダを指定します。

10.jpg

最後に、③Generate Platformと④Add to Custom Repositoryをクリックして完成です。
以下のようにdesign_1の下にstandaloneの設定(前回作成)と、linuxの設定が作られます。

11.jpg

SDxアプリケーションの作成

作成したSDSoCプラットフォームを使って、SDxアプリケーションを作成します。
New -> SDx Projectを選びます。Project TypeとしてApplicationを選びます。前回はsample01というプロジェクトを作ったので、区別するために今回はsample01_linuxとします。

12.jpg
13.jpg

その後、Platformを選択する画面で、先ほど作成したdesign_1というプラットフォームが選びます。このとき、System configurationとして、linuxを選びます。(前回はstandaloneしか選べませんでした)

14.jpg
15.jpg

Templateとして、前回と同じくArray Partitioningを選びます。
16.jpg

SDxアプリケーションのビルドと実行

作成したプロジェクトで右クリックして、Build Projectします。今回も15分ほど待ちます。
ビルドが完了すると、SDカードイメージも作られるので(BOOT.bin, image.ub, sample01_linux.elf)、まずはその中身をSDカードにコピーします。

17.jpg

前回のstandaloneプロジェクトではこのままデバッグできたのですが、今回はまず、SDカードからLinux起動する必要があります。ZYBOのJP5をSDに切り替えてSDカードから起動するようにします。この状態で電源ONすると、Linuxが起動します。

実行バイナリ(sample01_linux.elf)自体は、SDカードに入っているので、まずはこれを実行してみます。SDカードは/run/media/mmcblk0p1/にマウントされているようです。

ZYBOターミナル
/run/media/mmcblk0p1/sample01_linux.elf

すると、以下のように実行されていることが分かります。

18.jpg

SDxアプリケーションのデバッグ

SDxからTCF経由でデバッグできるようにします。
まず、SDxとZYBOをTCF(on LAN)で接続します。
Run -> Debug COnfigurationsを開き、Xilinx SDx Application Debugger -> Debugger_sample01_linuxを選び、ConnectionでNewします。HostにZYBOのIPアドレスを設定してOKします。その後、Debugをクリックすると、デバッグが開始するはずです。この時の出力はUARTではなくSDx上のターミナルになります。

19.jpg
20.jpg
21.jpg

(追記)HLS(PL)コード変更後は要注意

注意点というか、僕がハマった点です。もしかしたら別の解決策があるかもしれません。

SDx上でソースコードを変更後は、Build後にRun/Debugすれば変更したコードを実行できます。しかし、HLS (ハードウェア:FPGA) 側のコードを変更後は、Run/Debugしてもハードウェア(ビットストリーム)の変更は反映されません。変更を反映するためには、SDカード内のイメージ(BOOT.bin)を再度上書きする必要があります。

これに気付かずに、1週間くらいハマっていました。。。気づいてしまえば、当然といえば当然なのですが。。。

ただ、開発フローとしてHLS変更後に毎回SDカード書き換えが必要というのもあり得ないと思うので、もしかしたらもっといい方法があったり、手順を僕が飛ばしているだけかもしれません。

(追記)
SDカードを抜き差ししないでも、scpで転送してrebootすると比較的楽にビットストリームを更新できます。

msysなどのターミナル(onHostPC)
scp /c/path-to-project/sample01/Debug/sd_card/* root@192.168.1.87:/run/media/mmcblk0p1/.
ZYBOターミナル
reboot
~~リブート後~~
/run/media/mmcblk0p1/sample01.elf
6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3