FC2カウンター FPGAの部屋 SDSoC のプラットフォームのお勉強5(ハードウェア・プラットフォームのメタデータファイルを作る2)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

SDSoC のプラットフォームのお勉強5(ハードウェア・プラットフォームのメタデータファイルを作る2)

SDSoC のプラットフォームのお勉強4(ハードウェア・プラットフォームのメタデータファイルを作る1)”の続き。

前回は、Tcl スクリプトを実行して、SDSoC Vivado Tcl API を読み込んで手順を実行し、ハードウェア・プラットフォームのメタデータファイルを作っていく過程の途中でクロックポートを宣言したところで終了した。今回は、最後の ZYBO_0_163_6.hpfm を生成する所まで行ってみよう。


次はAXI ポートの宣言だ。
まずは、PS からのAXI マスタ・ポートのAXI_GP1 ポートを宣言する。そのフォーマットを示す。

sdsoc::pfm_axi_port
 <pfm ハンドル ($pfm)>
 <AXI ポート名 (M_AXI_GP1)>
 <ポートを含むブロックのインスタンス名 (processing_system7_0)>
 <M_AXI_GP or S_AXI_HP or S_AXI_ACP or MIG (M_AXI_GP)>

M_AXI_GP1 と S_AXI_HP0 を宣言する。
sdsoc::pfm_axi_port $pfm M_AXI_GP1 processing_system7_0 M_AXI_GP
sdsoc::pfm_axi_port $pfm S_AXI_HP0 processing_system7_0 S_AXI_HP

SDx_v2016_3_34_161227.png


AXI4-Stream ポートを宣言する。

sdsoc::pfm_axis_port
 <pfm ハンドル ($pfm)>
 <AXI4-Stream ポート名 (m_axis)>
 <ポートを含むブロックのインスタンス名 (mt9d111_inf_axis_0)>
 <Master or Slave [M_AXIS or S_AXIS] (M_AXIS)>

mt9d111_inf_axis_0 つまりカメラ・インターフェースIP のAXI4-Stream ポートを宣言する。
SDx_v2016_3_37_161227.png

sdsoc::pfm_axis_port $pfm m_axis mt9d111_inf_axis_0 M_AXIS
SDx_v2016_3_38_161227.png


割り込みを宣言する。

sdsoc::pfm_irq

 <pfm ハンドル ($pfm)>

 <irqポート名 (In$i)>

 <ポートを含むブロックのインスタンス名 (xlconcat_0)>

サンプル・コードの通りに書いた。
for {set i 0} {$i < 16} {incr i} {
  sdsoc::pfm_irq $pfm In$i xlconcat_0
}

SDx_v2016_3_39_161227.png


IOデバイスを宣言する。Linux でのUIO フレームワークを使用するときは、デバイスを宣言する必要があるようだ。

sdsoc::pfm_iodev
 <pfm ハンドル ($pfm)>
 <I/Oポート名 (s_axi_lite)>
 <UIOを使用するブロックのインスタンス名 (bitmap_disp_cntrler_axi_master_0)>
 <I/Oデバイスタイプ[uio, kio] (uio)>

sdsoc::pfm_iodev $pfm s_axi_lite bitmap_disp_cntrler_axi_master_0 uio
sdsoc::pfm_iodev $pfm s_axi_lite bitmap_disp_cntrler_axi_master_1 uio
sdsoc::pfm_iodev $pfm s_axi_lite mt9d111_inf_axis_0 uio
sdsoc::pfm_iodev $pfm s_axi_AXILiteS PmodHB5_inf_left uio
sdsoc::pfm_iodev $pfm s_axi_AXILiteS1 PmodHB5_inf_left uio
sdsoc::pfm_iodev $pfm s_axi_AXILiteS PmodHB5_inf_right uio
sdsoc::pfm_iodev $pfm s_axi_AXILiteS1 PmodHB5_inf_right uio
sdsoc::pfm_iodev $pfm S_AXI axi_gpio_0 uio

SDx_v2016_3_40_161227.png
SDx_v2016_3_41_161227.png
SDx_v2016_3_42_161227.png


最後に、ハードウェア・プラットフォームのメタデータファイルを書き込む。

sdsoc::generate_hw_pfm
 <pfm ハンドル ($pfm)>

sdsoc::generate_hw_pfm $pfm
SDx_v2016_3_43_161227.png

このTcl コマンドを実行すると、ディレクトリを指定していないので、デフォルトのディレクトリ(C:\Users\Masaaki\AppData\Roaming\Xilinx\Vivado)にZYBO_0_163_6.hpfm が生成された。
SDx_v2016_3_44_161227.png

ZYBO_0_163_6.hpfm の一部を示す。
SDx_v2016_3_45_161227.png

ZYBO_0_163_6.hpfm を貼っておく。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!-- ZYBO_0_163_6.hpfm -->
<xd:repository xmlns:xd="http://www.xilinx.com/xd" xd:name="zybo" xd:library="xd" xd:version="1.0" xd:vendor="marsee">
  <xd:component xd:name="zybo" xd:library="xd" xd:version="1.0" xd:vendor="marsee" xd:type="platform" xd:BRAM="60" xd:DSP="80" xd:FF="35200" xd:LUT="17600">
    <xd:platformInfo>
      <xd:deviceInfo xd:name="xc7z010clg400-1" xd:architecture="zynq" xd:device="xc7z010" xd:package="clg400" xd:speedGrade="-1"/>
      <xd:registeredDevices xd:kio="0" xd:uio="8"/>
      <xd:description>Zynq ZYBO camera</xd:description>
      <xd:systemClocks xd:defaultClock="0">
        <xd:clock xd:name="CPU" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:frequency="650.000000" xd:period="1.538462" xd:status="reserved"/>
        <xd:clock xd:name="processing_system7_0_FCLK_CLK0" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:id="0" xd:frequency="100.000000" xd:period="10.000000" xd:normalizedPeriod="6.500000" xd:status="changeable"/>
        <xd:clock xd:name="processing_system7_0_FCLK_CLK1" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:id="1" xd:frequency="40.000000" xd:period="25.000000" xd:normalizedPeriod="16.250000" xd:status="changeable"/>
        <xd:clock xd:name="processing_system7_0_FCLK_CLK2" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:id="2" xd:frequency="35.714283" xd:period="28.000002" xd:normalizedPeriod="18.200001" xd:status="changeable"/>
        <xd:clock xd:name="processing_system7_0_FCLK_CLK3" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:id="3" xd:frequency="65.000000" xd:period="15.384615" xd:normalizedPeriod="10.000000" xd:status="changeable"/>
      </xd:systemClocks>
    </xd:platformInfo>

    <xd:parameter xd:name="PCW_USE_M_AXI_GP1" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:isValid="count($designComponent/xd:connection/xd:busInterface[@xd:instanceRef=$instance and @xd:name='processing_system7_0_M_AXI_GP1'])>0" xd:value="1"/>
    <xd:parameter xd:name="PCW_USE_S_AXI_HP0" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:isValid="count($designComponent/xd:connection/xd:busInterface[@xd:instanceRef=$instance and @xd:name='processing_system7_0_S_AXI_HP0'])>0" xd:value="1"/>

    <xd:parameter xd:name="NUM_PORTS" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:isValid="'true'" xd:value="number(count($designComponent/xd:connection/xd:port[@xd:instanceRef=$instance and starts-with(@xd:name,'xlconcat_0_In')])+0)"/>

    <xd:busInterface xd:busTypeRef="aximm" xd:name="processing_system7_0_M_AXI_GP1" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:mode="master" xd:dataWidth="32" xd:clockRef="processing_system7_0_M_AXI_GP1_ACLK" xd:busInterfaceRef="M_AXI_GP1" xd:memport="M_AXI_GP"/>
    <xd:busInterface xd:busTypeRef="aximm" xd:name="processing_system7_0_S_AXI_HP0" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:mode="slave" xd:dataWidth="64" xd:clockRef="processing_system7_0_S_AXI_HP0_ACLK" xd:busInterfaceRef="S_AXI_HP0" xd:memport="S_AXI_HP"/>

    <xd:busInterface xd:name="mt9d111_inf_axis_0_m_axis" xd:instanceRef="mt9d111_inf_axis_0" xd:componentRef="mt9d111_inf_axis" xd:busTypeRef="axis" xd:mode="master" xd:hasTlast="true" xd:busInterfaceRef="m_axis"/>

    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In0" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="61" xd:busInterfaceRef="In0"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In1" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="62" xd:busInterfaceRef="In1"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In2" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="63" xd:busInterfaceRef="In2"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In3" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="64" xd:busInterfaceRef="In3"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In4" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="65" xd:busInterfaceRef="In4"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In5" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="66" xd:busInterfaceRef="In5"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In6" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="67" xd:busInterfaceRef="In6"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In7" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="68" xd:busInterfaceRef="In7"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In8" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="84" xd:busInterfaceRef="In8"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In9" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="85" xd:busInterfaceRef="In9"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In10" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="86" xd:busInterfaceRef="In10"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In11" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="87" xd:busInterfaceRef="In11"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In12" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="88" xd:busInterfaceRef="In12"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In13" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="89" xd:busInterfaceRef="In13"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In14" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="90" xd:busInterfaceRef="In14"/>
    <xd:busInterface xd:busTypeRef="interrupt" xd:name="xlconcat_0_In15" xd:instanceRef="xlconcat_0" xd:componentRef="xlconcat" xd:direction="in" xd:irq="91" xd:busInterfaceRef="In15"/>

    <xd:busInterface xd:busTypeRef="clock" xd:name="processing_system7_0_FCLK_CLK0" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:mode="master" xd:busInterfaceRef="FCLK_CLK0"/>
    <xd:busInterface xd:busTypeRef="clock" xd:name="processing_system7_0_FCLK_CLK1" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:mode="master" xd:busInterfaceRef="FCLK_CLK1"/>
    <xd:busInterface xd:busTypeRef="clock" xd:name="processing_system7_0_FCLK_CLK2" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:mode="master" xd:busInterfaceRef="FCLK_CLK2"/>
    <xd:busInterface xd:busTypeRef="clock" xd:name="processing_system7_0_FCLK_CLK3" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:mode="master" xd:busInterfaceRef="FCLK_CLK3"/>
    <xd:busInterface xd:busTypeRef="clock" xd:name="processing_system7_0_M_AXI_GP1_ACLK" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:mode="slave" xd:busInterfaceRef="M_AXI_GP1_ACLK"/>
    <xd:busInterface xd:busTypeRef="clock" xd:name="processing_system7_0_S_AXI_HP0_ACLK" xd:instanceRef="processing_system7_0" xd:componentRef="processing_system7" xd:mode="slave" xd:busInterfaceRef="S_AXI_HP0_ACLK"/>

    <xd:busInterface xd:busTypeRef="reset" xd:name="rst_processing_system7_0_100M_peripheral_reset" xd:instanceRef="rst_processing_system7_0_100M" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK0" xd:busInterfaceRef="peripheral_reset"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="rst_processing_system7_0_100M_interconnect_aresetn" xd:instanceRef="rst_processing_system7_0_100M" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK0" xd:busInterfaceRef="interconnect_aresetn"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="rst_processing_system7_0_100M_peripheral_aresetn" xd:instanceRef="rst_processing_system7_0_100M" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK0" xd:busInterfaceRef="peripheral_aresetn"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_0_peripheral_reset" xd:instanceRef="proc_sys_reset_0" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK1" xd:busInterfaceRef="peripheral_reset"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_0_interconnect_aresetn" xd:instanceRef="proc_sys_reset_0" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK1" xd:busInterfaceRef="interconnect_aresetn"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_0_peripheral_aresetn" xd:instanceRef="proc_sys_reset_0" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK1" xd:busInterfaceRef="peripheral_aresetn"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_1_peripheral_reset" xd:instanceRef="proc_sys_reset_1" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK2" xd:busInterfaceRef="peripheral_reset"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_1_interconnect_aresetn" xd:instanceRef="proc_sys_reset_1" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK2" xd:busInterfaceRef="interconnect_aresetn"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_1_peripheral_aresetn" xd:instanceRef="proc_sys_reset_1" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK2" xd:busInterfaceRef="peripheral_aresetn"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_2_peripheral_reset" xd:instanceRef="proc_sys_reset_2" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK3" xd:busInterfaceRef="peripheral_reset"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_2_interconnect_aresetn" xd:instanceRef="proc_sys_reset_2" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK3" xd:busInterfaceRef="interconnect_aresetn"/>
    <xd:busInterface xd:busTypeRef="reset" xd:name="proc_sys_reset_2_peripheral_aresetn" xd:instanceRef="proc_sys_reset_2" xd:componentRef="proc_sys_reset" xd:mode="master" xd:clockRef="processing_system7_0_FCLK_CLK3" xd:busInterfaceRef="peripheral_aresetn"/>

    <xd:resourceEstimates xd:BRAM="0" xd:DSP="0" xd:FF="0" xd:LUT="0"/>
  </xd:component>
</xd:repository>



今まで、TCLスクリプトを貼っておく。

source -notrace C:/HDL/Xilinx/SDx/2016.3/scripts/vivado/sdsoc_pfm.tcl

set pfm [sdsoc::create_pfm ZYBO_0_163_6.hpfm]
sdsoc::pfm_name $pfm "marsee" "xd" "zybo" "1.0"
sdsoc::pfm_description $pfm "Zynq ZYBO camera"

sdsoc::pfm_clock $pfm FCLK_CLK0 processing_system7_0 0 true rst_processing_system7_0_100M
sdsoc::pfm_clock $pfm FCLK_CLK1 processing_system7_0 1 false proc_sys_reset_0
sdsoc::pfm_clock $pfm FCLK_CLK2 processing_system7_0 2 false proc_sys_reset_1
sdsoc::pfm_clock $pfm FCLK_CLK3 processing_system7_0 3 false proc_sys_reset_2

sdsoc::pfm_axi_port $pfm M_AXI_GP1 processing_system7_0 M_AXI_GP
sdsoc::pfm_axi_port $pfm S_AXI_HP0 processing_system7_0 S_AXI_HP

sdsoc::pfm_axis_port $pfm m_axis mt9d111_inf_axis_0 M_AXIS

for {set i 0} {$i < 16{incr i{
  sdsoc::pfm_irq $pfm In$i xlconcat_0
}

sdsoc::pfm_iodev $pfm s_axi_lite bitmap_disp_cntrler_axi_master_0 uio
sdsoc::pfm_iodev $pfm s_axi_lite bitmap_disp_cntrler_axi_master_1 uio
sdsoc::pfm_iodev $pfm s_axi_lite mt9d111_inf_axis_0 uio
sdsoc::pfm_iodev $pfm s_axi_AXILiteS PmodHB5_inf_left uio
sdsoc::pfm_iodev $pfm s_axi_AXILiteS1 PmodHB5_inf_left uio
sdsoc::pfm_iodev $pfm s_axi_AXILiteS PmodHB5_inf_right uio
sdsoc::pfm_iodev $pfm s_axi_AXILiteS1 PmodHB5_inf_right uio
sdsoc::pfm_iodev $pfm S_AXI axi_gpio_0 uio

sdsoc::generate_hw_pfm $pfm

  1. 2016年12月28日 05:19 |
  2. SDSoC
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3677-0ca1ed2d
この記事にトラックバックする(FC2ブログユーザー)