ZedBoardを使ってARM上でUbuntu Linuxを動作させたい。数年前に FPGAの部屋のmarseeさんによって既に実現されているのだが、同じ過程を辿ろうとすると、当該記事ではPlatform BuilderとPlanAheadが使われており、現在のVivadoの環境では使えないことが分かった。
FPGAの部屋 ZedBoard用のUbuntu Linuxをビルド1(PLをビルド)
さらにオリジナル記事はこちら。
そこで、Vivadoの環境でもUbuntu Linuxをビルドできる方法を調査していこう。一番ネックになるのは、おそらくPlatform StudioとPlanAheadで構築していた場所をどのようにしてVivadoに移植するか、というところだと思われる。
いろいろ調べた結果、PLデザインのベースになっているADIのリファレンスHDLおよびプロジェクトが、Vivadoに既に移植されており、これを使えばうまく行きそうな雰囲気がしてきた。
1. ADIのプロジェクトをgithubからダウンロードする
ADIのFPGAボード向けのプロジェクトは、既にgithub上に公開されている。これらをダウンロードして、Vivadoでビルドすれば良い。 今回は、Programmable Logic(PL)とLinuxのビルドを同一環境で実行したいため、全てVagrant上のUbuntuで環境を構築した。 ちなみに、Vagrantは基本的にCUIでの環境を提供しているが、GUIを使いたいとき(というか、Vivadoは基本的にGUIが無いとデザインが確認できないので)は、僕はMobaXtermというツールを使っている。
あまり人様の作ったツールに対してケチを付けるつもりは無いのだが、このMobaXtermというツールはお世辞にも実用に耐えれるかというとそうではない。 実際、重要な作業中に何度かXを落とされてしまっているので、仕事では使わないようにしている。趣味でも、最低限のレイアウトの確認とかでXを立ち上げるときは使うけど、それ以外ではCUIで事を済ませるようにしている。
話は戻って、まずはADIのプロジェクトをダウンロードする。
tree -L 1 . ├── library ├── LICENSE ├── Makefile ├── projects └── README.md 2 directories, 3 files
このリポジトリは、良く見てみると複数のブランチが存在し、ちゃんと自分の環境に合ったブランチを指定しないとライブラリの生成でコける。僕もこの環境に合わせるために、ADIがサポートしている最新であるVivado 2015.2.1をダウンロードしてインストールする必要があった。
git branch -a * hdl_2015_r2 master remotes/origin/HEAD -> origin/master remotes/origin/axi_dmac_sg remotes/origin/dev remotes/origin/dev_ad7616 remotes/origin/hdl_2014_r1 remotes/origin/hdl_2014_r2 remotes/origin/hdl_2015_r1 remotes/origin/hdl_2015_r2 remotes/origin/master
ちなみに、2015_r2ブランチのページには「Vivado 2015.2.1」と書いてあるので、きちんと「2015.2.1」をインストールする必要があるので注意すること。 (2015.2だと、ライブラリのビルド時にバージョンが合わないとエラーが出る)。
git clone https://github.com/analogdevicesinc/hdl.git
cd hdl
git checkout hdl_2015_r2
2. ライブラリのビルド
ADIのページには、まずはライブラリをビルドを必要があるらしい。
ADI Reference Designs HDL User Guide [Analog Devices Wiki]
どうやら、これらのIPのビルドをしなければならない。ZedBoardの場合はADV7511?そして必要なIPはこのあたりだろうか?
このために、それぞれGUIを立ち上げてtclを走らせるのは面倒だ。tclを作成して、ライブラリ作成を自動化する。
- build_zed.tcl
cd ./hdl/library/axi_clkgen/ source axi_clkgen_ip.tcl close_project cd ../../../hdl/library/axi_hdmi_tx source axi_hdmi_tx_ip.tcl close_project cd ../../../hdl/library/axi_hdmi_rx source axi_hdmi_rx_ip.tcl close_project cd ../../../hdl/library/axi_spdif_tx source axi_spdif_tx_ip.tcl close_project cd ../../../hdl/library/axi_i2s_adi/ source axi_i2s_adi_ip.tcl close_project cd ../../../hdl/library/util_i2c_mixer/ source util_i2c_mixer_ip.tcl close_project
以下で必要なライブラリをビルドする。
vivado -mode batch -source ./build_zed.tcl
3. ZynqのPL部をビルドする。
これは、上記のリポジトリのprojectディレクトリに格納されている。 ZedBoardのプロジェクトは以下に格納されている。また、Makefileも格納されているので、すぐにビルドできる。
cd ./hdl/projects/adv7511/zed
make
無事にコンパイルできたようだ。
$ make #----------------------------------------------------------- # Vivado v2015.2.1 (64-bit) # SW Build 1302555 on Wed Aug 5 13:06:02 MDT 2015 # IP Build 1291990 on Mon Jul 27 03:18:52 MDT 2015 # Start of session at: Thu Feb 25 13:03:41 2016 # Process ID: 8865 # Log file: /home/vagrant/download/hdl/projects/adv7511/zed/vivado.log # Journal file: /home/vagrant/download/hdl/projects/adv7511/zed/vivado.jou #----------------------------------------------------------- start_gui source system_project.tcl # source ../../scripts/adi_env.tcl ## set ad_hdl_dir "../../.." ... A total of 55 instances were transformed. IOBUF => IOBUF (IBUF, OBUFT): 38 instances RAM32M => RAM32M (RAMD32, RAMD32, RAMD32, RAMD32, RAMD32, RAMD32, RAMS32, RAMS32): 16 instances RAM32X1D => RAM32X1D (RAMD32, RAMD32): 1 instances open_run: Time (s): cpu = 00:00:12 ; elapsed = 00:00:12 . Memory (MB): peak = 6805.539 ; gain = 206.344 ; free physical = 1153 ; free virtual = 2115 INFO: [Timing 38-91] UpdateTimingParams: Speed grade: -1, Delay Type: min_max. update_compile_order -fileset sim_1 exit INFO: [Common 17-206] Exiting Vivado at Thu Feb 25 13:15:08 2016...
4. ビルド結果を確認する。
ビルド結果は、hdl/projects/adv7511/zed/adv7511_zed.runs/impl_1
に格納されている。どうやら、一番新しいdcpは、system_top_routed.dcp
のようだ。オープンして結果を見てみる。
vivado system_top_routed.dcp
うまくいっているみたいだ?