FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

Vivado でZynqのブロックデザインをTCLで生成する方法の調査

これまだVivadoのプロジェクトの生成方法や、SDKの処理などについてtcl化する方法について調査してきた。

いろいろ試して、結局以下のQiitaの方法に則るのが一番いいという結論に至った。

qiita.com

この中で、VivadoのブロックデザインはGUIで操作したものをtclに書き出し、それをCUIスクリプト化するときはインポートするという手法を取っている。

ブロックデザインというのはこういうのだ。Zynqとその周辺の接続関係を設計できるツールで、新しいIPを追加するとこのGUIを使用してモジュール間を接続する。

f:id:msyksphinz:20170723195744p:plain

この例では、変数 design_bd_tcl_file にファイル名が設定されていた場合、ファイルセット sources_1 に Block Design を追加して、さらにラッパーファイルも生成します。

一応、ADIのプロジェクトを見るとここもスクリプト化できるようだ。ADIのスクリプトをインポートしても良いので、これもtcl化しておきたい。

ADI Reference Designs HDL User Guide [Analog Devices Wiki]

ADIのブロックデザイン生成スクリプト

まずは、ADIのzed_system_bd.tclを見てみよう。これがZedBoard向けにブロックデザインを生成するスクリプトだ。

github.com

tclを読み解くには、Vivadoの “Vivado Design Suite Tcl Command Reference Guide” を参照しよう。

  • Vivado Design Suite Tcl Command Reference Guide

https://www.xilinx.com/support/documentation/sw_manuals/xilinx2013_3/ug835-vivado-tcl-commands.pdf

create_bd_port

ブロックデザインに対してポートを作成する。外部ポートなど、ZedBoardの外に出すポートを作成する。

create_bd_port -dir O spi0_csn_2_o
create_bd_port -dir O spi0_csn_1_o
create_bd_port -dir O spi0_csn_0_o
create_bd_port -dir I spi0_csn_i
create_bd_port -dir I spi0_clk_i
...

create_bd_cell

ブロックデザインに対してIPをインスタンスする。必要なIPをインスタンスしていく。

set axi_iic_main [create_bd_cell -type ip -vlnv xilinx.com:ip:axi_iic:2.0 axi_iic_main]
...
set axi_hdmi_core [create_bd_cell -type ip -vlnv analog.com:user:axi_hdmi_tx:1.0 axi_hdmi_core]
...

ad_connect

これはADIが用意しているサポート関数のようだ。定義を見てみると、いくつかの指定タイプによって、Vivadoの関数connect_bd_xxxを使うかを決定している。さらにどうもポートのDirectionは関係ないようだ。

ad_connect  sys_cpu_clk sys_ps7/FCLK_CLK0
ad_connect  sys_200m_clk sys_ps7/FCLK_CLK1
ad_connect  sys_cpu_reset sys_rstgen/peripheral_reset
ad_connect  sys_cpu_resetn sys_rstgen/peripheral_aresetn
...
ad_connect  sys_cpu_clk axi_hdmi_core/vdma_clk
...

例えば、ad_connect sys_cpu_clk sys_ps7/FCLK_CLK0 でまずは sys_ps7/FCLK_CLK0 から sys_cpu_clkという仮想のクロック配線へと接続し、次に ad_connect sys_cpu_clk axi_hdmi_core/vdma_clksys_ps7/FCLK_CLK0 から axi_hdmi_core/vdma_clk への接続が完成している。 ブロックデザインでその様子を見ると以下のようになっている。

f:id:msyksphinz:20170731013713p:plain

これらをスクリプトを組み込み、まずはZynqのブロックデザインを構成した。

github.com

$ make impl
vivado -mode batch -source create_project.tcl > adv7511_create_zed_hdf.log 2>&1
vivado -mode batch -source implementation.tcl > adv7511_impl_zed_hdf.log 2>&1

合成結果は、無事にブロックデザインが生成されている。

f:id:msyksphinz:20170731014243p:plain

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com