読者です 読者をやめる 読者になる 読者になる

tkato’s blog

ブログ名は暫定。

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の話なので読むことをおすすめ。

forums.xilinx.com

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はこのように作りました。

f:id:tkat0:20170215062559p:plain

Adam Taylorのブログでは、LEDなどの結線もありますが今回は省略。これらは、Linux起動直後に呼ばれる以下のPythonスクリプトでLEDを点滅してるのに対応するためのようです。

github.com

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については以下の本を読んで概要を理解しました。おすすめです。

www.shuwasystem.co.jp

*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/