アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

ultra96v2の動作に必要な「BIFファイル」作成、vitis IDEの立ち上げまで【FPGA】- VitisPlatform作りpart3

前回の続編のpart3。Vivadoでultra96のデザインブロックとかXSAファイルを作成した後、PetaLinuxでVitisプラットフォーム(vitis IDE)立ち上げまでやっていく。

part3の作業で完了するのは「vitis IDE」構築のvitisの部分。
f:id:trafalbad:20200314065320p:plain



メインでにやること

・ultra96の動作に必要な「BIFファイル」の作成

・vitis IDEの立ち上げ


手順はほぼ本家のサイト「Ultra96用Vitisプラットフォームの作り方(BASE編)」通り作業していく。



ただVivadoで作成するXSAファイルは本家サイト通りやってもエラーが出て作成できなかったので、Xilinxgithubのファイルで代用した。
Alternative XSA file at GitHub


目次
1.Vivadoでのハードウェア設計
2.PetalinuxでLinuxシステムの設計
3.Vitis IDEを立ち上げてみる





1.Vivadoでのハードウェア設計

Vivadoでultra96v2で動作させるハードウェアを設計。
今回は参考サイトのだと何故かうまくいかないので、Xilinxgithubから代用のXSAファイルを使う。

一応、ultra96で使うまでのハードウェア設計の手順だけまとめていく。ここはほぼ本家と同じ



1.新規プロジェクトと新規ブロックデザインの作成



  • 「Create Project」からProject作成
  • ・Project name:ultra96base
    ・Project location: /home/[host-name]/ultra96base
    ・Project type:RTL Project
    (「Do not specify sources at this time」のブロックにチェックを入れた)


  • [Add Sources]と[Add Constraints]ページはデフォルトのまま[next]ボタン。

  • 次のページで右の「Board」クリックから「Ultra96」をsearchで「Ultra96v2 Evaluation Platform」を選択 => next&finishでNew Project完成。

  • ***Project再開方法
    Open ProjectからProjectを作ったフォルダの[プロジェクト名.xpr]を選択し、再開。



  • 次にブッロクデザインの作成

  • 右の[Flow Navigator]でIP INTEGRATOR => Create Block Design => ブロックデザイン名を決める。
    デフォルでいいのでOKで作成。




    2.Blockの配置・配線



    デザインを作成すると、キャンパスが出てくるのでブロック追加・配線をする。ここは本家サイトと同じなので
    ・簡単な流れ
    ・エラーになる箇所のポイント
    をまとめた。


  • +のアイコンから[Add IP]でブロックを追加していく

  • [Search]からzynqを入力して[Zynq UltraScale+ MPSoC]を選択・配置して、[Run Block Automation]をクリックし、デフォルト値のままOK。
    f:id:trafalbad:20200403001151j:plain



  • ZYNQ7 Processing Systemをダブルクリックし、PS-PL Configuration -> AXI Non Secure Enablement -> GP Master AXI Interface -> M_AXI_GP0 interface のチェックを外し、OKをクリック
  • Clocking Wizardを追加し、その後同IPの設定のOutput Clocksタブより、clk_out2~Nまで追加して、適切なHzに変更(例:clk_out2を200Hz, clk_out3を300MHz)。 Reset TypeをActive Lowにする
  • Processor System ResetとConcatを配置
  • Concatは[Number of Port]を1にする。

  • 下図のように配線
    f:id:trafalbad:20200403001244p:plain





    配線実行例

  • 1.右クリックからの[Add IP]
  • 2.resetで検索してから[Processer System Reset]を選択
  • 3.上の丸アイコン押すと、ブロックがアップになる
  • 4.連結したい配線部分をクリック(オレンジに染まる)
  • 5.右クリックから[Make Connection]

  • f:id:trafalbad:20200403001341j:plain


  • 6.連結したい導線部分を選択しOKで配線完了



  • 完全に慣れなので一つずつ確実に配線してく。







    3.プラットフォーム(PFM)インターフェースとプロパティの定義



  • [Window]から[Platform Interface] => [Enable platform Interfaces]をクリックインターフェイス作成。
  • Board名を「ultra96v2」に変更
  • [Source]から必要なポートをダブルクリックで[Enable]で有効化
  • clk_out1 (100 MHz) をクリック後、[Platform Interface Properties] の中の Optionsのタブをクリックして、[is_default]を選択して、idを0に変更。(id変更したら必ずエンターキーをクリック)


  • ***ここ大事
    ・clk_outのidをclk_out1から順にidを0, 1, 2にする(clk_out2, 3はidを1, 2に変更)


    18- Select the enabled clk_out1 and in the Options window change the id to 0 and select the is_default. Note, to change the id filed you must press the Enter key on your keyboard. Change ids of clk_out2, clk_out3, and clk_out4 to 1, 2, and 3, respectively.

    引用元:How to create Ultra96v2 Linux-based Platform in Xilinx Vitis 2019.2



    4.XRT用の設定から[BitStream]まで



  • 下のほうにTclコンソールがあるので次コマンドを入力。1行ずつ入れてく
  • set_property platform.design_intent.embedded true [current_project]
    set_property platform.design_intent.server_managed false [current_project]
    set_property platform.design_intent.external_host false [current_project]
    set_property platform.design_intent.datacenter false [current_project]
    set_property platform.default_output_type "sd_card" [current_project]
    

  • 上部にある[Validate Design]アイコンをクリック、OKなら問題なし

  • f:id:trafalbad:20200403001428j:plain


  • [Source]タブの中のデザインファイル[ultra96base(ultra96base.bd)]を右クリック、メニューから、[Create HDL Wrapper]を選択してOK
  • =>オレンジから青のファイル(ultra96base_wrapper(ultra96base_wrapper.v))に変わる
    f:id:trafalbad:20200403001741p:plain



  • [Flow Navigator]の[Generate Bitstream]をクリックで、ビットストリームを作成。2つほどダイアログが出て、Save=>Yes=>Okの順でクリックすればOK。

  • f:id:trafalbad:20200403001524j:plain


  • 数十分後、Bitstream Generation Completed ダイアログが表示されるので、Cancel ボタンをクリックする。



  • 5.XSAファイルの作成



    Vivadoのメニューから [File] → [Export]→[Export Hardware]
    をクリック。

    [include bitstream]にチェックをいれて、デザインの名前を[ultra96base](プロジェクト名と同じ)に変更
    f:id:trafalbad:20200403001806j:plain


    XSAファイルの名前をプロジェクト名と同じ「ultra96base.xsa」にするのは下の理由から。

    ハードウェア・コンポーネント(XSAファイル)とソフトウェア・コンポーネント(SPFMファイル)の名前を一致させる必要あるから

    アクセレーション・プラットフォームとVitisに認識させるにはハードとソフトの名前の一致が重要な要件だから



  • Tclコンソールから、出力したファイルのチェック以下コマンドで確かめる。
  • ちゃんとできてるなら、エラーが出ないで成功

    $ validate_hw_platform <Write Path>/ultra96base.xsa
    >>>
    INFO: [Vivado 12-6074] Validating Hardware Platform: ‘/home/[host-name]/ultra96base/ultra96base.xsa’
    〜略〜
    INFO: [Vivado 12-6067] Found file 'ultra96base.bit' of type 'FULL_BIT' in the Hardware Platform.
    INFO: [Vivado 12-6066] Finished running validate_dsa for file: '/home/[host-name]/ultra96base/ultra96base.xsa'
    




    2.PetalinuxでLinuxシステムの設計

    PetaLinuxシステムで、Ultra96の動作に必要なBIFファイルと、Vitis IDEに必要なSDKファイルを作成してく。

    メインでやること
    ・ultra96の動作に必要なBIFファイルの作成

    ・vitis IDE立ち上げ





    1.Petalinux用のプロジェクトの作成



    プロジェクトのファルダ内(/home/[host-name]/ultra96base)で実行。

    # ディレクトリ構成
    $ tree
    /home/[host-name]/ultra96base
               └── <>
               └──ultra96base.xpr
               └──ultra96base.xsa
    
    
    # git cloneしてきたものなので権限付与
    $  sudo chmod 777 ultra96base.xsa
    
    # プロジェクト作成
    $ petalinux-create -t project -n petalinux --template zynqMP
    >>>
    INFO: Create project: petalinux
    INFO: New project successfully created in /opt/petalinux/petalinux
    




    2.Vivadoで作成したXSAファイルの取り込み


    $ cd petalinux
    $ petalinux-config ―get-hw-description=/home/[host-name]/ultra96base
    

    コンソールによるメニュー形式が出てくるので本家の通り操作。
    DTG Settngs → MACHINE_NAMEを[avnet-ultra96-rev1]

    [Exit]で戻り、Subsystem AUTO Hardware Settings → Serial Settings を設定、その後、[psu_uart_1]に設定
    f:id:trafalbad:20200403002305j:plain


    f:id:trafalbad:20200403002324j:plain



    次にシステムを増やすために、SDカードの記録方法を指定。

    2回[Exit]でトップメニューから、[Image Packageing Configuration] => [Root filesystem type] から[EXT(SD/eMMC/QSPI/STAT/USB)]を[select]で選択。

    選択して[Exit]を2回。その後、「保存しますか」を聞いてくるので、Yesをクリック。

    完了まで時間がかかるのでコーヒーブレイク。

    出力ログ

    INFO: Getting hardware description...
    INFO: Rename ultra96base.xsa to system.xsa
    [INFO] generating Kconfig for project
    [INFO] menuconfig project
    configuration written to /home/[host-name]/ultra96base/petalinux/project-spec/configs/config
    
    *** End of the configuration.
    *** Execute 'make' to start the build or try 'make help'.
    〜略〜
    [INFO] silentconfig rootfs
    [INFO] generating petalinux-user-image.bb
    
    # ファルダ状況確認
    $ ls
    >>>
    build  components  config.project  project-spec
    



    3.ファイルの追加・編集



    # XRTを使えるようにするため追記
    $ sudo vi /home/[host-name]/ultra96base/petalinux/project-spec/meta-user/conf/user-rootfsconfig
    
    #Note: Mention Each package in individual line
    #These packages will get added into rootfs menu entry
    
    CONFIG_gpio-demo
    CONFIG_peekpoke
    CONFIG_xrt
    CONFIG_xrt-dev
    CONFIG_zocl
    CONFIG_opencl-clhpp-dev
    CONFIG_opencl-headers-dev
    CONFIG_packagegroup-petalinux-opencv
    # Zynqシリーズで、XRTドライバーが使えるようにする
    $ sudo vi /home/[host-name]/ultra96base/petalinux/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
    
    /include/ "system-conf.dtsi"
    / {
    };
    &amba {
      zyxclmm_drm {
          compatible = "xlnx,zocl";
          status = "okay";
      };
    };

    上の設定したファイルを有効可するため下コマンドを実行。

    コンソールによるメニュー形式が出てくるので[user packages]を選択。

    出ているプログラムでスペースキーをクリックしてすべて有効にする。
    f:id:trafalbad:20200403003528j:plain


    2回[Exit]で、セーブして、Yesで保存。

    $ cd && cd ultra96base/petalinux
    $ petalinux-config -c rootfs
    
    >>>
    [INFO] sourcing bitbake
    [INFO] generating plnxtool conf
    〜略〜
    [INFO] menuconfig rootfs
    configuration written to /home/[host-name]/ultra96base/petalinux/project-spec/configs/rootfs_config
    
    *** End of the configuration.
    *** Execute 'make' to start the build or try 'make help'.
    
    [INFO] generating petalinux-user-image.bb
    [INFO] successfully configured rootfs
    




    4.カーネルの操作でDMA転送用のメモリーの確保



    ここも本家通り操作。

    $ petalinux-config -c kernel
    >>>
    [INFO] generating Kconfig for project
    ~略~
    NOTE: Source tree extracted to /home/[host-name]/ultra96base/petalinux/components/plnx_workspace/sources/linux-xlnx
    WARNING: SRC_URI is conditionally overridden in this recipe, thus several devtool-override-* branches have been created, one for each override that makes changes to SRC_URI. It is recommended that you make changes to the devtool branch first, then checkout and rebase each devtool-override-* branch and update any unique patches there (duplicates on those branches will be ignored by devtool finish/update-recipe)
    NOTE: Recipe linux-xlnx now set up to build from /home/[host-name]/ultra96base/petalinux/components/plnx_workspace/sources/linux-xlnx
    ~略~
    NOTE: Updating config fragment /home/[host-name]/ultra96base/petalinux/components/plnx_workspace/sources/linux-xlnx/oe-local-files/devtool-fragment.cfg
    [INFO] successfully configured kernel
    

    ここでコンソールによるメニュー形式が出てくるので本家の通り操作。

    [Device Drivers]→ [Generic Driver Options]→ [DMA Contiguous Memory Allocator] → [Size in Mega Bytes]をクリックして、256を1024に変更。

    f:id:trafalbad:20200403003629j:plain

    f:id:trafalbad:20200403003645j:plain


    [Exit]=>[Save]で保存して終わり。

    ここまでで、コンフィグレーションの設定は終わり。




    5.ビルドしてSDKファイルの作成


    2箇所ビルドをします。かなり時間がかかるところなので、気長に。

    1回目のbuildが終わった時点で、Petalinux-packgeを使って、BOOT.BINファイルを作成して、SDカードにコピーすれば、Ultra96が動作可能。(今回はしない)

    # 1回目のビルド
    $ petalinux-build
    >>>
    [INFO] building project
    ~略~
    NOTE: Resolving any missing task queue dependencies
    WARNING: /opt/petalinux/components/yocto/source/aarch64/layers/meta-xilinx/meta-xilinx-bsp/recipes-kernel/linux/linux-xlnx_2019.2.bb.do_compile is tainted from a forced run
    ~略~
    NOTE: linux-xlnx: compiling from external source tree /home/[host-name]/ultra96base/petalinux/components/plnx_workspace/sources/linux-xlnx
    ~略~
    INFO: Creating /home/[host-name]/ultra96base/petalinux/images/linux directory
    NOTE: Failed to copy built images to tftp dir: /tftpboot 
    [INFO] successfully built project
    
    # ファルダ状況確認
    $ ls
    >>>
    build  components  config.project  images  project-spec
    
    # 2回目のビルド
    $ cd images/linux
    $ petalinux-build --sdk
    >>>
    [INFO] building project
    ~略~
    WARNING: /opt/petalinux/components/yocto/source/aarch64/layers/meta-xilinx/meta-xilinx-bsp/recipes-kernel/linux/linux-xlnx_2019.2.bb.do_compile is tainted from a forced run
    Initialising tasks: 100% 
    ~略〜
    [INFO] Copying SDK Installer...
    [INFO] successfully built project
    
    # sdk.shが出来てるか確認
    $ ls
    ~~~
    pxelinux.cfg      sdk.sh                 zynqmp-qemu-multiarch-pmu.dtb
    rootfs.cpio       system.bit             zynqmp_fsbl.elf
    


    sdk.shは自己解凍ファイルなので解凍して、Vitis IDEのsysrootにする。

    $ cd ../../..  && mkdir pfm
    $ ./petalinux/images/linux/sdk.sh
    


    出力する場所のパスを聞いてくるので、パス(今回は/home/[host-name]/ultra96base/pfm)を指定。

    PetaLinux SDK installer version 2019.2
    ======================================
    Enter target directory for SDK (default: /opt/petalinux/2019.2): /home/[host-name]/ultra96base/pfm
    
    You are about to install the SDK to "/home/[host-name]/ultra96base/pfm". 
    SDK............................................................done
    Setting it up...done
    SDK has been successfully set up and is ready to be used.
    Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
    $ . /home/[host-name]/ultra96base/pfm/environment-setup-aarch64-xilinx-linux
    
    # 確認
    $ ls pfm
    >>>
    environment-setup-aarch64-xilinx-linux  sysroots
    site-config-aarch64-xilinx-linux        version-aarch64-xilinx-linux
    


    最後にVitis IDE作成時にブートするファイルのコピー

    $ mkdir boot && cd petalinux/images/linux
    $ cp image.ub zynqmp_fsbl.elf pmufw.elf bl31.elf u-boot.elf ../../../boot
    $ cd ../../..
    



    6.BIFファイルの作成



    BIFファイルはSDカードを作るときに必要。作成には下のテキストファイルをboot/linux.bif としてそのまま作成

    $ sudo vi boot/linux.bif
    
    /* linux */
    the_ROM_image:
    {
      [fsbl_config] a53_x64
      [bootloader] <zynqmp_fsbl.elf>
      [pmufw_image] <pmufw.elf>
      [destination_device=pl] <bitstream>
      [destination_cpu=a53-0, exception_level=el-3, trustzone] <bl31.elf>
      [destination_cpu=a53-0, exception_level=el-2] <u-boot.elf>
    }



    3.Vitis IDEを立ち上げてみる

    Vitis IDEを起動してみる。

    $ cd /home/[host-name]/ultra96base/pfm
    $ vitis -workspace wksp1
    

    f:id:trafalbad:20200403000935p:plain


    無事立ち上がった。
    PCが低スペックすぎるので、Petalinuxのビルドのところでとんでもなく時間かかった。2017年以降のMacなら割と早く終わるはず。



    参考サイト



    Ultra96-V2 の Vitis アクセラレーション・プラットフォームの作り方(ハードウェア・コンポーネント編)

    FPGAの部屋

    Running Ubuntu on Ultra96v2 Using Petalinux 2019.2, with Networking

    Xlinx-2018.3 SDSoC™ Development Environment Tutorials

    How to create Ultra96v2 Linux-based Platform in Xilinx Vitis 2019.2

    Xilinxサポートフォーラム