FC2カウンター FPGAの部屋 2011年07月
fc2ブログ

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

FPGAの部屋

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

カーズ2を見てきました

昨日はカーズ2を見てきました。
ディズニー映画で、PIXARが作ったコンピュータ・アニメです。
最初にトイ・ストーリー3の続編がついていました。

カーズ2のほうは、なかなか良かったのですが、トイ・ストーリー3にはかないません。私としては、コクリコ坂からの方が好みです。
  1. 2011年07月31日 05:52 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

”7シリーズFPGAデザイン v13.1”セミナの受講

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の思いがけない使い方なども紹介があって、とても楽しいセミナでした。
  1. 2011年07月30日 05:03 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

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

前回、チュートリアルでカスタム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 が上になっていた。優先順位が変わったのかもしれない?
SP605_AXI_CDC_1_110728.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 にした。
SP605_AXI_CDC_2_110728.png

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

6.XPSの画面に、今まで設定してきたシステムが表示された。
SP605_AXI_CDC_4_110728.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 と入力した。
SP605_AXI_CDC_5_110730.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とした。
SP605_AXI_CDC_6_110730.png

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

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

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

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

AXIバスのEDKでキャラクタ・ディスプレイ・コントローラのカスタムIPを作る2”に続く。
  1. 2011年07月29日 06:02 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

AXIバスのEDKチュートリアルを試す11(カスタムIPをカスタマイズする)

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"と入れると、レジスタの値とカウンタの値が見えた。
SP605_AXI_EDK_111_110726.png

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

成功した。
もう1度、自分でカスタムIPを作って練習してみたい。
  1. 2011年07月26日 19:20 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

お祭り

昨日と今日は地元のお祭です。
地区の子供用神輿3機(小学校低学年用、小学校高学年用、中学生用)と他の地区の中学生神輿も集まってきます。
夜も賑やかです。
いえながさんのマルチインターバルタイマーで2秒ごとに撮影して、TMPGEnc 無料版でMPEGにしてみたのですが、速すぎたみたいです。やはり1秒ごとが良いようです。撮影した動画はアップしようと思ったのですが、人の顔が映っているのでやめました。写真が少ないとTMPGEnc その場でスライドショーのフリー版でスライドショーにしたほうが良さそうです。
gion_1_1108724.jpg

  1. 2011年07月24日 09:34 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

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

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

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

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

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

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

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

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

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

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

7.SP605の電源をONした。

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

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

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

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

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

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

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

15.XMD promptで”mrd 0x7c600000”と入力すると、 0x00000001と表示された。
SP605_AXI_EDK_110_110724.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)は終了した。
  1. 2011年07月24日 05:42 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

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

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 をセーブする。
SP605_AXI_EDK_88_110721.png

2.XPSでProjectメニューから> Rescan User Repositoriesを選択して、blink pcoreの変更をXPSに認識させる。
SP605_AXI_EDK_89_110721.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を選択する。
SP605_AXI_EDK_90_110721.png

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SP605_AXI_EDK_25_110706.png

AXIバスのEDKチュートリアルを試す10(カスタムIPを作る4)”に続く。
  1. 2011年07月21日 05:52 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

AXIバスのEDKチュートリアルを試す8(カスタムIPを作る2)

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

1.前回のCIP Wizardでpcores -> blink_v1_00_a -> hdl -> vhdl には、blink.vhdとuser_logic.vhdの2つのファイルが生成された。
SP605_AXI_EDK_83_110720.png

・user_logic_.vhdは、”カスタム機能”ブロック
・blink.vhdは、”AXIスレーブ”ブロック
カスタム・ロジック・インターフェースは、IPIC信号を使うそうだ。
SP605_AXI_EDK_78_110719.png

このチュートリアルで作成するカスタム・ペリフェラルは、ボードの4個のLEDを点滅させるロジックだそうだ。

EDK Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design EDK 13.1 (UG683 April 13, 2011)の58ページのTake a Test Drive! Modifying the CIP Wizard Template Filesのチュートリアルを行う。
・CIP Wizardで生成したblinkのコードを変更する。
・コントロール・レジスタを1つ生成したが、それはカウンタのイネーブル、ディスエーブルする機能を持つ。
・カウンタは、バス・クロックで減算されて、LEDの点滅に使用される。

2.XPSのFileメニューからOpen...を選択して、pcores -> blink_v1_00_a -> hdl -> vhdlフォルダのblink.vhdを選択して開く。133行目にLEDsポートの宣言を追加する。
SP605_AXI_EDK_84_110720.png

3.更に、297行目にuser_logicのポート記述を追加する。
SP605_AXI_EDK_85_110720.png

4.blink.vhdをセーブする。

5.XPSのFileメニューからOpen...を選択して、pcores -> blink_v1_00_a -> hdl -> vhdlフォルダのuser_logic.vhdを選択して開く。101行目にポート宣言を追加する。
SP605_AXI_EDK_86_110721.png

6.更に、212行目からにカウンタの記述を追加した。
SP605_AXI_EDK_87_110721.png

7.チュートリアルには書いてなかったが、countのsignal宣言を書いた。

signal count : std_logic_vector(27 downto 0);


・IP2Bus_Dataは、プロセッサのリード動作で読まれるデータをIPから出力する。
・IP2Bus_WrAckは、プロセッサからのライトのアクノリッジ信号だそうだ。0Waitでも良いし、ライトに時間がかかるならば、完了するまでIP2Bus_WrAckを1にアサートせずにWaitさせる。このサンプルでは、IP2Bus_WrAckにslv_write_ackを直結していて、0waitで動作する。
・IP2Bus_Errorは現在は0に接続されて、エラー無しの状態になっている。カスタムIPの状況によっては、例えばタイムアウトが発生したときに1にアサートすれば、バス転送が終了する。

AXIバスのEDKチュートリアルを試す9(カスタムIPを作る3)”に続く。
  1. 2011年07月20日 05:51 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

AXIバスのEDKチュートリアルを試す7(カスタムIPを作る1)

今回はCIP Wizardで独自のIPを作るチュートリアルを試してみたいと思う。(使用するISEのバージョンは13.1)
EDK Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design EDK 13.1 (UG683 April 13, 2011)の47ページのTake a Test Drive! Generating and Saving Templatesからのチュートリアルをやってみる。

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

2.Create and Import Peripheral Wizardが立ち上がる。
SP605_AXI_EDK_71_110719.png

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

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

5.Name and Versionで、Name:にblink と入力した。Description:にSimple hardware circuit to allow control of the LEDs on the evaluation board. と入力した。
SP605_AXI_EDK_74_110719.png

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

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

CIP Wizardで下の3つを自動的に生成するそうだ。
・AXIデバイスのスレーブ接続
・必要なバス・プロトコル・ロジック
・自分のカスタムHDLコードへ接続するための信号セット

8.User S/W Registerで自分のロジックモジュールで使用するレジスタ数を指定する。ここではデフォルト値の1とする。
SP605_AXI_EDK_77_110719.png

9.IP Interconnect (IPIC)で、IP Interconnect (IPIC) interface のどの信号と接続するかを決定する。デフォルト値とする。信号名をクリックすると、右の枠に説明文が表示された。
SP605_AXI_EDK_78_110719.png

10.(OPTIONAL) Peripheral Simulation Supportは、AXI BFMシミュレーションの為には別にライセンスが必要だそうなので、チェックしない。
SP605_AXI_EDK_79_110719.png

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

12.Summaryが表示された。Finishボタンをクリックする。
SP605_AXI_EDK_81_110719.png

13.XPSを見ると、Project Local PCores -> USER -> BLINKが生成されたのが見えた。
SP605_AXI_EDK_82_110719.png

AXIバスのEDKチュートリアルを試す8(カスタムIPを作る2)”に続く。
  1. 2011年07月19日 05:49 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

コクリコ坂からを見てきました(映画)

今日も、京都(ではないですが)で、コクリコ坂からを見てきました。
私に取っては、久しぶりのジブリのヒット。良かったと思います。アノ時代の雰囲気が懐かしいんでしょうかね?私の時代よりも結構前ですが、雰囲気は残っていました。
昔々、私の通った茨城県の高校は、明治30年創立でした。まだバンカラな雰囲気がありました。(今も多少そんな感じはしますが。。。)
私が通った頃は、昔の使われなくなった階段教室がある古~~い木造校舎が残っていました。ハトのフンが落ちていましたが、その一角に所属していた無線部がありました。本当に雨漏りするくらいの狭い部室でした。なので、映画のカルチェラタンの雰囲気がよくわかります。
映画を見て、なんか懐かしい気分になりました。カルチェラタンの内部や、街の風景もよく描きこまれています。ジブリ映画の特徴ですね。
  1. 2011年07月18日 22:28 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ハリーポッターと死の秘宝PART2(後編)を見てきました(映画)

今日、ハリーポッターと死の秘宝PART2(後編)を見てきました。これでハリーポッターも終わりかと思うとさびしいです。
映画も本も全て見てきました。伏線がいっぱい張ってあって、とてもわくわくします。
途中の映画は、時間の関係で原作をいじりすぎて、つまらないと感じることもありましたが、今回は面白かったです。3Dで見てきましたが、自然な迫力で良かったです。
銀河英雄伝説やスターウォーズシリーズが終わったときと同様の喪失感を感じました。定期的に見に行く映画が1つ減りました。
  1. 2011年07月16日 22:09 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ISimハードウェア協調シミュレーション3(FFTのシミュレーション2)

ISimハードウェア協調シミュレーション2(FFTのシミュレーション1)”の続き。

前回はFFTのIPを生成して、インプリメントのMAPの途中で中止した。
次は、シミュレーションを行う。まずは、ISimのソフトウェアでやってみた。
下に用意したテストベンチのfp_fft_core_top_tb.v を下に示す。

`timescale 1ns / 1ps

module fp_fft_core_top_tb;

    // Inputs
    reg clk;
    reg start;
    reg [15:0] xn_re;
    reg [15:0] xn_im;
    reg fwd_inv;
    reg fwd_inv_we;
    reg [13:0]    scale_sch;
    reg scale_sch_we;

    // Outputs
    wire rfd;
    wire [13:0] xn_index;
    wire busy;
    wire edone;
    wire done;
    wire dv;
    wire [13:0] xk_index;
    wire [15:0] xk_re;
    wire [15:0] xk_im;

    // Instantiate the Unit Under Test (UUT)
    fp_fft_core_top uut (
        .clk(clk), 
        .start(start), 
        .xn_re(xn_re), 
        .xn_im(xn_im), 
        .fwd_inv(fwd_inv), 
        .fwd_inv_we(fwd_inv_we), 
        .scale_sch(scale_sch), 
        .scale_sch_we(scale_sch_we), 
        .rfd(rfd), 
        .xn_index(xn_index), 
        .busy(busy), 
        .edone(edone), 
        .done(done), 
        .dv(dv), 
        .xk_index(xk_index), 
        .xk_re(xk_re), 
        .xk_im(xk_im)
    );

    parameter PERIOD = 10;
    parameter real DUTY_CYCLE = 0.5;
    parameter OFFSET = 0;

    
    initial    // Clock process for clk
    begin
        clk = 1'b0;
        #OFFSET;
        forever begin
            clk = 1'b0;
            #(PERIOD-(PERIOD*DUTY_CYCLE)) clk = 1'b1;
            #(PERIOD*DUTY_CYCLE);
        end
    end

    initial begin
        // Initialize Inputs
        start = 0;
        fwd_inv = 0;
        fwd_inv_we = 0;
        scale_sch = 0;
        scale_sch_we = 0;

        // Wait 100 ns for global reset to finish
        #100;
        
        // Add stimulus here
        start = 1;
    end
    
    initial begin
        xn_re = 0;
        #100;
        forever begin
            xn_re = 0;
            #500 xn_re = 16;
            #500;
        end
    end
      
    initial begin // 位相を45度遅らせる
        xn_im = 0;
        #125;
        forever begin
            xn_im = 0;
            #500 xn_im = 16;
            #500;
        end
    end
      
endmodule


View:をSimulation に変更し、ProcessesからSimulate Behavioral Modelをダブルクリックする。
ISim_Co_Sim_17_110715.png

コンパイルが行われてISimが立ち上がり、500usシミュレーションを行ったら、13分30秒かかった。
ISim_Co_Sim_18_110715.png

次に、Designウインドウで、fp_fft_core_topを選択してSourceメニューからSource Properties...を選択する。
Enable Hardware Co-Simulation をチェックして、Clock Portにclkを指定する。Target Board for Hardware Co-Simulation でSP605(JTAG) を選択し、今回はEnable Incremental Implementation をチェックする。
ISim_Co_Sim_19_110716.png

fp_fft_core_topのアイコンがハードウェア協調シミュレーション用に変化する。ProcessesウインドウからSimulate Behavioral Modelをダブルクリックして、シミュレーションを開始すると、コンパイルが開始される。コンパイルに30分くらいかかったかな?(途中で犬の散歩に行ってしまったので、正確な時間はわかりません)(注:37分くらいみたいです)
ISim_Co_Sim_20_110716.png

シミュレータが立ち上がって、500usシミュレーションするのに50秒で終了した。(ISimハードウェア協調シミュレーション)
ISim_Co_Sim_21_110716.png

ソフトウェアの時は13分30秒だったので、16.2倍速くなった。しかし、コンパイルに時間がかかる。これは、インプリメントしているからだ。ただしコンパイルしてあるので、もう一度シミュレーションするのは速い(50秒)。

この状態から、fp_fft_core_top_tbのxn_im のオフセット値だけ書き換えた。

    initial begin // 位相を45度遅らせる
        xn_im = 0;
        // #125;
        #130;
        forever begin
            xn_im = 0;
            #500 xn_im = 16;
            #500;
        end
    end



これで、ISimのRe-launch ボタンでリコンパイルして、エラボレートしたら数秒でコンパイルが終了した。シミュレーション時間はハードウェア協調シミュレーションの時間(50秒)だった。少なくともテストベンチを修正するときには、再度インプリメントも行われないので、コンパイル時間も短くて便利だと思う。オフセット値を計測してみたが、きちんと30nsになっていた。(変更されている)
ISim_Co_Sim_22_110716.png

そうか、テストベンチはソフトウェアなので、コンパイルが高速なんですね。こういう使い方は非常に良いと思います。
つまり、ISimハードウェア協調シミュレーションの使いどころは、今のところ、ロジック部が重くて、シミュレーションを頻繁に書き換えてシミュレーションしたい場合ということになると思います。

ちなみに、ISimのGUIを落としても、UUT(DUT)に変更がなければ、インプリメント抜きでISimが立ち上がります。

  1. 2011年07月16日 21:53 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

FWFTモードのBlock RAM使用した非同期FIFOのrd_data_countについて

Block RAMを使用した非同期FIFOのrd_data_countについては、信用しないほうが良いようです。基本的には、emptyとalmost_emptyを使用するか、もしくは、rd_data_countとempty, almost_emptyを組み合わせたほうが良いと感じました。

非同期FIFOは、FIFO Generator 8.1で生成されていて、Write Width:32, Write Depth:71, Read Width:128, Write Depth:17の幅の違うFIFOです。RD_DATA_COUNT、empty, almost_emptyを出力させています。
FWFT_AFIFO_1_110715.png

Verilogファイルでのインスタンスを下に示します。

    assign cam_rgb_data = {{8{1'b0}}, cam_red, cam_green, cam_blue};
    // MIGとの接続用非同期FIFO
    cam2mig_fifo cam2mig_afifo_inst (
        .wr_clk(clk_cam),    // input wr_clk
        .wr_rst(reset_cam | ~frame_valid_1d),     // input wr_rst
        .rd_clk(clk_ddr2),     // input rd_clk
        .rd_rst(reset_ddr2 | ~frame_v_1d_ddr2_2),     // input rd_rst
        .din(cam_rgb_data),            // input [31 : 0] din
        .wr_en(cam_data_ena & capt_ena),         // input wr_en
        .rd_en(data_enable),         // input rd_en
        .dout(data_out),         // output [127 : 0] dout
        .full(cmfifo_full),         // output full
        .almost_full(cmfifo_almost_full), // output almost_full
        .overflow(cmfifo_overflow), // output overflow
        .empty(cmfifo_empty),         // output empty
        .almost_empty(cmfifo_almost_empty), // output almost_empty
        .underflow(cmfifo_underflow), // output underflow
        .rd_data_count(cmfifo_rd_data_count) // output [3 : 0] rd_data_count
    );


cmfifo_rd_data_countが2以上だったらcam2mig_fifo から2個ずつデータを読んでいます。
全体で1回分、つまり2このデータが少ないようなのです。なぜなんだろう?と思って調べていましたが、原因がわかりました。
下がcam2mig_fifoのシミュレーション波形です。
FWFT_AFIFO_2_110715.png

黄色の点線のカーソルのところで、cmfifo_rd_data_countが1になって、すぐに黄色の実線のカーソルで0に戻っています。黄色の実線で、cmfifo_emptyが0に落ちています。つまり、rd_data_countは、FWFTモードFIFO内部のFIFOモジュールのrd_data_countで、FIFO全体のrd_data_countと思って使用するのは危険なんじゃないかな?と思います。
次に、上のシミュレーション波形の次を下に示します。
FWFT_AFIFO_3_110715.png

cmfifo_almost_emptyでも同様の動作になって、その次の時にrd_data_countが1になりました。これでは、rd_data_countの値を見て制御していると、2個データが残ってしまうことになります。

emptyとalmost_emptyを見て制御するように変更しようと思います。
これからは、少なくともFWFTモードのBlock RAM使用した非同期FIFOのrd_data_countは、必ずしも正しくないと考えて制御回路を作る必要がありそうです。

(2011/07/19追記)
コメントでieee1394さんに教えていただいたのですが、非同期FIFOでFWFTモードの場合は、Use Extra Logic For More Accurate Data Countsのチェックボックスにチェックを入れる必要があるそうです。
FWFT_AFIFO_4_110719.png

これで、FIFOのIPを再生成して、シミュレーションしてみました。
FWFT_AFIFO_5_110719.png

確かに、emptyやalmost_emptyに関連して変化するようになったのですが、振動しているところがあります。黄色の点線のカーソルの辺りをズームしてみました。
FWFT_AFIFO_6_110719.png

emptyやalmost_emptyから1クロック遅延していることがわかりました。やはり、emptyやalmost_emptyで制御したほうが良さそうです。
  1. 2011年07月15日 17:32 |
  2. Core Generator
  3. | トラックバック:0
  4. | コメント:2

ISimハードウェア協調シミュレーション2(FFTのシミュレーション1)

このところISimハードウェア協調シミュレーションをしようとしていたが、いろいろな問題があって、いろいろ試行錯誤していた。
ハイブリッド デザイン向けのハードウェア協調シミュレーションをやりたいと思って、”ISim ハードウェア協調シミュレーション :Spartan-6 メモリ コントローラーおよびオンボード DDR2 メモリ”をやろうとしたが、SP601を持っていない。SP605でやろうとしたが、変換するのが難しかった。結局、ハイブリッド デザイン向けのハードウェア協調シミュレーションはそれ用のHDLを書かなくてはいけないし、内部信号も見えないので、あまり得をしないかな?という考えになった。
(2013/07/05:追記)現在は、SP601のISim ハードウェア協調シミュレーション のマニュアルは無くなって、ML505nadoのマニュアルがある。”ISim ハードウェア協調シミュレーション : Virtex-5エンベデッド イーサネット MAC を介したライブ イーサネット トラフィックの処理

それよりは、そのまま実行出来るロジック ベースのデザイン向けモデルの有効性を検証してみたい。
そこで、”ISim ハードウェア協調シミュレーション チュートリアル : 浮動小数点高速フーリエ変換のシミュレーション”をやってみることにした。
これも、 Virtex®-6 FPGA ML605 評価キットのチュートリアルだが、SP605に変換してやってみることにした。やってみると、FFTのIPの生成が遅かった。30分くらいかかっていたので、途中で自分から落としてしまうことが多かった。
それにSpartan-6では、浮動小数点数のFFTがだめなようだったので、固定小数点に変更してやってみることにした。(使用したISEは13.2)

1.最初にSP605用の新規プロジェクトを作成した。
ISim_Co_Sim_9_110713.png

2.Project メニューからNew Source...を選択する。

3.New Sourece Wizardが起動する。IP(CORE Generator & Architecture Wizard) を選択して、File name:にfft_core2 と入力した。
ISim_Co_Sim_10_110713.png

4.Select IPダイアログで、Detital Signal Processing -> Transforms -> FFTs -> Fast Fouier Trasform 7.1 を選択する。Next->ボタンをクリックする。
ISim_Co_Sim_11_110713.png

5.Summaryが表示される。Finishボタンをクリックする。
ISim_Co_Sim_12_110713.png

6.Fast Fouier Trasformのダイアログが開く。Transform Lengthを16384に、Implementation OptionsをPipelined, Streaming I/Oに設定する。
ISim_Co_Sim_13_110713.png

7.チュートリアルでは、Floationg Pointにしてあるが、ここでは、Fixed Pointのままとする。Output OrderingをNatural Orderに変更する。これは、バタフライを元に順番に戻すオプションかな?
ISim_Co_Sim_14_110713.png

8.Optimize Options -> Complex Multipliers -> Use 4-multiplier structure (performance optimization) のラジオボタンをチェックする。これでGenerateボタンをクリックする。
ISim_Co_Sim_15_110713.png

9.FFTのIPが生成される。30分くらいかかるのでほっといた。

10.fp_fft_core_top.v を作成した。Verilogコードを下に示す。

module fp_fft_core_top(
    clk,
    start,
    xn_re,
    xn_im,
    fwd_inv,
    fwd_inv_we,
    scale_sch,
    scale_sch_we,
    rfd,
    xn_index,
    busy,
    edone,
    done,
    dv,
    xk_index,
    xk_re,
    xk_im);


    input wire    clk;
    input wire    start;
    input wire    [15 : 0] xn_re;
    input wire    [15 : 0] xn_im;
    input wire    fwd_inv;
    input wire    fwd_inv_we;
    input wire    [13 : 0]    scale_sch;
    input wire    scale_sch_we;
    output wire    rfd;
    output wire    [13 : 0] xn_index;
    output wire    busy;
    output wire    edone;
    output wire    done;
    output wire    dv;
    output wire    [13 : 0] xk_index;
    output wire    [15 : 0] xk_re;
    output wire    [15 : 0] xk_im;

    fft_core2 fft_core2_inst (
        .clk(clk), // input clk
        .start(start), // input start
        .xn_re(xn_re), // input [15 : 0] xn_re
        .xn_im(xn_im), // input [15 : 0] xn_im
        .fwd_inv(fwd_inv), // input fwd_inv
        .fwd_inv_we(fwd_inv_we), // input fwd_inv_we
        .scale_sch(scale_sch), // input [9 : 0] scale_sch
        .scale_sch_we(scale_sch_we), // input scale_sch_we
        .rfd(rfd), // ouput rfd
        .xn_index(xn_index), // ouput [13 : 0] xn_index
        .busy(busy), // ouput busy
        .edone(edone), // ouput edone
        .done(done), // ouput done
        .dv(dv), // ouput dv
        .xk_index(xk_index), // ouput [13 : 0] xk_index
        .xk_re(xk_re), // ouput [15 : 0] xk_re
        .xk_im(xk_im) // ouput [15 : 0] xk_im
    );
endmodule


11.一度インプリメントしてみたが、MAPにすごく時間がかかるので、諦めた。(今回はシミュレーションがメインなので。。。)
ISim_Co_Sim_16_110715.png

12.MAPのレポートを下に示す。LUTsは11%だが、RAMB16BWERsを53%、DSP48A1sを41%使用している。

Release 13.2 Map O.61xd (nt)
Xilinx Mapping Report File for Design 'fp_fft_core_top'

Design Information
------------------
Command Line   : map -intstyle ise -p xc6slx45t-fgg484-3 -w -logic_opt off -ol
high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off
-pr off -lc off -power off -o fp_fft_core_top_map.ncd fp_fft_core_top.ngd
fp_fft_core_top.pcf 
Target Device  : xc6slx45t
Target Package : fgg484
Target Speed   : -3
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date    : THU 14 JUL 18:58:14 2011

Interim Summary
---------------
Slice Logic Utilization:
  Number of Slice Registers:                 4,929 out of  54,576    9%
    Number used as Flip Flops:               4,929
    Number used as Latches:                      0
    Number used as Latch-thrus:                  0
    Number used as AND/OR logics:                0
  Number of Slice LUTs:                      3,211 out of  27,288   11%
    Number used as logic:                    2,408 out of  27,288    8%
      Number using O6 output only:           1,026
      Number using O5 output only:              20
      Number using O5 and O6:                1,362
      Number used as ROM:                        0
    Number used as Memory:                     795 out of   6,408   12%
      Number used as Dual Port RAM:              0
      Number used as Single Port RAM:           32
        Number using O6 output only:            32
        Number using O5 output only:             0
        Number using O5 and O6:                  0
      Number used as Shift Register:           763
        Number using O6 output only:           153
        Number using O5 output only:             0
        Number using O5 and O6:                610
    Number used exclusively as route-thrus:      8
      Number with same-slice register load:      0
      Number with same-slice carry load:         8
      Number with other load:                    0

Slice Logic Distribution:
  Number of LUT Flip Flop pairs used:        4,258
    Number with an unused Flip Flop:           296 out of   4,258    6%
    Number with an unused LUT:               1,047 out of   4,258   24%
    Number of fully used LUT-FF pairs:       2,915 out of   4,258   68%
    Number of unique control sets:              28
    Number of slice register sites lost
      to control set restrictions:              42 out of  54,576    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

IO Utilization:
  Number of bonded IOBs:                        95 out of     296   32%

Specific Feature Utilization:
  Number of RAMB16BWERs:                        62 out of     116   53%
  Number of RAMB8BWERs:                          9 out of     232    3%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       1 out of      16    6%
    Number used as BUFGs:                        1
    Number used as BUFGMUX:                      0
  Number of DCM/DCM_CLKGENs:                     0 out of       8    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     376    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     376    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     376    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     256    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                           24 out of      58   41%
  Number of GTPA1_DUALs:                         0 out of       2    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCIE_A1s:                            0 out of       1    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       4    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%



まだシミュレーションしていませんが、今回は終了です。次回に続く。
  1. 2011年07月15日 05:52 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:0

ISimハードウェア協調シミュレーション1(キャラクタ・ディスプレイ・コントローラ)

ツイッターで@Vengineer さんに教えてもらったISimハードウェア協調シミュレーションをやってみることにした。

まずは、ISimユーザーガイド(UG660 (v13.2) 2011 年 7 月 6 日) の139ページの”第 11 章 ISim ハードウェア協調シミュレーションチュートリアル”を参考にすることにした。

上のマニュアルから引用すると、

ISim のハードウェア協調シミュレーションでは、現段階でロジック ベースのデザイン向けモデルとハイブリッド デザイン向けのモデルの 2 つのモデルがサポートされています。


ということだ。
ロジックベースのモデルは、LUT、フリップフロップ、ブロック RAM、および DSP プリミティブのみで構成されていて、このままでISimハードウェア協調シミュレーションができるようだ。
ハイブリッド デザイン向けのモデルは、ハード IP ブロック、DCM/PLL、および MGTを使用したモデルで、この場合は、外部入力を使用したフリーランニングのクロックを使用するブロックと、ISimから供給されるエミュレートクロックを使用するブロックに分かれるため、カスタム制約ファイル (UCF) を供給する必要があるそうだ。(146ページ、ハイブリッド協調シミュレーション フロー)

使用できるボードも決まっているようだ。Spartan-6では、SP605、SP601。Spartan-3Aも”ザイリンクス Spartan-3A スターター キット”がサポートに入っているが、後から述べるProject NavigatorのSource PropertiesのHarware Co-Simulation Properties のTarget Board for Hardware Co-Simulation から選べなかった。これは、サポートしていると言っても、コマンドラインからやる必要があるのかもしれない。
なお、ボード サポート ファイルは結構簡単に書くことができるようだ。、ISimユーザーガイド(UG660 (v13.2) 2011 年 7 月 6 日)の150ページ、”ボード サポート ファイル”参照。

さてそれでは、SP605のキャラクタ・ディスプレイ・コントローラで、ISimハードウェア協調シミュレーションを初めて見ようと思う。(ISE13.2使用)
SP605のキャラクタ・ディスプレイ・コントローラのプロジェクトは下のような構成になっている。
ISim_Co_Sim_1_110712.png

テストベンチのあるのは、ピンクの四角で囲ったCharDispCtrlerTest_SP605.v とCharDispCtrler.v だ。そのうちのCharDispCtrlerTest_SP605.v は下にDCMのインスタンスがあって、ハイブリッド デザイン向けのモデルに分類されてしまうはずで、UCFを用意しないとハードウェア協調シミュレーションを行うことは出来ないはずだ。
CharDispCtrler.v の方はロジックのみで、ロジック ベースのデザイン向けモデルとなり、そのままハードウェア協調シミュレーションを行うことができるはずだ。

1.DesignウインドウでView:をSimulation に変更する。

2.CharDispCtrler_tb の下のUUT - CharDispCtler を選択して、左のEdit Source Properties アイコンを選択する。
ISim_Co_Sim_2_110712.png

3.Source Properties ダイアログが開く。CategoryペインからHardware Co-Simulation を選択する。Enable Hardware Co-Simulation にチェックを入れる。Clock Portにclkを入力し、Target Board for Hardware Co-Simulation でSP605(JTAG) を選択する。OKボタンをクリックする。
ISim_Co_Sim_3_110712.png

4.UUT - CharDispCtler にアイコンが表示される。シミュレーショントップのCharDispCtrler_tbを選択する。ProcessesウインドウからSimulate Behavioral Model をダブルクリックして、シミュレーションをスタートする。
ISim_Co_Sim_4_110712.png

5.インプリメントを行っているようなので、時間がかかる。その間にSP605の電源をONする。

6.20msのシミュレーションに約8分かかった。
ISim_Co_Sim_6_110712.png

restartして、runすることもできる。普通にシミュレーションをしている感じだ。
SP605の電源をOFFしたら、runしても波形が表示されなかったので、ハードウェアを使用しているということがわかる。

7.Enable Hardware Co-Simulation のチェックを外して、ソフトウェアのシミュレーションを行った。run 20ms でかかった時間は17秒だった。
ISim_Co_Sim_7_110712.png

相当差が出てしまったが、今回は簡単なロジックだったので、JTAG通信のオーバーヘッドがボトルネックになっていると思われる。今度はもう少し複雑なシミュレーションをしてみようと思う。

なお、DCMをインスタンスしているCharDispCtrlerTest_SP605の Enable Hardware Co-Simulation にチェックを入れて、ISimハードウェア協調シミュレーションをONして、CharDispCtrlerTest_SP605_tbを選択して、Simulate Behavioral Modelをダブルクリックしてみた。
やはり、エラーが出てシミュレーションができなかった。
ISim_Co_Sim_8_110712.png

これは、ハイブリッド デザイン向けのモデルでシミュレーションする必要がありそうだ。
  1. 2011年07月12日 05:55 |
  2. ISim
  3. | トラックバック:0
  4. | コメント:2

AXIバスのEDKチュートリアルを試す6(SDK3)

AXIバスのEDKチュートリアルを試す5(SDK2)”の続き。

SDKのhello_world_0プロジェクトにmemory_test_0プロジェクトを追加してみた。

1.FileメニューからNew -> Xilinx C Projectを選択して、New Xilinx C ProjectからMemory Testsを選択した。(下図はmemory_test_0が追加された後に開いたので、memory_test_1になっている)
SP605_AXI_EDK_52_110710.png

2.SDKを見ると、memory_test_0プロジェクトが追加され、ビルドが終了していた。
SP605_AXI_EDK_53_110710.png

3.前回同様に、SDKでXilinx ToolsメニューからProgram FPGAを選択し、ハードウェアをダウンロードしてから、デバッカを立ち上げて、ソフトウェアを動作させてみた。

4.Tera_termにメモリテストの内容が表示された。MCB_DDR3をテストした。
SP605_AXI_EDK_54_110710.png

5.次にperipheral_test_0プロジェクトを追加して、周辺デバイスのテストを行った。
SP605_AXI_EDK_55_110710.png

6.SysAceのセルフテストだけがパスしなかった。なぜだろうか?設定が悪いのかな?
SP605_AXI_EDK_56_110710.png

7.いろいろサンプルプロジェクトをやってみた。Dhrystoneプロジェクト。
SP605_AXI_EDK_57_110710.png

8.xilkernel_posix_threads_demo_0をやってみた。
SP605_AXI_EDK_58_110710.png

SP605_AXI_EDK_59_110710.png

9.”EDK Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design EDK 13.1 (UG683 April 13, 2011)”の39ページからの”Take a Test Drive! Working with Multiple Source Files and Projects”をやって見る。testperiph.cは途中で止まってしまうので、memorytest.cのみやってみた。

10.memory_tests_0 のmemory_config_g.c, memory_config.h, memorytest.c をhello_world_0のsrcフォルダへコピーする。コピーすると、main()が2つあるので、エラーとなった。
SP605_AXI_EDK_60_110710.png

11.memorytest.c の53行目のmain()をmemorytest_main()に変更してセーブする。
SP605_AXI_EDK_61_110710.png

12.helloworld.c の"print("Hello World\n\r");" の下に、"memorytest_main();" を追加する。”warning: implicit declaration of function 'memorytest_main'”が出ている。
SP605_AXI_EDK_62_110710.png

13.platform.h に "int memorytest_main();" を追加すると、ワーニングが無くなった。
SP605_AXI_EDK_63_110710.png

14.memorytest.c のmemory_ranges をクリックして、マウスカーソルを上におくと、ウインドウが開いて、memory_ranges の定義が表示された。
SP605_AXI_EDK_64_110710.png

15.F2を押すと、フォーカスがそのウインドウに行くが、そこでは編集できなかった。memory_ranges を選択して、右クリックメニューからOpen Declaration を選択すると、ダイアログが出てくる。hello_world_0にあるmemory_ranges を選択して、OKボタンをクリックする。
SP605_AXI_EDK_65_110710.png

16.memory_ranges を定義しているmemory_config_g.c が開く。3番目のメンバーの"0xc0000000" を"0xc1000000"に変更してセーブする。
SP605_AXI_EDK_66_110710.png

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

18.Program FPGAダイアログが開く。Programボタンをクリックする。

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

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

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

22.Tera Termを起動して、9600bps, 8bit data, 1 stop bitに設定する。(デフォルト値)

23.Step Over アイコンをクリックして、行ごとに進めていく。"print("Hello World\n\r");" を通過したところで、Hello WorldがTera_termに表示された。
SP605_AXI_EDK_67_110710.png

SP605_AXI_EDK_68_110710.png

24.Resumeボタン、またはF8 を押すと、メモリテストも実行された。
SP605_AXI_EDK_69_110710.png

  1. 2011年07月11日 05:00 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

AXIバスのEDKチュートリアルを試す5(SDK2)

AXIバスのEDKチュートリアルを試す4(SDK1)”の続き。(使用したISE, EDKは13.1)

EDK Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design EDK 13.1 (UG683 April 13, 2011)の34ページからのSDKのProject Explorerについての説明を読み進めている。
SP605_AXI_EDK_40_110707.png

・SDKはFPGAボードのサポートパッケージ(BSP)のhello_world_bsp_0を作っているそうだ。
・Project Explorerは、ハードウェア・プラットフォーム(hw_platform_0)、ソフトウェア・プロジェクト(hello_world_0)、BSP(hello_world_bsp_0)が表示されている。
・ハードウェア・プラットフォームには、システムのアドレスや構成などを示すsystem.xmlとビットファイル、BMMファイルがある。ビットファイルとBMMファイルは、SDKでコンパイルしたELFファイルをビットファイルに書き込むために使用される。BMMファイルは命令用のBRAMの位置と構成を示している。
・BSPにはMicroBlaze用のライブラリ等が入っている。
・ソフトウェア・プロジェクトでは、helloworld.cの他に、プラットフォーム用のイニシャライズルーチン、リンカー・スクリプト等が自動生成されている。

さて次は、できたhello worldを実機で表示する。
1.SP605の2つのUSBケーブルを接続する。1つはダウンロード・ケーブル、もう1つはUSB-シリアル変換用だ。
2.USB-シリアル変換用にSilicon Labsのドライバをインストールした。
SP605_AXI_EDK_41_110708.png

3.SP605の電源をONした。
4.SDKでXilinx ToolsメニューからProgram FPGAを選択する。
SP605_AXI_EDK_42_110709.png

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

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

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

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

9.Tera Termを起動して、9600bps, 8bit data, 1 stop bitに設定する。(デフォルト値)

10.Resumeボタン、またはF8 を押すと、ターミナルにHello Worldと表示された。
SP605_AXI_EDK_47_110709.png

11.実行後のSDK。
SP605_AXI_EDK_48_110709.png

12.RunメニューからTerminateを選択するとデバックが終了する。
SP605_AXI_EDK_49_110709.png

13.終了後のSDK画面。デバック・アイコンをクリックすると、またデバックを行える。
SP605_AXI_EDK_50_110709.png

最後に、デバック用のパースペクティブをC/C++に戻すには、WindowsメニューからOpen Perspective -> C/C++ を選択する。
SP605_AXI_EDK_51_110709.png

  1. 2011年07月09日 06:21 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

ISE13.2が出ています

ISE13.2が出ています
ダウンロード、インストールしてみましたが、アイコンが違っています。すっきりしました。
ISE13.1のプロジェクトがそのまま使えますが、XPSは変換する必要があるようです。
ISE132_110707.png

上の図の左上端のアイコンが変わっているのがわかりますか?
そういえば、最初の起動画面も変わっていました。Xilinxのダウンロードページに書いてある3色の歯車が出てきます。

  1. 2011年07月07日 20:54 |
  2. Xilinx ISEについて
  3. | トラックバック:0
  4. | コメント:2

AXIバスのEDKチュートリアルを試す4(SDK1)

今回はSDKを使ってみよう。(使用したISE, EDKは13.1)

まずは、SDKには2つの実行環境がある。(下に引用します)
1.Standalone : 標準入出力とプロセッサのハードウェア機能へのアクセスなどの基本的な機能を提供するセミホスト型シングルスレッド環境
2.xilkernel : スケジーリング、スレッド、同期化、メッセージパッシング 、タイマなどのPOSIX型サービスを提供する単純な軽量カーネル

1つのSDKには複数のソフトウェア・プラットフォームを含めることができるそうだ。standaloneソフトウェア・プラットフォームとxilkernelソフトウェア・プラットフォームが混在できる。

さてそれでは、SDKを試してみることにする。

1.SP605_AXI_EDKフォルダの下に、SDK_Workspaceフォルダを作る。これが、SDKのワークスペースとなる。
SP605_AXI_EDK_32_110707.png

2.SDKを起動する。Select a workspace で先ほど作成したSDK_Workspaceフォルダを指定する。
SP605_AXI_EDK_33_110707.png

3.Xilinx SDKのWelcome画面が表示された。
SP605_AXI_EDK_34_110707.png

4.File -> New -> Xilinx C Projectを選択する。
SP605_AXI_EDK_35_110707.png

5.No Hardware Platforms in the Workspaceダイアログが表示される。Specifyボタンをクリックする。
SP605_AXI_EDK_36_110707.png

6.New Hardware Project に以下のように入力した。前回でExport Hardware Design To SDK with Bitstreamしてエクスポートしたファイルを指定する。(system\SDK\SDK_Export\hwの下にある)Finishボタンをクリックする。
SP605_AXI_EDK_37_110707.png

7.New Xilinx C Projectダイアログが開く。すでにデフォルトでプロジェクト名がhello_world_0と入っている。Select Project Template もHello Worldであることを確認して、Next>ボタンをクリックする。
SP605_AXI_EDK_38_110707.png

8.Create a new Board Support Package projectのラジオボタンが選択されていることを確認して、Finishボタンをクリックする。
SP605_AXI_EDK_39_110707.png

9.hello_world_0のサンプルアプリケーションが自動的にビルドされ、ターゲット・ハードウェアにダウンロードするためのELFファイルが生成される。
SP605_AXI_EDK_40_110707.png

今日はここまでで終了。
  1. 2011年07月07日 05:34 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

AXIバスのEDKチュートリアルを試す3(インプリメント)

今回は、ISEでのインプリメントを試す。今回のビットファイルにはソフトウェアは入っていない。(使用したISE, EDKは13.1)

1.XPSを終了させる。

2.Hierarchyウインドウでsystemを選択する。下のProcessesウインドウでGenerate Top HDL Source をダブルクリックする。
SP605_AXI_EDK_23_110706.png

3.system_top.vhd が生成された。これでインプリメントすることができるので、ProcessesウインドウでGenerate Programming File をダブルクリックして、インプリメントを開始する。
SP605_AXI_EDK_24_110706.png

4.インプリメントにだいぶ時間がかかったが無事終了した。使用したLUTは21%だった。タイミング制約も満足している。
SP605_AXI_EDK_25_110706.png

5.Analyze Post-Place & Route Static Timing を見ると、いろいろなタイミング制約がかかっていた。
SP605_AXI_EDK_26_110706.png

6.フォルダにはsystem_top.bit やedkBmmFile_bd.bmmが出来ていた。system\implementationフォルダには、system.bitとsystem_bd.bmmが出来ていた。
SP605_AXI_EDK_27_110706.png

SP605_AXI_EDK_28_110706.png

7.ハードウェア・デザインをSDKにエクスポートする。Hierarchyウインドウでsystemを選択する。下のProcessesウインドウでExport Hardware Design To SDK with Bitstream を右クリックして、右クリックメニューからProcess Properties...を選択する。
SP605_AXI_EDK_29_110706.png

8.Process Properties - Export to SDK Properties ダイアログが出てくるので、Launch SDK after Exportのチェックを外して、OKボタンをクリックする。
SP605_AXI_EDK_30_110706.png

9.ProcessesウインドウでExport Hardware Design To SDK with Bitstream をダブルクリックして、ハードウェア・デザインをSDKにエクスポートした。
SP605_AXI_EDK_31_110706.png
  1. 2011年07月06日 05:40 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

AXIバスのEDKチュートリアルを試す2(XPSのウインドウの説明)

前回は、Base System Builderでシステムを構築したが、今回はXPSの説明だった。

1.一番左のペインの下のProjectタブをクリックすると、Projectの設定がいじれる。

2.MHS File: system.mhsをダブルクリックするとシステムの設定が見える。
SP605_AXI_EDK_17_110705.png

3.元に状態に戻して、真ん中のペインでBus Interfacesタブを選択したまま、一番左のAXIの水色網掛けの部分にカーソルを持ってくると、インスタンス名がaxi4_0であることがわかる。その部分の接続で何処と何処が接続されているかがわかる。その次の緑の網掛けはaxi4lite_0だ。microblaze_0を展開してみると、どのバスが何処に接続されているかがわかる。
SP605_AXI_EDK_18_110705.png

4.Portsタブを選択して、RS232_Uart_1を展開すると、ポートが何処に接続されているかがわかる。TXとRXは外部のポートに接続されている。
SP605_AXI_EDK_19_110705.png

5.Addressesタブをクリックすると、RAMやIOのアドレスが表示される。
SP605_AXI_EDK_20_110705.png

6.下のStart Up PageタブをクリックするとHelpやDocumentation等が見られる。
SP605_AXI_EDK_21_110705.png

7.下のBlock Diagramタブをクリックすると、ブロック図が見られる。
SP605_AXI_EDK_22_110705.png

(使用したISE, EDKは13.1)
  1. 2011年07月05日 05:43 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

AXIバスのEDKチュートリアルを試す1(Base System Builder)

EDK Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design EDK 13.1 (UG683 April 13, 2011)の載っているSP605のAXIバスのチュートリアルを試してみることにした。
使用するFPGAボードはSP605なので、丁度良い。使用するISEのバージョンは13.1とする。

1.まずはISEのプロジェクト起動して、FileメニューからNew Project...を選択する。

2.New Project Wizardダイアログが出てくる。Location:でフォルダを選択して、Name:にプロジェクト名(SP605_AXI_EDK)を入力した。
SP605_AXI_EDK_1_110703.png

2.Project SettingsでEvaluation Development Boardの項目でSpartan-6 SP605 Evaluation Platform を選択した。
SP605_AXI_EDK_2_110703.png

3.Project Summary が表示される。Finishボタンをクリックする。
SP605_AXI_EDK_3_110703.png

4.Project NavigatorのProjectメニューからNew Source...を選択する。

5.New Sourece Wizardダイアログが出てくる。Embedded Processorを選択し、File name:にsystem と入力する。
SP605_AXI_EDK_4_110703.png

6.Summaryが表示される。Finishボタンをクリックする。
SP605_AXI_EDK_5_110703.png

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

8.Base System Builderダイアログが出てくる。AXI system のラジオボタンをクリックして、OKボタンをクリックする。
SP605_AXI_EDK_7_110703.png

9.Base System Builder -- AXI flowダイアログが出てくる。I would like to create a new design(デフォルト)のラジオボタンが選択されている。
SP605_AXI_EDK_8_110703.png

10.Board Selection では、すでにSpartan-6 SP605 Evaluation Platform が選択されていた。
SP605_AXI_EDK_9_110703.png

11.System ConfigurationでAXI System with Single MicroBlaze Processor を選択。というかこの選択肢しか選べない。やはり、MicroBlazeが中心なんだね。
SP605_AXI_EDK_10_110703.png

12.Processor ConfigurationでLocal Memory Sizeを32KBに変更した。後は下図に示す通りデフォルトのままとする。
SP605_AXI_EDK_11_110703.png

13.Peripheral ConfigurationでIIC_DVIとIIC_SFPを削除して、axi_timerを追加し、Use Interruptをチェックする。(下図は追加前)
SP605_AXI_EDK_12_110703.png

14.Peripheral Configurationの削除、追加後の画面。
SP605_AXI_EDK_13_110703.png

15.Cache ConfigurationでInstruction ChacheとData Chacheのサイズを指定する。両方共8KBに設定する(デフォルト)
SP605_AXI_EDK_14_110703.png

16.Summaryが表示される。Finishボタンをクリックする。
SP605_AXI_EDK_15_110703.png

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

(使用したISE, EDKは13.1)
  1. 2011年07月03日 08:52 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:4

FPGAの部屋の有用と思われるコンテンツのまとめサイトの更新 (2011/07/01)

FPGAの部屋の有用と思われるコンテンツのまとめサイトを更新しました。”MIG(Memory Interface Generator)”、”FPGA内蔵マイクロコントローラ”、”MicroBlazeクロスコンパイラ”の項目を追加し、その他の項目を更新しました。
  1. 2011年07月01日 04:59 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0