SDSoC 2015.4でPYNQのOverlayを開発する(2)
SDSoC 2015.4でPYNQの簡単にプラットフォームを作る話です。まずはHWプラットフォームの作成。
前回のまとめ
現時点でリリースされているPYNQのROMはSDSoC 2015.4でビルドされたライブラリを含むため、それ以外のSDSoCのバージョンを使う場合は、Linuxカーネルのリビルドが必要。SDSoC 2015.4を使うのが一番簡単。
ポイント
HWとSWの2つのプラットフォームを作る必要があります。基本的にAdam Taylor氏のブログの手順と同じことをします。*1。以下のリンクの前後の記事もPYNQの話なので読むことをおすすめ。
SDSoCプラットフォームの作成については、UG1146 - SDSoC 環境プラットフォーム開発ガイドや以下の動画で全体像を把握しておくことをおすすめ。
SDSoC 環境入門 (パート 3) : カスタム プラットフォームの生成 (日本語吹替) - YouTube
プラットフォーム作成手順を簡単に概要をまとめます。
- HWプラットフォームの作成
- Vivado 2015.4で新規プロジェクトを作成
- ZYNQとreset IP、割り込み信号のconcat IPだけの簡単なデザインをつくる
- HWプラットフォーム作成用のtclコマンドを実行し、*.pfmファイルを生成
- メタデータファイルの作成
- SWプラットフォームの作成
HWプラットフォームの作成
PYNQのリポジトリには、Base OverlayのVivadoプロジェクトファイルがあります。これをベースにしてHWプラットフォームを作成するのが簡単かと思いました。しかし、このプロジェクトはVivado 2016.1で作成されているためVivado 2015.4で扱うことができませんでした。
そのため、Vivado 2015.4でプロジェクトを新規作成することにしました。
Block Designはこのように作りました。
Adam Taylorのブログでは、LEDなどの結線もありますが今回は省略。これらは、Linux起動直後に呼ばれる以下のPythonスクリプトでLEDを点滅してるのに対応するためのようです。
ZYNQの設定は、本来ならベンダーが提供する設定ファイル(Zynq Presets)*2をインポートすれば済むはずですが、インポート時にエラーが生じたため、Vivado 2016.1でPYNQのBase Overlayのプロジェクトを開きZYNQの設定を1つ1つ確認しながら、Vivado 2015.4でも同じ設定をしました。
あとは制約ファイル(Master XDC)*3の追加も忘れずに。
最期に、pfmファイルを作成するtclコマンドを実行して、pfmファイルを作ります。tclコマンドは、以下のスクリプトファイルにまとめておいて、実行しました。事前にSDSoCのインストール先のscripts/vivado/sdsoc_pfm.tclを実行して、sdsocのコマンドをVivadoに読み込ませる必要がある点に注意。
set pfm [sdsoc::create_pfm pynq_hw.pfm] sdsoc::pfm_name $pfm "xilinx.com" "xd" "pynq" "1.0" sdsoc::pfm_description $pfm "PYNQ-Z1" sdsoc::pfm_clock $pfm FCLK_CLK0 ps7 0 false proc_sys_reset_0_100M sdsoc::pfm_clock $pfm FCLK_CLK1 ps7 1 false proc_sys_reset_1_142M sdsoc::pfm_clock $pfm FCLK_CLK2 ps7 2 true proc_sys_reset_2_200M sdsoc::pfm_clock $pfm FCLK_CLK3 ps7 3 false proc_sys_reset_3_166M sdsoc::pfm_axi_port $pfm M_AXI_GP0 ps7 M_AXI_GP sdsoc::pfm_axi_port $pfm M_AXI_GP1 ps7 M_AXI_GP sdsoc::pfm_axi_port $pfm S_AXI_ACP ps7 S_AXI_ACP sdsoc::pfm_axi_port $pfm S_AXI_HP0 ps7 S_AXI_HP sdsoc::pfm_axi_port $pfm S_AXI_HP1 ps7 S_AXI_HP sdsoc::pfm_axi_port $pfm S_AXI_HP2 ps7 S_AXI_HP sdsoc::pfm_axi_port $pfm S_AXI_HP3 ps7 S_AXI_HP for {set i 0} {$i < 16} {incr i} { sdsoc::pfm_irq $pfm In$i xlconcat } sdsoc::generate_hw_pfm $pfm
これで、pynq_hw.pfmがVivadoのカレントディレクトリに生成されます。HWプラットフォームの作成は以上。
おわりに
プラットフォームを作成したりするとなると、結局Vivadoの知識やLinuxの知識が必要です。Vivadoについては以下の本を読んで概要を理解しました。おすすめです。
*1:ただし、使用したSDSoCのバージョンの記載がないなど色々行間を読む必要があり、この記事だけではプラットフォームを作れなかったので前回の記事の通りAnurag Dubey氏に質問したのでした
*2:http://store.digilentinc.com/pynq-z1-python-productivity-for-zynq/
*3:http://store.digilentinc.com/pynq-z1-python-productivity-for-zynq/