SDSoC プラットフォームの例

概要

この付録には、ハードウェアだけでなく、OS カーネル、ブートローダー、ファイル システム、ライブラリなどを含め、Vivado® Design Suite とソフトウェア ランタイム環境を使用してビルドされたハードウェア システムから作成された SDSoC™ プラットフォームの単純な例が含まれます。各例はよく使用されるプラットフォーム機能を示しており、ザイリンクスの ZC702 ボードを使用してビルドされています。

  • zc702_axis_io: SDSoC プラットフォームで FPGA ピンからのダイレクト I/O で、データ ストリームへアクセス
  • zc702_acp: プラットフォームと sdscc システム コンパイラ間でプロセッシングシステムの AXI バス インターフェイスを共有
各例には、次の情報が含まれます。
  • プラットフォームとその説明の記述。
  • SDSoC ハードウェア プラットフォーム メタデータ ファイルの生成方法。
  • 必要な場合のためのプラットフォーム ソフトウェア ライブラリの作成方法。
  • SDSoC ソフトウェア プラットフォーム メタデータ ファイルの記述。
  • 基本的なプラットフォーム テスト。

これらのプラットフォーム例だけでなく、<sdx_root>/platforms ディレクトリの SDx™ IDE に含まれる標準 SDSoC プラットフォームについても確認することをお勧めします。

MicroBlaze ハードウェア要件

Zynq および Zynq® UltraScale+™ MPSoC デバイスだけでなく、MicroBlaze™ プロセッサをターゲット CPU として使用しても、ザイリンクス デバイスをターゲットにする SDSoC プラットフォームをビルドできます。SDSoC の MicroBlaze プラットフォームは、Vivado Design Suiteo ツールおよび SDK を使用してビルドされた LMB メモリ、MicroBlaze Debug Module (MDM)、UART、および AXI Timer を含む自己完結型システムである必要があります。サンプルの MicroBlaze 例は、<sdx_root>/sample/platforms/arty フォルダーに含まれます。次の図は、最小限のシステムを示しています。JTAG UART が MDM でイネーブルになっており、AXI4-Lite スレーブとして表示されています。システムは、ボードからのクロック (sys) を使用しています。

図: 最小限の MicroBlaze システム

SDSoC ランタイムには、sds_clock_counter() API 用のタイマーとランタイム エラー メッセージを表示するための UART の 2 つの IP を含めるために、プラットフォーム ハードウェアが必要です。MicroBlaze プロセッサには、AXI スレーブを制御するためのシングル AXI マスター ポート (M_AXI_DP) があるので、MicroBlaze プラットフォームには例: プラットフォーム IP AXI ポートの共有で示すように、このポートに接続された AXI インターコネクトを含める必要があります。

DDR が通常使用される MicroBlaze システムでは、MicroBlaze に組み込まれたキャッシュ機能を使用して、プロセッサと DDR が MIG を介して接続されます。次は、そのシステムの例です。

図: MIG を使用した MicroBlaze システム

上記のシステムでは、MicroBlaze が 8 KB キャッシュを使用してコンフィギュレーションされます。命令およびデータ キャッシュ ポート (M_AXI_DC および M_AXI_IC) は MIG に接続されます。UART はオンボード USB-to-UART コンバーター チップに接続され、前のデザインからの JTAG UART は使用されません。システムは、MIG で生成されるユーザー インターフェイス (UI) クロックで実行されます。これらの違いを除き、MicroBlaze システムは同じものです。

AXI ポートの宣言に示すように、MIG の AXI Interconnect IP のポートは Zynq HP ポートと同じ M_AXI_HP タイプの場合、PFM プロパティを使用してレジスタに付けることができます。SDSoC ランタイムは、Zynq デバイスとまったく同じ方法でバッファーを無効化または一掃します。

例: SDSoC プラットフォームのダイレクト I/O

SDSoC プラットフォームには、生の物理的なデータ ストリームをプラットフォーム インターフェイス仕様の一部としてエクスポートできるように AXI4-Stream インターフェイスに変換;例入力および出力サブシステム (アナログ/デジタル コンバーターおよびデジタル/アナログ コンバーター、または Video I/O) を含めることができます。zc702_axis_io サンプル プラットフォームの詳細は、SDSoC 環境ユーザー ガイド の「外部 I/O の使用」を参照してください。この例には、入力データ ストリームがデータ損失なしにメモリ バッファーに書き込まれるところと、アプリケーションにより AXI 転送レベルでデータ ストリームをパケットにして、パケット フレーミングを必要とするその他のファンクション (DMA を含むが、これだけではない) とのデータのやり取りを示します。

注記: このプラットフォームのソース コードは、<sdx_root>/samples/platforms/zc702_axis_io/src に含まれます。

コマンド シェルから、バッチ モードでハードウェア プラットフォームをビルドする Vivado Tcl スクリプトの zc702_axis_io_dsa.tcl, を使用して次のコマンドを実行します。

vivado –mode batch –source zc702_axis_io_dsa.tcl

次のコマンドを実行して、GUI モードでプラットフォームを構築し、ハードウェア システムを Vivado IP インテグレーターで検証します。

vivado –mode gui –source zc702_axis_io_dsa.tcl

このコマンドを実行すると、Vivado IDE が開いて、プラットフォームが構築されます。結果のハードウェア システムは、次のブロック図のようになります。

図: zc702_axis_io ブロック図

このデザインをポータブルにするには、このプラットフォームにフリーランニング バイナリ カウンターを含め、50 MHz でサンプリングされる連続したデータ ストリームが生成され、FPGA ピンから直接ストリーミングされるデータのプロキシとして動作するようにします。この入力データ ストリームを SDSoC アプリケーション用 AXI4-Stream に変換するため、プラットフォームでは、必須の s_axis_tvalid 信号が常に 1 になった Constant ブロックを使用して、カウンター出力が AXI4-Stream データ FIFO の s_axis_tdata スレーブ ポートに接続されます。データ FIFO IP は 100 MHz の出力クロックで最大 1024 サンプルまでを格納できるように設定して、ストリームの受信側がストリームをバブルなし (データ サンプルの損失なし) で処理できるような柔軟なシステムにします。実際のプラットフォームでは、AXI4-Stream に変換する手段、相対的なクロック供給、ハードウェア バッファーの量は、システム要件によって変わります。

アナログ/デジタル コンバーター外の入力ストリーミングと同様、このデータ ストリームはパケット化されないので、AXI4-Stream には TLAST 信号がありません。このため、データ ストリームを受信する SDSoC アプリケーションにはパケットされていないストリームを処理できる機能が必要です。SDSoC 環境内では、データ ムーバー IP コアすべて (例: Vivado AXI4 Direct Memory Access IP (AXI DMA)) に TLAST 信号を含むパケット化された AXI4-Stream が必要です。このプラットフォームからのストリーミング入力を使用するには、アプリケーションに AXI4-Stream ポートへの直接ハードウェア接続が必要です。

ヒント: プラットフォームでは TLAST 信号を含む AXI4-Stream ポートをエクスポートすることもでき、SDSoC アプリケーションにはこのポートへの直接接続は必要ありません。

SDSoC ハードウェア プラットフォームインターフェイスの宣言

プラットフォーム ハードウェア コンポーネントの作成に示すように、ハードウェア プラットフォーム ポート インターフェイスは、Vivado IP インテグレーターのブロック図内のセルおよびポートに PFM プロパティを設定すると定義できます。

zc702_axis_io_dsa.tcl スクリプトの場合、これは 45-67 行目にあります。次の手順を使用して、Vivado IP インテグレーターのブロック図内のセルおよびポートにこのプロパティを設定してください。

  1. 次のコマンドを使用して、IP-XACT VLNV (vendor:library:name:version) 文字列を宣言します。
    set_property PFM_NAME \
    "xilinx.com:zc702_axis_io:zc702_axis_io:1.0" \
    [get_files ./zc702_axis_io_vivado/zc702_axis_io.srcs/\ 
    sources_1/bd/zc702_axis_io/zc702_axis_io.bd]
    
  2. 次のコマンドを使用して、ID 1 のプラットフォーム クロックを宣言します。
    set_property PFM.CLOCK { \
    clk_out2 {id "1" is_default "true" proc_sys_reset "psr_1" } \
    	} [get_bd_cells /clk_wiz_0]
    

    このクロックを使用するブロックに同期リセット信号を提供する proc_sys_reset がすべてのクロックに必要です。

  3. 少なくとも 1 つの汎用 AXI マスターと 1 つの AXI スレーブ ポートを宣言する必要があります。次のコマンドを使用して、それぞれに複数の属性を含むリストが関連付けられたプラットフォーム AXI インターフェイスを宣言します。
    set_property PFM.AXI_PORT { \
    M_AXI_GP0 {memport "M_AXI_GP"} \
    M_AXI_GP1 {memport "M_AXI_GP"} \
    S_AXI_ACP {memport "S_AXI_ACP" sptag "ACP" 
    memory "ps7 ACP_DDR_LOWOCM"} \
    S_AXI_HP0 {memport "S_AXI_HP" sptag "HP0" 
    memory ps7 HP0_DDR_LOWOCM"} \
    S_AXI_HP1 {memport "S_AXI_HP" sptag "HP1" 
    memory ps7 HP1_DDR_LOWOCM"} \
    S_AXI_HP2 {memport "S_AXI_HP" sptag "HP2" 
    memory ps7 HP2_DDR_LOWOCM"} \
    S_AXI_HP3 {memport "S_AXI_HP" sptag "HP3" 
    memory ps7 HP3_DDR_LOWOCM"} \
    } [get_bd_cells /ps7]

    各 AXI ポートには、次のいずれかの memport メモリ タイプ宣言が必要です。

    1. M_AXI_GP: 汎用マスター
    2. S_AXI_ACP: キャッシュ コヒーレント スレーブ
    3. S_AXI_HP: 高パフォーマンスのキャッシュ以外のコヒーレント スレーブ
    4. S_AXI_HPC: 高パフォーマンスのスレーブ (Zynq UltraScale+ MPSoC のみ)
    5. MIG: 外部 DDR (MIG) メモリ コントローラー IP のスレーブ

      AXI スレーブ ポートポートには、ポートを示すシンボル タグを提供する sptag とさらに 2 つのメモリ属性が必要です。

    6. メモリ インスタンス: IP インテグレーターの [Adress Editor] ウィンドウのブロックのセル名
    7. アドレス セグメント: Vivado IP インテグレーターの [Address Editor] ウィンドウに表示される名前と同じ、ポートに関連付けられたベース名
  4. 次のコマンドを使用して stream_fifo マスター AXI4-Stream ポートを宣言します。
    set_property PFM.AXIS_PORT { \
    	M_AXIS {type "M_AXIS"} \
    	} [get_bd_cells /stream_fifo]
    
  5. 次のコマンドを使用して、processing_system7 ブロックの割り込みポートに接続された Concat ブロックのポート名リストを構築して、割り込み入力を宣言します。
    set intVar []
    for {set i 0} {$i < 16} {incr i} {
    	lappend intVar In$i {}
    }
    set_property PFM.IRQ $intVar [get_bd_cells /xlconcat_0]
    
  6. ポート インターフェイスを宣言したら、次のコマンドを使用してブロック図から DSA を作成するのに必要な出力ファイルを生成します。
    generate_target all \
    [get_files ./zc702_axis_io_vivado/zc702_axis_io.srcs/\
    sources_1/bd/zc702_axis_io/zc702_axis_io.bd]
    
  7. 次のコマンドを実行して、DSA を生成します。
    write_dsa -force ./zc702_axis_io.dsa

コマンド ラインからの SDSoC プラットフォームの作成

ソフトウェア プラットフォーム データの作成に示すように、アプリケーション ランタイム コンテキストは次のプラットフォーム コンポーネントから提供されます。
  • ブートローダー
  • オペレーティング システム
  • ファイル システム

<sdx_root>/samples/platforms/zc702_axis_io/src/zc702_axis_io_pfm.tcl ファイルは、PetaLinux および SDx (SDK 形式の FSBL (First Stage Boot Loader) プロジェクト) を使用して構築された DSA ハードウェアおよびソフトウェア コンポーネントを組み込んで、SDSoC プラットフォームを構築する Tcl スクリプトです。

SDSoC コマンド シェルから次のコマンドを実行すると、SDx に含まれる xsct ユーティリティで実行される zc702_axis_io_pfm.tcl という SDx Tcl を使用してバッチ モードでプラットフォームを構築できます。

xsct –sdx  ./zc702_axis_io_dsa.tcl
  1. 次のコマンドを使用すると、xsct コマンド ライン インタープリターでプラットフォーム オブジェクトを作成できます。
    platform -name zc702_axis_io \
    -desc "Zynq ZC702 Board with direct I/O" \
    -hw ./zc702_axis_io.dsa -out ./output \
    -prebuilt  -samples samples
    
  2. 次のコマンドを使用すると、Linux アプリケーション用に新しいシステム コンフィギュレーションを作成できます。
    system -name linux -display-name "Linux"  \
    -boot ./boot  -readme ./generic.readme
    
  3. 次のコマンドを使用すると、このシステム コンフィギュレーションのプロセッサ グループまたはドメインを定義できます。
    domain -name linux -proc ps7_cortexa9_0 \
    -os linux -image ./linux/image
    
  4. 次のコマンドを使用すると、Linux システム コンフィギュレーションのブート ファイルを記録できます。
    boot -bif ./linux/linux.bif
  5. 次のコマンドを使用すると、QEMU 引数とブート ファイルを含むディレクトリを記録して、SDSoC エミュレーションがサポートされるようにできます。
    domain -qemu-args ./qemu/lnx/qemu_args.txt
    domain -qemu-data ./boot
    
  6. 次のコマンドを使用すると、スタンドアロン (ベアメタル) のシステム コンフィギュレーションを作成できます。
    system -name standalone  -display-name "Standalone" -boot ./boot  -readme ./generic.readme
    domain -name standalone -proc ps7_cortexa9_0 -os standalone
    app -lscript ./standalone/lscript.ld
    boot -bif ./standalone/standalone.bif
    domain -qemu-args ./qemu/std/qemu_args.txt
    domain -qemu-data ./boot
    
  7. 次のコマンドを使用すると、SDSoC プラットフォームを作成できます。
    platform –generate

    このスクリプトでは、次のディレクトリに zc702_axis_io という SDK プラットフォーム プロジェクトが作成されます。

    output/zc702_axis_io/export/

プラットフォームのサンプル デザイン

SDSoC プラットフォームには、サンプル アプリケーションに示すように、その使用方法を示すサンプル アプリケーションを含めることができます。SDx IDE では、プラットフォーム内のサンプル ソース ファイルのに関する情報を取得するため、samples/<example>/description.json (template.xml) というファイルが検索されます。zc702_axis_io プラットフォームの template.xml ファイルには、それぞれ目的の違う複数のテスト アプリケーションがリストされています。
<template location="aximm" name="Unpacketized AXI4-Stream to DDR" 
              description="Shows how to copy unpacketized AXI4-Stream data directly to DDR.">
        <supports>
            <and>
                <or>
                    <os name="Linux"/>
                    <os name="Standalone"/>
                </or>
            </and>
        </supports>
        <accelerator name="s2mm_data_copy" location="main.cpp"/>
    </template>
	<template location="stream" name="Packetize an AXI4-Stream" 
                  description="Shows how to packetize an unpacketized AXI4-Stream.">
        <supports>
            <and>
                <or>
                    <os name="Linux"/>
		    <os name="Standalone"/>
                </or>
            </and>
        </supports>
        <accelerator name="packetize" location="packetize.cpp"/>
        <accelerator name="minmax" location="minmax.cpp"/>
    </template>
    <template location="pull_packet" name="Lossless data capture from AXI4-Stream to DDR" 
              description="Illustrates a technique to enable lossless data capture from a free-running input source.">
        <supports>
            <and>
                <or>
                    <os name="Linux"/>
                    <os name="Standalone"/>
                </or>
            </and>
        </supports>
        <accelerator name="PullPacket" location="main.cpp"/>
    </template>

SDx IDE でプラットフォームを使用するには、次の手順に従って、それを Eclipse ワークスペース用のプラットフォーム リポジトリに追加する必要があります。

  1. ザイリンクス SDx を起動して、<path_to_tutorial>/myplatforms/ のように、ワークスペースのパスを指定します。
  2. [File] > [New] > [Xilinx SDx Project] をクリックし、新しいプロジェクトを作成します。
  3. プロジェクト タイプに [Application Project] を指定して、[Next] をクリックします。
  4. [Create New SDx Project] ページで my_zc702_axis_io のようにプロジェクト名を指定したら、[Next] をクリックします。
  5. [Choose Hardware Platform] ページで [Add Custom Platform] をクリックします。

    図: カスタム プラットフォームの追加

  6. プラットフォーム <sdx_root>/samples/platforms/zc702_axis_io を選択します。
  7. このプラットフォームが [Choose Hardware Platform] ページに表示されます。zc702_axis_io (custom) を選択し、[Next] をクリックします。

    図: ハードウェア プラットフォームの選択

  8. [System Configuration] ページでデフォルトの [Linux] をオンのままにし、[Next] をクリックします。
  9. [Templates] ページで Unpacketized AXI4-Stream to DDR を選択し、サンプル アプリケーションの 1 つを含めてプラットフォームをテストするようにし、[Finish] をクリックします。

    ハードウェア アクセラレーション用に s2mm_data_copy 関数が前もって選択されています。s2mm_data_copy_wrapper 内のプログラム データフローにより、プラットフォーム入力から s2mm_data_copy というハードウェア関数までのダイレクト信号パスが作成され、zero_copy データ ムーバーとしてメモリにデータが送信されます。つまり、s2mm_data_copy 関数はカスタム DMA として動作します。メイン プログラムは 4 つのバッファーに割り当てられ、s2mm_data_copy_wrapper が起動されてから、書き込まれたバッファーがチェックされて、データ値がシーケンシャルになる (データがバブルなしで書き込まれる) ようになります。このプログラムでは簡単にするため、カウンターがリセットされないようになっているので、初期値はボードの電源投入時からプログラムの起動時までの時間によって変わります。

  10. main.cpp を開きます。次の点を確認します。
    • バッファーは、zero_copy データ ムーバーに必要な物理的に隣接した割り当てになるように、sds_alloc を使用して割り当てられます。
      unsigned *bufs[NUM_BUFFERS];
      unsigned* rbuf0;
      for(int i=0; i<NUM_BUFFERS; i++) {
          bufs[i] = (unsigned*) sds_alloc(BUF_SIZE *
       sizeof(unsigned));
      }
      // Flush the platform FIFO of start-up garbage
      s2mm_data_copy(rbuf0, bufs[0]);
      s2mm_data_copy(rbuf0, bufs[0]);
      s2mm_data_copy(rbuf0, bufs[0]);
      for(int i=0; i<NUM_BUFFERS; i++) {
        s2mm_data_copy(rbuf0, bufs[i]);
      }
      
    • sys_port プラグマを使用してハードウェア関数とプラットフォーム間の接続を指定します。
      // s2mm "DMA" accelerator
      #pragma SDS data sys_port (fifo:stream_fifo_M_AXIS)
      #pragma SDS data zero_copy(buf)
      int s2mm_data_copy(unsigned *fifo, unsigned buf[BUF_SIZE]) 
      {
      #pragma HLS interface axis port=fifo
           for(int i=0; i<BUF_SIZE; i++) {
      #pragma HLS pipeline
                buf[i] = *fifo;
           }
           return 0;
      }
  11. ツールバーの [Build] アイコンをクリックしてアプリケーションをビルドします。ビルドが完了したら、sd_card フォルダーの Debug フォルダーにブート イメージとアプリケーション ELF が含まれます。
  12. ビルドが終了したら、sd_card ディレクトリの内容を SD カードにコピーし、ブートして、my_zc702_axis_io.elf を実行します。
sh-4.3# cd /mnt
sh-4.3# ./my_zc702_axis_io.elf
TEST PASSED!
sh-4.3#

例: プラットフォーム IP AXI ポートの共有

プラットフォーム IP、アクセラレータ、および SDSoC コンパイラで生成されたデータ モーション IP の間で AXI マスター (スレーブ) インターフェイスを共有するには、SDSoC Tcl API を使用して、共有インターフェイスに接続されている AXI Interconnect IP ブロック上のインデックス順で最初の未使用 AXI マスター (スレーブ) ポートを宣言します。プラットフォームでこの AXI Interconnect の各下位インデックスのマスター (スレーブ) を使用する必要があります。

SDSoC プラットフォーム ハードウェア インターフェイス

Vivado IDE 内で SDSoC ハードウェア プラットフォームインターフェイスをビルドするには、次の手順に従います。
注記: このプラットフォームのソース コードは、 <sdx_root>/samples/platforms/zc702_acp/src に含まれます。
  1. コマンド シェルから、バッチ モードでハードウェア プラットフォームをビルドする Vivado Tcl スクリプトの zc702_acp_dsa.tcl を使用して次のコマンドを実行します。
    vivado –mode batch –source zc702_acp_dsa.tcl

    プラットフォームを GUI モードでビルドして、Vivado IP インテグレーターでハードウェア システムを検証することもできます。次のコマンドを実行すると、GUI モードでプラットフォームをビルドできます。

    vivado –mode gui –source zc702_acp_dsa.tcl

    このコマンドを実行すると、Vivado IDE が開いて、プラットフォームが構築されます。結果のハードウェア システムは、次のブロック図のようになります。

    図: zc702_acp ブロック デザイン

  2. 次のコマンドで、IP-XACT VLNV (vendor:library:name:version) 文字列を使用してプラットフォーム名を宣言します。
    set_property PFM_NAME \
    "xilinx.com:zc702_acp:zc702_acp:1.0" \
    [get_files ./zc702_acp_vivado/zc702_acp.srcs/\ 
    sources_1/bd/zc702_acp/zc702_acp.bd]
    
  3. 次のコマンドを使用して、プラットフォーム クロックを ID 1 で宣言します。
    set_property PFM.CLOCK { \
      clk_out1 {id "2" is_default "true" proc_sys_reset "psr_0" } \
      clk_out2 {id "1" is_default "false" proc_sys_reset "psr_1" } \
      clk_out3 {id "0" is_default "false" proc_sys_reset "psr_2" } \
      clk_out4 {id "3" is_default "false" proc_sys_reset "psr_3" } \
    } [get_bd_cells /clk_wiz_0]
    

    このクロックを使用するブロックに同期リセット信号を提供する proc_sys_reset がすべてのクロックに必要です。

  4. 少なくとも 1 つの汎用 AXI マスターと 1 つの AXI スレーブ ポートを宣言する必要があります。次のコマンドを使用して、プロセッシング システムからプラットフォーム AXI インターフェイスを宣言し、それぞれに複数の属性を含むリストを関連付けます。
    set_property PFM.AXI_PORT { \
    M_AXI_GP1 {memport "M_AXI_GP"} \
    S_AXI_HP0 {memport "S_AXI_HP" sptag "HP0" 
    memory ps7 HP0_DDR_LOWOCM"} \
    S_AXI_HP1 {memport "S_AXI_HP" sptag "HP1" 
    memory ps7 HP1_DDR_LOWOCM"} \
    S_AXI_HP2 {memport "S_AXI_HP" sptag "HP2" 
    memory ps7 HP2_DDR_LOWOCM"} \
    S_AXI_HP3 {memport "S_AXI_HP" sptag "HP3" 
    memory ps7 HP3_DDR_LOWOCM"} \
    } [get_bd_cells /ps7]
    

    各 AXI ポートには、次のいずれかの memport メモリ タイプ宣言が必要です。

    • M_AXI_GP: 汎用マスター
    • S_AXI_ACP: キャッシュ コヒーレント スレーブ
    • S_AXI_HP: 高パフォーマンスのキャッシュ以外のコヒーレント スレーブ
    • S_AXI_HPC: 高パフォーマンスのスレーブ (Zynq UltraScale+ MPSoC のみ)
    • MIG: 外部 DDR (MIG) メモリ コントローラー IP のスレーブ

      AXI スレーブ ポートポートには、ポートを示すシンボル タグを提供する sptag とさらに 2 つのメモリ属性が必要です。

    • メモリ インスタンス: IP インテグレーターの [Adress Editor] ウィンドウのブロックのセル名
    • アドレス セグメント: Vivado IP インテグレーターの [Address Editor] ウィンドウに表示される名前と同じ、ポートに関連付けられたベース名
  5. プラットフォームでは、プロセッシング システムで S_AXI_ACP および M_AXI_GP0 ポートの両方が使用されます。次の Tcl コードを使用し、プラットフォーム内で axi_interconnect IP に追加ポートを宣言します。
    set gpMasters []
    for {set i 1} {$i < 64} {incr i} {
      lappend gpMasters M[format %02d $i]_AXI {memport "M_AXI_GP"}
    }
    set_property PFM.AXI_PORT $gpMasters \
    [get_bd_cells /axi_ic_ps7_M_AXI_GP0]
    
    set acpSlaves []
    for {set i 1} {$i < 8} {incr i} {
      lappend acpSlaves S[format %02d $i]_AXI {memport "S_AXI_ACP" \ 		sptag "ACP" memory "ps_ACP_DDR_LOWOCM"}
    }
    set_property PFM.AXI_PORT $acpSlaves \
    [get_bd_cells /axi_ic_ps7_S_AXI_ACP]
    

    memport 属性は、axi_interconnect に接続されたプロセッシング システム ポートからのものです。

  6. 次のコマンド使用して、processing_system7 ブロックの割り込みポートに接続された Concat ブロックのポート名リストを構築して、割り込み入力を宣言します。
    set intVar []
    for {set i 0} {$i < 16} {incr i} {
    	lappend intVar In$i {}
    }
    set_property PFM.IRQ $intVar [get_bd_cells /xlconcat_0]
    
  7. ポート インターフェイスを宣言したら、次のコマンドを使用してブロック図から DSA を作成するのに必要な出力ファイルを生成します。
    generate_target all \
    [get_files ./zc702_acp_vivado/zc702_acp.srcs/\
    sources_1/bd/zc702_acp/zc702_acp.bd]
    
  8. 最後に、次のコマンドを使用して DSA を生成します。
    write_dsa -force ./zc702_acp.dsa