FC2カウンター FPGAの部屋 EDK

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

FPGAの部屋

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

2つの AXI4 Master ポートを持つ XPS 用 IP の書き方(ISE14.7 の XPS)

ISE14.7 の XPS で2つのAXI4 Master ポートを持つ XPS 用 IP の書き方の覚書です。

2つのAXI4 Masterポートを下のようにMPDファイルで定義します。

BUS_INTERFACE BUS = M_AXI_0, BUS_STD = AXI, BUS_TYPE = MASTER
BUS_INTERFACE BUS = M_AXI_1, BUS_STD = AXI, BUS_TYPE = MASTER


AXI4バスのパラメータを下のように書いて、M_AXI_0, M_AXI_1 で共用していました。

PARAMETER C_M_AXI_ADDR_WIDTH = 32, DT = integer, ASSIGNMENT = CONSTANT, BUS = M_AXI_0:M_AXI_1
PARAMETER C_M_AXI_DATA_WIDTH = 128, DT = integer, RANGE = (32, 64, 128, 256), BUS = M_AXI_0:M_AXI_1


そうすると、一見うまく行っているように見えます。32ビットデータバス幅では、AXIインターコネクトを通して、DDR3 SDRAMへWrite できていましたが、64ビットデータバス幅、128ビットデータバス幅だと、BVALIDが帰って来ません。DDR3 SDRAMへのData Write ができていないようです。
担当するAXIインターコネクトの設定を見ると、Master Information を表示させた時に、該当するAXI4 Master Port が表示されません。論理合成やインプリメントで通っても、おかしくなっているようです。

そこで、同じ2つのAXI4 Masterポートを定義しても、それぞれのパラメータを定義して使用すると問題なく BVALIDが帰ってきました。データ Write も問題ないようです。
こんな感じです。

PARAMETER C_M_AXI_0_ADDR_WIDTH = 32, DT = integer, ASSIGNMENT = CONSTANT, BUS = M_AXI_0
PARAMETER C_M_AXI_0_DATA_WIDTH = 64, DT = integer, RANGE = (32, 64, 128, 256), BUS = M_AXI_0
・・・・・
PARAMETER C_M_AXI_1_ADDR_WIDTH = 32, DT = integer, ASSIGNMENT = CONSTANT, BUS = M_AXI_1
PARAMETER C_M_AXI_1_DATA_WIDTH = 64, DT = integer, RANGE = (32, 64, 128, 256), BUS = M_AXI_1


こうすると、担当するAXIインターコネクトの設定のMaster Information に、該当するAXI4 Master Port が表示されました。
当然、HDLも同様にパラメータを増やしました。
  1. 2014年08月21日 11:15 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

SDKの Workspace Launcher が表示されなくなった時の対処方法

SDKの Workspace Launcher が何らかの原因で表示されなくなった時の対処方法を備忘録として書いておく。
SDKの Workspace Launcher は、SDKのワークスペースを指定するダイアログだ。Workspace Launcher を下に示す。
Workspace_Launcher_1_140401.png

Workspace Launcher が表示されるのは、SDKを立ちあげた時だ。ワークスペースを選択できないと、違ったプロジェクトのSDKを立ち上げる時に困ったことになるので、表示されて欲しい。だが、たまに表示されなくなるのだ。

そういう場合は、SDKの Window メニューから Preferences を選択する。
Workspace_Launcher_2_140401.png

Preferences ダイアログでGeneral -> Startup_adn Shutdown を選択する。

Refresh workspace on startup のチェックボックスにチェックが入っていないと思うので、チェックを入れる。
Workspace_Launcher_3_140401.png

これで、SDKの起動時に、Workspace Launcher が出てくると思う。

なお、このブログ記事のネタ元は、日立のページ、”Eclipse の起動または終了時のダイアログ表示について”です。
  1. 2014年04月01日 05:48 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

ある constant の値で、他の constant の値を切り替える3(VHDL編2、XPSプロジェクト)

ある constant の値で、他の constant の値を切り替える2(VHDL編)”の続き。

VHDLの達人 hiyuh さんのVHDLコードのおかげで、"SVGA"と入力したら、800x600 に設定することができた。今度は、XPSプロジェクトに置いてAdd IPのダイアログの中で、VGA, SVGAなどの解像度を設定したら、640x480, 800x600 に設定することを目指す。

MPDファイルのサンプルを見ると、DT = STRING として、VALUESで選択する文字列の項目を列挙すれば、Add IPのダイアログでリストボックスで選択できるようだ。

PARAMETER RESOLUTION = "SVGA", DT = STRING, VALUES = (VGA=VGA, SVGA=SVGA, XGA=XGA, SXGA=SXGA, HD=HD)


なお、”Platform Specification Format Reference Manual Embedded Development Kit (EDK) 14.1 UG642 (v14.1) April 24, 2012”の47ページに載っている例文によると、ダイアログに表示する文字列は = の後のようだ。= の前にinteger 値を書けば、その値を入力することも出来るようだ。下に引用する。

PARAMETER C_ODD_PARITY=1, RANGE=(0:1), VALUES=(0=Even, 1=Odd)


VHDLの達人 hiyuh さんは、”VHDLでstringなgenericを使うのはあまり筋が良くない”とのことなのだが、文字列使ったほうがわかりやすいし、Xilinxのサンプルも使ってあるので、文字列を使ってみようと思う。何かまずいことがあったら integer に修正しようと思う。

constant_test2 IP を作って、XPSプロジェクトにAdd IPした所の画像を下に示す。
const2const_5_140310.png

constant_test2_0 をダブルクリックして、ダイアログを表示してみたところだ。RESOLUTIONを選択することが出来る。HDを選んだ。
const2const_6_140310.png

ISE14.7でインプリメントもOKだった。
const2const_7_140310.png

ISimのシミュレーションでも、HDの解像度が選択されているのがわかる。
const2const_8_140310.png

これで、この戦略は使えることがわかったので、これを使って、キャラクタ・ディスプレイ・コントローラ IP を使いやすいように書き換えることにする。

なお、VHDLコードは、”ある constant の値で、他の constant の値を切り替える2(VHDL編)”に貼ってある constant_test2.vhd そのままだ。

下にMPDファイルを貼っておく。

BEGIN constant_test2

## Peripheral Options
OPTION IPTYPE = PERIPHERAL
OPTION IMP_NETLIST = TRUE
OPTION STYLE = HDL
OPTION DESC = constant_test2
OPTION LONG_DESC = constant test IP
OPTION HDL = VHDL
OPTION RUN_NGCBUILD = FALSE

## Bus Interfaces

## Generics for VHDL or Parameters for Verilog
PARAMETER RESOLUTION = "SVGA", DT = STRING, VALUES = (VGA=VGA, SVGA=SVGA, XGA=XGA, SXGA=SXGA, HD=HD)

## Ports
PORT oH_ACTIVE_VIDEO = "", DIR = O, VEC=[10:0]
PORT oV_ACTIVE_VIDEO = "", DIR = O, VEC=[10:0]
END

  1. 2014年03月10日 04:03 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

XPSプロジェクトでの入出力信号の処理

XPSプロジェクトでMIG(Memory Interface Generator) で DDR3 SDRAMをインスタンスしていますが、その時に DQ, DQS_P, DQS_N 等の 入出力信号 (inout) は、Net名とExtarnal Ports名を同じ名前にしておかないと Design Rule Check でエラーが出るようです。覚書として書いておきます。
xps_inout_1_131216.png
  1. 2013年12月16日 10:59 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

XPSのカスタムIPにおけるMPDファイルの書き方4

このブログ記事のトップは、”XPSのカスタムIPにおけるMPDファイルの書き方1
前の記事は、”XPSのカスタムIPにおけるMPDファイルの書き方3

キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする13(Writeはうまく行った)”で使用した cdc_axi_slave IPで使用しているMPDファイルの書き方について、ここに書いておく。

PARAMETER C_S_AXI_NUM_ADDR_RANGES = 1, BUS = S_AXI, DT = INTEGER, ASSIGNMENT = OPTIONAL_UPDATE, TYPE = NON_HDL, RANGE = (1:4)


C_S_AXI_NUM_ADDR_RANGESのデフォルト値を1に定義して、レンジは1~4までのinteger だ。”ASSIGNMENT = OPTIONAL_UPDATE”は、、Platform Specification Format Reference ManualEmbedded Development Kit (EDK) 14.1 UG642 (v14.1) April 24, 2012 の42ページによると、TCLプロシージャに関連付けられているMHSの値を指定できるとのことだ。このパラメータはAXI Slave IPにアドレス・スペースがいくつあるかを指定する。

この後で、アドレス・スペースを並べて書いて、C_S_AXI_NUM_ADDR_RANGES で指定された数だけ有効になる。

PARAMETER C_S_AXI_RNG00_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG00_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 1), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG00_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG00_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 1), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG01_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG01_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 2), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG01_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG01_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 2), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG02_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG02_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 3), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG02_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG02_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 3), TYPE = NON_HDL
PARAMETER C_S_AXI_RNG03_BASEADDR = 0xFFFFFFFF, BUS = S_AXI, DT = std_logic_vector, ADDRESS = BASE, PAIR = C_S_AXI_RNG03_HIGHADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 4), TYPE = NON_HDL, MIN_SIZE = 0x1000
PARAMETER C_S_AXI_RNG03_HIGHADDR = 0x00000000, BUS = S_AXI, DT = std_logic_vector, ADDRESS = HIGH, PAIR = C_S_AXI_RNG03_BASEADDR, ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 4), TYPE = NON_HDL


ここで、C_S_AXI_RNG00_BASEADDR と C_S_AXI_RNG00_HIGHADDR はペアになっている。それぞれ PAIR で相手を指定している。ベース・アドレスと最大のアドレスのペアだ。

各、BASEADDR と HIGHADDR の表示は、C_S_AXI_NUM_ADDR_RANGES の値で決められる。例えば2番めのペアは、”ISVALID = (C_S_AXI_NUM_ADDR_RANGES >= 2)”と指定されていて、C_S_AXI_NUM_ADDR_RANGES の値が2以上の時に表示される。

下の図に、C_S_AXI_NUM_ADDR_RANGES = 1 の時のXPS Core Configダイアログを示す。
Writing_MPD_1_130622.png

次に、C_S_AXI_NUM_ADDR_RANGES = 3 の時のXPS Core Configダイアログを示す。
Writing_MPD_2_130622.png
  1. 2013年06月22日 05:13 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

XPSのカスタムIPにおけるMUIファイルの書き方

custom_vtc IPコアを例にMUIファイルの書き方を書いておく。
なお、MPDファイルの書き方は、”XPSのカスタムIPにおけるMPDファイルの書き方1”からのシリーズを参照のこと。

なお、Platform Specification Format Reference ManualEmbedded Development Kit (EDK) 14.1 UG642 (v14.1) April 24, 2012 ”の75ページ ”Chapter 5 Microprocessor-IP User Interface (MUI)”をマニュアルとして参照にした。

MUI (Microprocessor-IP User Interface) ファイルは、XML形式で書かれていて、IPをXPSプロジェクトにAdd IPするときに表示されるダイアログのフォーマットを指定することができる。

DTD Reference Section
DTDファイルの ipdialog.dtd を参照する。ipdialog.dtd は、EDK_Installフォルダ/hw/XilinxProcessorIPLib/pcores にある。このファイルには、PLBの定義などがあった。
ipdialog.dtd は、MUIファイルの初めの行で定義してある。

<!DOCTYPE doc SYSTEM "../../ipdialog.dtd" [


Internal Entity Definition Section
すでに、DTDファイルで定義してある信号もあるけれども、IPコア固有のパラーメータを個別に定義する必要がある。

・<key> - MPDのパラメータの名前。このタグの値は、MPDファイル内の名前と一致する必要がある。

・<label> - 短いテキスト記述。このタグは、ダイアログボックスのパラメータのラベルを定義する。

・<tip> - ツールチップ。この情報は、マウスは、パラメータ名の上に保持されているダイアログボックスのポップアップウィンドウに表示される。コンテンツは、このタグは必要ない。

custom vtc の例をw下に示す。

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE doc SYSTEM "../../ipdialog.dtd" [
    <!-- -->
    <!ENTITY H_ACTIVE_VIDEO '
    <widget id="H_ACTIVE_VIDEO">
        <key>H_ACTIVE_VIDEO</key>
        <label>H_ACTIVE_VIDEO</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_FRONT_PORCH '
    <widget id="H_FRONT_PORCH">
        <key>H_FRONT_PORCH</key>
        <label>H_FRONT_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_SYNC_PULSE '
    <widget id="H_SYNC_PULSE">
        <key>H_SYNC_PULSE</key>
        <label>H_SYNC_PULSE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY H_BACK_PORCH '
    <widget id="H_BACK_PORCH">
        <key>H_BACK_PORCH</key>
        <label>H_BACK_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_ACTIVE_VIDEO '
    <widget id="V_ACTIVE_VIDEO">
        <key>V_ACTIVE_VIDEO</key>
        <label>V_ACTIVE_VIDEO</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_FRONT_PORCH '
    <widget id="V_FRONT_PORCH">
        <key>V_FRONT_PORCH</key>
        <label>V_FRONT_PORCH</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_SYNC_PULSE '
    <widget id="V_SYNC_PULSE">
        <key>V_SYNC_PULSE</key>
        <label>V_SYNC_PULSE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY C_M_AXI_SUPPORTS_WRITE '
    <widget id="C_M_AXI_SUPPORTS_WRITE">
        <key>C_M_AXI_SUPPORTS_WRITE</key>
        <label>C_M_AXI_SUPPORTS_WRITE</label>
        <tip></tip>
    </widget>
    '>
    <!ENTITY V_BACK_PORCH '
    <widget id="V_BACK_PORCH">
        <key>V_BACK_PORCH</key>
        <label>V_BACK_PORCH</label>
        <tip></tip>
    </widget>
    '>
]>


Labelはダイアログで、下の図のように表示される。この Internal Entity Definition Section では定義のみで、次に示す Entity Reference Section で item としてインスタンスされる必要がある。
custom_vtc_6_130608.png


Entity Reference Section
ここでは、Add IPの時のダイアログの体裁を決定する。

・<doc> - エレメント階層のトップでルート・エレメント。

・<view> - view は、階層の第2レベルの、タブ名となる。view id がIDを示し、<display> </display>で囲まれた間の名前がタブ名として表示される。

・<group> - グループを示す。group id がIDを示し、<display> </display>で囲まれた間の名前がタブ名として表示される。

・<item> - Internal Entity Definition Section で定義されたエンティティを表示させる。

custom_vtc で下のように書くと、

<doc>
    <view id="Video Timing">
        <display>Video Timing1</display>
        <group id="Video Timing">
            <display>Video Timing2</display>
            <item>&H_ACTIVE_VIDEO;</item>
            <item>&H_FRONT_PORCH;</item>
            <item>&H_SYNC_PULSE;</item>
            <item>&H_BACK_PORCH;</item>
            <item>&V_ACTIVE_VIDEO;</item>
            <item>&V_FRONT_PORCH;</item>
            <item>&V_SYNC_PULSE;</item>
            <item>&V_BACK_PORCH;</item>
        </group>
    </view>
    
</doc>


ダイアログは下の図のように表示される。
custom_vtc_5_130608.png
  1. 2013年06月08日 04:04 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

XPSのカスタムIPにおけるMPDファイルの書き方3

このブログ記事のトップは、”XPSのカスタムIPにおけるMPDファイルの書き方1
前の記事は、”XPSのカスタムIPにおけるMPDファイルの書き方2

PARAMETER C_S_AXI_LITE_PROTOCOL = AXI4LITE, DT = STRING, BUS = S_AXI_LITE, ASSIGNMENT = CONSTANT, TYPE = NON_HDL

C_S_AXI_LITE_PROTOCOL パラメータに AXI4LITE を指定した。DT (Data Type) は STRING、ASSIGNMENT を CONSTANTにすると下の図のように設定することができなくなる。
How_to_Write_MPD_3_130401.png

TYPEは、NON_HDL と HDL を指定することができる。VHDLのconstant やVerilog HDL の parameter で定義される場合は HDL で、HDL はデフォルト値なので省略できる。NON_HDL の場合は、IPのHDLで使用するのではなくツールで使われる。

PARAMETER C_S_AXI_LITE_SUPPORTS_READ = 1, DT = INTEGER, RANGE = (0,1), BUS = S_AXI_LITE, TYPE = NON_HDL

DT (Data Type) は INTEGER で、RANGE = (0,1) に設定するとチェックボックスになる。RANGE = (0,1) を指定しないと、値を設定できる。
How_to_Write_MPD_4_130401.png

PARAMETER C_M_AXI_THREAD_ID_WIDTH = 1, DT = integer, RANGE = (1:16), BUS = M_AXI

RANGE = (1:16) だと、1から16まで設定することができる。下に図で16に設定すると、もう値を増やすことが出来ない。よく見ると上向き三角はハイドされている。
How_to_Write_MPD_5_130401.png

PARAMETER C_M_AXI_SUPPORTS_USER_SIGNALS = 0, DT = integer, RANGE = (0,1), TYPE = NON_HDL, BUS = M_AXI
PARAMETER C_M_AXI_AWUSER_WIDTH = 1, DT = integer, ISVALID = (C_M_AXI_SUPPORTS_USER_SIGNALS == 1), BUS = M_AXI
PARAMETER C_M_AXI_ARUSER_WIDTH = 1, DT = integer, ISVALID = (C_M_AXI_SUPPORTS_USER_SIGNALS == 1), BUS = M_AXI
PARAMETER C_M_AXI_WUSER_WIDTH = 1, DT = integer, ISVALID = (C_M_AXI_SUPPORTS_USER_SIGNALS == 1), BUS = M_AXI
PARAMETER C_M_AXI_RUSER_WIDTH = 1, DT = integer, ISVALID = (C_M_AXI_SUPPORTS_USER_SIGNALS == 1), BUS = M_AXI
PARAMETER C_M_AXI_BUSER_WIDTH = 1, DT = integer, ISVALID = (C_M_AXI_SUPPORTS_USER_SIGNALS == 1), BUS = M_AXI

ISVALID = (C_M_AXI_SUPPORTS_USER_SIGNALS == 1) で、C_M_AXI_SUPPORTS_USER_SIGNALSが1だったら、このパラメータの設定が有効になる。下の図は無効の状態。
How_to_Write_MPD_6_130401.png

C_M_AXI_SUPPORTS_USER_SIGNALSのチェックボックスにチェックすると、下の5つのパラメータが有効になる。
How_to_Write_MPD_7_130401.png

MPDファイルの全リストは、”カメラ・インターフェースIPにAXI4 Lite Slave インターフェースを追加3(MPD, MUIファイルの作製)”を参照のこと。

次のブログ記事は、”XPSのカスタムIPにおけるMPDファイルの書き方4
  1. 2013年04月01日 21:31 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0
»