FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2011年07月

7月28日(木)、29日(金)と東京、大崎のザイリンクス社のセミナルームで”7シリーズFPGAデザイン v13.1”セミナを受講してきました。

7シリーズはVirtex-6とほとんど同じで、Artex-7、Kintex-7、Virtex-7と同じアーキテクチャになっているそうです。今までは、例えばSpartan6の出力DDRレジスタはODDR2ですが、Virtex-6の出力DDRレジスタはODDRです。Spartan-6の出力DDRレジスタを使用したデザインをVirtex-6に移行する場合には、ODDR2プリミティブを書き換える必要がありました。7シリーズになると、アーキテクチャが一緒なので、こういった苦労はなくなるはずですね。
7シリーズの特徴をあげると

・IOバンクが50IOBになって、32ビット幅のDDR?-SDRAMのデータピンが1バンクに収まるようになった。

・3.3Vに対応できるハイレンジポートが、Airtex-7、Kintex-7、Virtex-7についた。Virtex-6は2.5Vまでだったので、良かったです。それとは別に1.8VまでのハイパフォーマンスポートがKintex-7、Virtex-7について、その順に割合が多くなるそうです。Virtex-7 XT/HTはハイレンジポートがなくて、ハイパフォーマンスポートのみだそうです。

・I/OのディレイがIODELAYでなく、IDELAYとODELAYに別れて、別々の遅延値が設定できるようになったそうです。(ODELAYはハイパフォーマンスポートのみ)

・I/Oの構造も変わっていて、I/OにFIFOなどが付いたが、まだ情報がないそうです。

・Spartan-6のMCBハードマクロは無くなって、Artex-7でもソフトマクロのDDR?-SDRAMコントローラになったそうです。

・A/Dコンバータは1Mサンプル/秒で、コンフィグ前にJTAG経由でアクセス可能だそうです。

一番良いと思ったのは、PCIeの時に、パーシャルリコンフィグ類似の機能を使って、100msec 以内にPCIeハードマクロを生かして、コンフィグアクセスに応答させられることです。これで、FPGAのコンフィグ時間を気にすることが無くなったと思います。

Virtex-6のアーキテクチャと大きくは変わっていないですが、下位シリーズもDCMが無くなってPLLになりました。カメラのPCLKをDCMで受けるとおかしくなっていたので、やはりPLLの方が良さそうですね。

DSPの思いがけない使い方なども紹介があって、とても楽しいセミナでした。

前回、チュートリアルでカスタムIPを作ってみたが、自分でカスタムIPを作ってみることにした。
SP605のEDKで作ったMicroBlazeシステムに、キャラクタ・ディスプレイ・コントローラをカスタムIPとして接続することにした。今回はISE13.2でやってみる。

1.Project Navigatorで新しいプロジェクトを作成して、New Source...でEmbedded Processorを選択し、systemという名前で追加した。

2.Xilinx Platform Studio(以下、XPSとする)が立ち上がり、BSB Wizardを使ってBase Systemを作成するか?というダイアログが出てくるので、Yesボタンをクリックする。

3.Base System Builderダイアログが出てくる。この順番が、ISE13.1とISE13.2では逆になっていた。ISE13.2はAXI system が上になっていた。優先順位が変わったのかもしれない?
348c14b3.png


4.その後の設定画面も変更されている。思ったよりISE13.2で変わっているようだ。”AXIバスのEDKチュートリアルを試す1(Base System Builder)”を参照のこと。
Board and System Selection でSingle MicroBlaze Processer System とDual MicroBlaze Processer System を選択できるようになっている。ISE13.1ではSingle のみ選択できた。
Optimization Strategy も選択できるようになっている。デフォルトのArea にした。
4fdc75e5.png


5.前回同様に、Processor Frequency を100MHzとし、Local Memory Sizeを32KBに変更した。Select and Configure Peripherals でIIC_DVIとIIC_SFPを削除して、axi_timerを追加し、Use Interruptをチェックした。
85863b92.png


6.XPSの画面に、今まで設定してきたシステムが表示された。
34d566ac.png


これに、キャラクタ・ディスプレイ・コントローラをカスタムIPとして追加する。(”AXIバスのEDKチュートリアルを試す7(カスタムIPを作る1)”参照)

7.XPSのHardwareメニューからCreate or Import Peripheral... を選択する。

8.Create and Import Peripheral Wizardが立ち上がる。

9.Peripheral Flowで、Select Flowから、Create templates for a new peripheralのラジオボタンを選択する。(デフォルト値)

10.Repository or Projectで、To an XPS projectのラジオボタンが選択されていて、Projectに現在のプロジェクトが入力されている。(SP605_AXI_CharDispCtrler\system)

11.Name and Versionで、Name:にchardispc と入力した。
14645f96.png


12.Bus Interfaceで、AXI4-Lite: Simpler, non-burst control regster stytle interface が選択されている。

13.IPIF (IP Interface) Servicesが開く。Slave serves and configuration で、User logic software registerとInclude data pase timerにチェックが入っている。

14.User S/W Registerで自分のロジックモジュールで使用するレジスタ数を指定する。2とした。
209ef7a1.png


15.IP Interconnect (IPIC)で、IP Interconnect (IPIC) interface のどの信号と接続するかを決定する。デフォルト値とした。

16.(OPTIONAL) Peripheral Simulation Supportで、Generate BFM simulation platform をチェックしてBFMを生成してみることにした。
35cd3743.png


17.(OPTIONAL) Peripheral Implementation Supportでは、Generate template driver files to help you implement software interface のチェックボックスのみチェックしてみた。

18.XPSを見ると、Project Local PCores -> USER -> CHARDISPC が生成されたのが見えた。
6b61224b.png


AXIバスのEDKでキャラクタ・ディスプレイ・コントローラのカスタムIPを作る2”に続く。

AXIバスのEDKチュートリアルを試す7(カスタムIPを作る1)
AXIバスのEDKチュートリアルを試す8(カスタムIPを作る2)
AXIバスのEDKチュートリアルを試す9(カスタムIPを作る3)”
AXIバスのEDKチュートリアルを試す10(カスタムIPを作る4)
で作ってきたLEDの点滅をするカスタムIPをカスタマイズしてみることにした。

チュートリアルのカスタムIPは、レジスタに1を書くとLEDの点滅が始まるが、2を書くとカウンタを+1するのではなく+2するようにした。よって、2倍早く点滅する。レジスタを読んだ時にカウンタの値も読めるようにした。VHDLソースの一部を下に示す。

  -- implement slave model software accessible register(s) read mux
  SLAVE_REG_READ_PROC : process( slv_reg_read_sel, slv_reg0 ) is
  begin

    case slv_reg_read_sel is
      when "1" => slv_ip2bus_data <= slv_reg0(1 downto 0) & "00" & count;
      when others => slv_ip2bus_data <= (others => '0');
    end case;

  end process SLAVE_REG_READ_PROC;

  ------------------------------------------
  -- Example code to drive IP to Bus signals
  ------------------------------------------
  IP2Bus_Data  <= slv_ip2bus_data when slv_read_ack = '1' else
                  (others => '0');

  IP2Bus_WrAck <= slv_write_ack;
  IP2Bus_RdAck <= slv_read_ack;
  IP2Bus_Error <= '0';

    -- Create Counter
    -- Use slv_reg0 value to enable counter (LSB = '1' to run, LSB = '0' to stop)
    counter : process(Bus2IP_Clk) begin
        if Bus2IP_Clk'event and Bus2IP_Clk='1' then
            if Bus2IP_Resetn = '0' then
                count <= (others => '0');
            else
                if slv_reg0(1 downto 0) = "01" then
                    count <= count + 1;
                elsif slv_reg0(1 downto 0) = "10" then
                    count <= count + 2;
                end if;
            end if;
        end if;
    end process counter;
    
    -- Attach slowest bits to LEDs
    LEDs(3 downto 0) <= count(27 downto 24);



1.XPSでProjectメニューから> Rescan User Repositoriesを選択して、blink pcoreの変更をXPSに認識させる。

2.XPSを閉じて、ProcessesウインドウでGenerate Programming File をダブルクリックして、インプリメントを開始した。

後は、”AXIバスのEDKチュートリアルを試す10(カスタムIPを作る4)”と同様に行なった。

3.XMDコンソールを起動して、XMD promptから”mwr 0x7c600000 0x1”と入れるとLEDの点滅が始まった。

4.XMD promptから”mrd 0x7c600000"と入れると、レジスタの値とカウンタの値が見えた。
ab23479d.png


5.XMD promptから”mwr 0x7c600000 0x2”と入れるとLEDの点滅が速くなった。
SP605_AXI_EDK_112_110726.png

成功した。
もう1度、自分でカスタムIPを作って練習してみたい。

AXIバスのEDKチュートリアルを試す9(カスタムIPを作る3)”の続き。

前回でISEにインプリメントが終了した。今回はSDKを立ち上げてビットファイルをダウンロードする。

1.DesignのHierarchyウインドウでsystem_i(system.xmp)をクリックして、下のProcessesウインドウでExport Hardware Design to SDK with Bitstream を右クリックメニューから Process Properties... を選択する。
54b483cc.png


2.Process Propertiesで、Launch SDK after Exportにチェックを入れる。
b0758bd0.png


3.Project NavigatorのExport Hardware Design to SDK with Bitstream をダブルクリックして、起動する。

4.SDKが立ち上がって、ワークスペースを聞いてくるので、そのままでOKボタンをクリックする。
0ed92392.png


5.SDKが立ち上がって、すべてのデザインのビルドを始める。結構長くかかったが終了した。
50b31d5d.png


6.hw_platform_0 -> system.xml を開いてみると、blink_0のアドレスが割り当てられている事がわかる。
295432e5.png


これからは、”AXIバスのEDKチュートリアルを試す5(SDK2)”と同様に行う。(1部にその図を使用した)

7.SP605の電源をONした。

8.SDKでXilinx ToolsメニューからProgram FPGAを選択する。
bb00db63.png


9.Program FPGAダイアログが開く。Programボタンをクリックする。Software ConfigurationのELF File to Intialize in Block RAMの所はbootloopになっているが、これは、他のプログラムがダウンロードされるまでプロセッサをWaitさせておくそうだ。
26c3cc2a.png


10.SDKのProject Explorerで、hello_world_0の下のBinariesの下のhello_world_0.elfで右クリックして、右クリックメニューからDebug As -> Lanunch on Hardware を選択する。
ccc2e8e9.png


11.リンカー・スクリプトが走って、実行形式プログラム入のビットファイルがボードにダウンロードされる。C/C++ to Debugにパースペクティブを変更するダイアログが開くので、Yesボタンをクリックする。
SP605_AXI_EDK_45_110709.png

12.SDKにデバック用のパースペクティブが表示された。
059ef292.png


13.SDKでXilinx ToolsメニューからXMD Consoleを選択する。
e11874b8.png


14.XMD promptで”mwr 0x7c600000 0x1”と入力した。すると、SP605のDS3~DS6が点滅した。
14d78b46.jpg


15.XMD promptで”mrd 0x7c600000”と入力すると、 0x00000001と表示された。
ed38410b.png


16.XMD promptで”mwr 0x7c600000 0x0”と入力すると、LEDの点滅は停止した。

これで、EDK Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design EDK 13.1 (UG683 April 13, 2011)は終了した。

AXIバスのEDKチュートリアルを試す8(カスタムIPを作る2)”の続き。(使用するISEのバージョンは13.1)

次は、現在のプロジェクトに作成したカスタムIPを追加する。
EDK Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design EDK 13.1 (UG683 April 13, 2011)の60ページのTake a Test Drive! Adding the Pcore to Your Projectからのチュートリアルをやってみる。

まずは、MPDファイルにLEDsのポート宣言を追加する必要があるそうだ。

1.system\pcores\blink_v1_00_a\dataの blink_v2_1_0.mpd を開いて、##Portsの項目にLEDsのポート宣言を追加する。blink_v2_1_0.mpd をセーブする。
f876e474.png


2.XPSでProjectメニューから> Rescan User Repositoriesを選択して、blink pcoreの変更をXPSに認識させる。
550fcf15.png


・Xilinxは、カスタムIPを変更したときは、IPリポジトリをリスキャンすることを推奨しているそうだ。
・これでカスタムpcoreは、EDKで使用する準備ができた。
・PSFファイルや追加情報は、Platform Specification Format Reference Manualに書いてあるそうだ。

現在、プロジェクトに入ってるLEDs_4Bits pcoreを抜いて、blink pcoreを入れる。

3.System Assembly Viewで、LEDs_4Bits を選択して、右クリックメニューからDelete Instanceを選択する。
7a66ebcb.png


4.Delete IP Instanceダイアログが開く。デフォルトのインスタンスとすべての接続を削除する。
SP605_AXI_EDK_91_110721.png

5.XPSのIP CatalogからProject Local PCores -> USER -> BLINKを選んで、右クリックメニューからAdd IPを選択する。
49c930c0.png


6.XPS Core Configダイアログが開く。デフォルト値でOKボタンをクリックする。Interconnect Settings for BUFIFタブでは、Write Data FIFO DepthやRead Data FIFO Depthなどの設定もあるようだ。
2d237016.png


7.Instantiate and Connect IPダイアログが開く。Select the MicroBlaze Instance to Connect toでmicroblze_0が選ばれている。MicroBlazeは1個だけなので、選べるのはmicroblze_0のみ。
2fc6e111.png


8.XPSのBus Interfaceタブを見ると、blinkコアが入っているのがわかる。blinkとLEDsの間に外部接続を作る必要がある。
65ff5aaf.png


9.blink_0を展開して、LEDsのプルダウンメニューからMake External を選択する。
89810865.png


10.外部ピン名は、デフォルトで、blink_0_LEDs_pinとなった。NameやNetをクリックすると、名前を変更できる。MHSファイルを編集しても書き換えることができる。
3305e088.png


11.Addressタブをクリックすると、blink_0のアドレス領域が0x7C600000から0x7C60FFFFであることがわかる。64Kbyteのアドレスを割りつけられるので多いと思うが、これはデコーダのスピードをあげるために、わざとデコードするアドレスビットを減らしているそうだ。
87f6199b.png


・最後にUCFファイルにLED出力のピン情報を追加する

12.Projectタブをクリックする。UCF File: data/system.ucfをダブルクリックする。
e31f5176.png


13.system.ucfファイルが表示された。 LEDs_4Bits_TRI_Oを検索する。これは、先ほど削除したGPIO coreの制約で、XPSで削除しても自動的にUCFから削除されないそうだ。つまり、コアを削除したら、自分でUCFを修正して、コアの使用していた外部ピンの制約を削除する必要がある。
ac46c278.png


14.LEDs_4Bits_TRI_Oをblink_0_LEDs_pinに置換して、セーブした。これでカスタムIPの追加は終了。
0db11a4b.png


15.XPSを閉じて、Project Navigatorに戻り、再度、Hierarchyウインドウでsystemを選択する。下のProcessesウインドウでGenerate Top HDL Source をダブルクリックして、トップレベルファイルを再生成する。(ピン名が違っているから)
ca5ac62e.png


16.ProcessesウインドウでGenerate Programming File をダブルクリックして、インプリメントを開始した。
859687b0.png


・注:Project Navigatorでインプリメントしていると固まる時がある。その場合は、XPSでProjectメニューからClean All Generate Filesを行ってから、Project Navigatorで、ProjectメニューからCleanup Project Files...をすると直るようだ。

17.インプリメントが終了した。使用したLUTは21%だった。前回とパーセンテージは同じだが、使用数が少し違っている。上の図は今回のインプリメント。下の図が前回のインプリメント。
e44a4d8b.png


0aa32249.png


AXIバスのEDKチュートリアルを試す10(カスタムIPを作る4)”に続く。

↑このページのトップヘ