Xilinx社 Spartan 3E Starter Kit を使った Micro Blazeのチュートリアル 九州工業大学 笹尾研究室 中原 啓貴 1 はじめに • 本ドキュメントは Xilinx Spartan3E Starter Kit と Embedded Development Kit(以降EDK)を用いたMicro Blaze のチュートリアルとなっています • 環境 – ISE 8.2i Foundation – EDK 8.2i – Spartan 3E Starter Kit 両方のバージョンが一致しないとEDKが起動しません! • 事前に必要なこと – 上記の環境をインストール済み (USBのドライバもインストール済み) – Verilog, Cの習得 (VHDLも習得しておくことが望ましい) 2 ドキュメントの内容 • 簡単なMicro Blaze の設計 – EDKの使い方の習得 • 既存IPの追加 – LEDをCでコントロール – IPの追加法を習得 • ユーザIPの追加 – クロックカウンターを追加 – Import/Create IPの使い方を習得 • ソフトウェアとハードウェアの比較 – FIRフィルタを設計し, ハード・ソフト混在システムを設計 – ハードとソフトの速度を計測 3 簡単なMicro Blaze の設計(1) • • ここでは簡単なMicro Blazeを設計し, EDKの使い方を覚えます をダブルクリックしてEDKを起動してください • プロジェクトを作成し, Micro Blaze の設定を行います – Base System Builder wizardをチェックしOKを押してください 4 簡単なMicro Blaze の設計(2) • プロジェクトを置く場所とプロジェクト名を指定します • Project fileに直接入力するか, Browseで指定してください – プロジェクトディレクトリ: C:¥XilinxEDK – プロジェクト名: system.xmp • ディレクトリを指定したら, OKをクリックしてください 5 簡単なMicro Blaze の設計(3) • 右図のウィンドウが起動しますので I would like to create a new design に チェックをつけて, Nextをクリックしてください 6 簡単なMicro Blaze の設計(4) • ターゲットを指定します – Board vendor: Xilinx – Board name: Spartan-3E Starter Board – Board revision: C • 指定が終わったらNextをクリックしてください 7 簡単なMicro Blaze の設計(5) • 次にFPGAとプロセッサを指定します • StarterKitはFPGAとプロセッサが決まっているのでここでは 何もおこないません. そのままNextをクリックしてください 8 簡単なMicro Blaze の設計(6) • ここからはMicro Blazeの設定を行います – メインメモリがデフォルトでは 8KByteと少ないので, 32KBtyeに 増やしておきます – その他は変更しません – 設定が終わったらNextを クリックしてください 9 簡単なMicro Blaze の設計(7) • • • • ここからはMicroBlazeに組み込む 構成要素(IP)を設定します RS232_DTE, LEDs_8Bitのチェックを 外してください (後で追加します) RS232_DCEのチェックは残してください 設定が終わったらNextをクリックしてください 10 簡単なMicro Blaze の設計(8) • 以下のチェックを外します – FLASH_16Mx8, SPI_FLASH, DDR_SDRAM_16Mx16, Ethernet_MAC • 設定が終わったらNextをクリックしてください 11 簡単なMicro Blaze の設計(9) • 内部IPの追加ウィンドウが開きます • そのままNextをクリックしてください 12 簡単なMicro Blaze の設計(10) • ソフトウェアの設定を行います • そのままNextをクリックしてください – 一応サンプルアプリケーションは残しておくことをお勧めします (初めて作成したプロジェクトは一度合成を行う必要があり、 何かアプリケーションを置いておかないと合成が上手くいかないか ら!?) 13 簡単なMicro Blaze の設計(11) • 初期化プログラムをどこに置くか聞いてきますので Nextを押します(Peripheral Testも同様に) 14 簡単なMicro Blaze の設計(12) • システムの設計は完了です • そのままGenerateをクリックしてください(図1) • 次にFinishをクリックしてください(図2) 図1:System Created 図2:Finish 15 簡単なMicro Blaze の設計(13) • 次に何をするのか聞いてきますので, Start using Platform Studio をチェックしてOKをクリックしてください 16 簡単なMicro Blaze の設計(14) • • Platform Studioが起動します(図1) この時点で C:¥XilinxEDK フォルダ(図2)を見るとわかるのですが、 まだMicroBlazeのHDLファイルとCのテンプレート・ヘッダが生成されて いません. この時点で設計を行うと上手くいきません!! 図2:C:¥XilinxEDK 図1:Platform Studio 17 簡単なMicro Blaze の設計(15) • まず、Micro BlazeのHDLファイルを生成し HDLの合成を行います (ISEのSynthesis -> Implementationを行うのと同じ) – Hardware -> Generate Bitstream をクリックしてください – Done!が表示された後, C:¥XilinxEDKを見るとHDLファイルが 生成されていることが確認できます 18 簡単なMicro Blaze の設計(16) • 次にソフトウェアのライブラリとヘッダを生成します (C:¥XilinxEDK¥microblaze_0に格納される) – Software -> Build All User Applications をクリックしてください – ビルド後、ソフトウェアのサイズが表示されます – C:¥XilinxEDK¥microblaze_0 にライブラリが生成されます (注意)ソフトウェアをビルドするときは microblaze_0フォルダ、及び直下のディレクトリの ファイルを閉じてください (ビルド時にファイルを削除・追加するので、フォルダや ファイルを開いていると操作できなくてビルドが終わらない) ヘッダーフォルダ プログラムのサイズ 19 簡単なMicro Blaze の設計(17) • ソフトウェアプロジェクトを作成しましょう – まず、TestApp_Memoryを起動させないようにします – TestApp_Memoryを右クリックして Mark to Initialize BRAMsの チェックを外してください (図1) – 次に, Add Software Application Projectをダブルクリックし、Project Name に TutorialProject と入力してOKをクリックします(図2) 図1:TestApp_Memoryを 起動させないようにする 図2: ソフトウェアプロジェクトの追加 20 簡単なMicro Blaze の設計(18) • 追加したプロジェクトを起動するように設定します – TutorialProject を右クリックして, Mark to Initialize BRAMsにチェックをつ けてください(図1) • 次にソースファイルをプロジェクト上に作成します – Sources を右クリックして Add New File… を選択してください(図2) – ウィンドウが開きます. tutorial.c と入力してOKをクリックしてください(図3) 図1: Mark to Initialize BRAMs 図3: ソースファイル名を指定 図2:Add New File… を選択 21 簡単なMicro Blaze の設計(19) • Sources に tutorial.c が追加されます – C:¥XilinxEDK¥tutorial.c をダブルクリックするとエディタが起動する ので, 以下のプログラムを入力して保存 してください 改行は¥r¥n Xilinx 専用のライブラリ. printfでは メモリ量が多すぎる! 22 簡単なMicro Blaze の設計(20) • プロジェクトをBuild して, Bitstreamを生成します – Software -> Build All User Applications (図1) – Device Configuration -> Update Bitstream (図2) 以上の順で操作を行ってください 図1: プロジェクトのビルド 図2: Bitstreamの作成 23 簡単なMicro Blaze の設計(21) • ボードとPCを接続してください • ターミナルソフトを起動して(ここではTeraTerm Pro http://hp.vector.co.jp/authors/VA002416/ を使用)ください – 9600bps, データ長8ビット, パリティなし, ストップビット1ビット 電源を接続 RS232C をPCに接続 USBをPCに接続 ジャンパピンをJTAGに設定 (真ん中を残して上下を外す) .. .. 24 簡単なMicro Blaze の設計(22) • TeraTermでは… Serial のPort をStarter Kit の DCEに 接続しているPortにあわせる (デバイスマネージャを見るとよい) Setup -> Serial Port … を選択し 上記のように設定 25 簡単なMicro Blaze の設計(10) • FPGAに書き込みます – Device Configuration -> Download Bitstream を選択してください – ターミナルに表示されます! プログラムの停止 (FPGAをクリア) リセット 26 ここまでのまとめ • EDKの使い方を習得しました – – – – プロジェクトの作成法 初期設定の方法 ソフトウェアプロジェクトの作成法 簡単なプログラムの実行方法 • 課題: – tutorial.c をいろいろ改造して、ターミナルに表示させてみましょう 27 既存IPの追加(1) • ここでは、前回設計したシステムに既存のIPを接続し、 ソフトウェアでコントロールする方法を習得します – Starter Kit の LEDを接続してみましょう – C:¥XilinxEDK をコピーしてC:¥XilinxEDK_LED を作成します Xilinx_EDK をコピー(中身は同じ) 28 既存IPの追加(2) • EDK を起動します • コピーした C:¥XilinxEDK_LED¥system.xmpを開きます – 最初のプロジェクトウィンドウでは Cancel を選択 – メインウィンドウが起動するので File -> Open Project… を選択し, C:¥XilinxEDK_LED にある system.xmpを開いてください 29 既存IPの追加(3) • ボードのLEDとMicro Blazeを接続する I/O IPをシステムに追加します – IP Catalog タブをクリックし, General Purpose IO にある opb_gpio をダブ ルクリックしてください(図1) – 確認ダイアログがでるのでYesを選択します(図2) – 右のIPリストに opb_gpio_0 が追加されました(図3) 図1: opb_gpioを選択 図3: gpioがシステムに追加される 図2: 確認ダイアログ 30 既存IPの追加(4) • 追加したIPをバス(OPB)に接続します – FiltersのBus Interface にチェックを入れ, Bus Connection にある opb_gpio_0 の No Connection をクリック してください – プルダウンメニューの中から mb_opb を選択します • opb_gpio_0をクリックして LED_8bitにリネームしてください IPがバスに接続されると 緑色で塗りつぶされる 31 既存IPの追加(5) • 次にポートの接続を設定します(バスに接続した個々の信号 線を設定すると思えばよい) – FiltersのPortsをチェックし, LED_8bitにある GPIO_d_outのNetを クリックして, プルダウンメニューから LED_8bit_GPIO_d_outを選択 してください (選択はメニューを選んで、どこか他の部分をクリックす ると行われることに注意!) LED_8bit_GPIO_d_outを選んだ後、 どこか他の部分をクリックする 32 既存IPの追加(6) • 次にI/Oの方向とビット幅を 設定します LED_8bitを右クリックし, Configure IPを選択してください Common では Enable Channel2のチェックを外す GPIO Data Bus Width を 8に設定 8 Channel 1 では Channel 1 is Bi-directional: FALSE Channel 1 is Input Only: FALSE 33 既存IPの追加(7) • さらにこのIPのポートを外部に接続します – LED_8bitのGPIO_d_out のNetをクリックし, Make Externalを選択 してください – External Ports に LED_8bit_GPIO_d_out_pinが接続されます! – 幅(Range)は[0:7]になっています 34 既存IPの追加(8) • I/O ポートにソフトウェアからアクセスするアドレスを設定します – Filters の Addresses をチェックし, LED_8bit (SizeがU以外の部分)を Lockします (Lock にチェックをつける) – LED_8bit の Size (Uの部分) をクリックし, プルダウンメニューから64Kを 選択します – 仮のアドレスが設定されるので, をクリックしてアドレスを 割り当てます 64Kを選択 Lock をクリックして 既存のIPのアドレスを 変更しないようにする 仮のアドレス 仮のアドレスが 表示されたら クリック 35 既存IPの追加(9) • Clean Netlist を行い, Update Bitstream を行って ハードウェアとソフトウェアを一度に更新します (なぜかClean Netlistを行わないと更新できない…何で!?) 36 既存IPの追加(10) • C:¥XilinxEDK_LED¥microblaze_0¥include内にある xparameters.h を開いてみてください – LED_8BITのアドレス定義が追加されています! このアドレスに 値を書けばLEDを コントロールできます 37 既存IPの追加(11) • 次にFPGAピンをLEDに接続します – Projectタブを選択し, UCF File をダブルクリックします – ピン配置ファイル(**.ucf) に以下の内容を記述します – ピン名はさきほどのExternal Ports名を指定, ピンの位置はデータシート (Spartan3E Starter Kit Board User Guide を参考に) 38 既存IPの追加(12) • Clean Netlist を行い, Update Bitstream を行って ハードウェアとソフトウェアを一度に更新します – なぜかこの手順(更新→.ucfを後から編集→更新)で行わないと エラーがでる… 39 既存IPの追加(13) • ソフトウェアを設計します – 前回のTutorialProject は使用しないので, 右クリックして Mark to Initialize BRAMs のチェックを外しておきます – Add Software Application Project をダブルクリックし, プロジェクト LED_Ctrl を追加してください 40 既存IPの追加(14) • • Project: LED_Ctrl を右クリックし Mark to Initialize BRAMsをチェックします Sources を右クリックし, Add Net File.. から led_ctrl.c を入力し, 以下のプログラムを入力してください I/Oポートを読み書きする関数を 集めたヘッダ ベースアドレス, オフセット, 値 I/Oポートに値を書き込む関数 41 既存IPの追加(15) • プログラムの入力が終わったら保存しFPGAに書き込みます – Device Configuration -> Download Bitstream を選択してください (Build Project や Update Bitstream を同時に行ってくれる) LEDが交互に点滅します! 42 ここまでのまとめ • EDKにあらかじめ用意されているIPを追加しました • 課題: – このシステムはあらかじめ, Dip SwitchとPush Button が接続され、 設定も済んでいる – gpio_l.h には関数XGpio_mReadReg(BaseAddress, RegOffset)が 用意されており, ベースアドレスをこれらのスイッチのアドレスに設定すれば ボードのスイッチを操作できる – スイッチからLEDを操作できるようにプログラムを改造せよ (ソースコードだけ改造すればできる) 43 ユーザIPの追加 (1) • ここではユーザが独自に設計したオリジナルのハードウェア をMicro Blazeに接続し, 動かしてみます • なお、追加するにあたって – ユーザが設計したハードは正しく動作する(ハードを設計しながら Micro Blazeを設計してるととても非効率!) – ユーザのハードはVerilogで記述されている ことを前提に説明を行っていきます FPGA clock OPBバス 今回はこの部分を設計 Micro Blaze clock counter clk cnter I/O 44 ユーザIPの追加 (2) • C:¥XilinxEDK_CCNT フォルダを作成し, 前回設計した C:¥XilinxEDK_LED フォルダの中身をコピーしてください • EDK を起動し, Cancel を選んでください • File -> Open Project でさきほどコピーした C:¥XilinxEDK_CCNT にある system.xmp を開きます 45 ユーザIPの追加 (3) • ユーザIPを追加します – Hardware -> Create or Import Peripheral… を選択してください – Welcomeウィンドウが開きますので, Next をクリックしてください 46 ユーザIPの追加 (4) • 次に新規に作成するか, 既存のIPを読み込むか聞いてきます – 今回は新規に作成するので Create templates for a new peripheral にチェックをつけて Next をクリックしてください 47 ユーザIPの追加 (5) • 作成したIPを格納する場所を指定します – デフォルトはプロジェクトの pcores フォルダに作成されます – 今回はデフォルトで指定されている場所に格納します – そのまま Next をクリックしてください 今回はここに格納される 48 ユーザIPの追加 (6) • ユーザIPの名前とバージョンを指定します – Name に sys_clk_cnt_ip と入力し, Next をクリックしてください – 今回はバージョンの設定をデフォルトの 1.00.aにします 49 ユーザIPの追加 (7) • 作成したIPを接続するバスを指定します – On-chip Periperal Bus にチェックをつけて Next をクリックしてください 50 ユーザIPの追加 (8) • バスとユーザIP間のインタフェースを設定します – S/W reset and MIR, User logic interrupt support のチェックを外します – User logic S/W register support にチェックをつけます 51 ユーザIPの追加 (9) • ユーザIPのレジスタを設定します – Number of software accessible registers: 1 – Data width of each register: 32 bit とします 52 ユーザIPの追加 (10) • バスとIP間の制御信号の設定を行います – 今回はデフォルトで用意されている信号を使用するので Next を クリックしてください 53 ユーザIPの追加 (11) • シミュレーションのファイルを出力するか設定します – シミュレーションには ModelSim-SE, 又は ModelSim-PEが必要です – 今回は手元にないので、チェックをはずし Next をクリックします 54 ユーザIPの追加 (12) • ユーザIPの記述言語と合成フローを指定します – Generate stub ’user_logic’ template in Verilog instead of VHDL, Generate template driver files to help you implement software interface にチェックをつけます – Generate ISE and XST project files to help you implement the peripheral using XST flow のチェックを外します – チェックをつけると確認ダイアログがでますが, そのままOKをクリックしてください – 設定がおわると User Logic の色が変わります. Next をクリックしてください 色が変わる 55 ユーザIPの追加 (13) • 確認ウィンドウに切り替わるので Finish をクリックしてください 56 ユーザIPの追加 (14) • pcores フォルダ内に新しいフォルダが作成されます • ここからは直接ファイルを編集します User Logic と IFのHDLファイルを 置くフォルダ IPコア名 IPコアの設定ファイルを置くフォルダ User Logic (verilog) インタフェース (VHDL) 57 ユーザIPの追加 (15) • C:¥XilinxEDK_CCNT¥pcores¥sys_clk_cnt_ip_v1_00_a¥data にある sys_clk_cnt_ip_v2_1_0.mpd を編集します – sys_clk_in と cnt_num を追加し, 設定を加えます – EDKの File -> Open から開くと予約語に色がつくので編集しやすいでしょう 58 ユーザIPの追加 (16) • C:¥XilinxEDK_CCNT¥pcores¥sys_clk_cnt_ip_v1_00_a¥data¥hdl¥vhdl にある sys_clk_cnt_ip.vhd を編集します component に信号を追加 entity に信号を追加 59 ユーザIPの追加 (17) • 同様にポートにも信号定義を追加します 60 ユーザIPの追加 (18) • C:¥XilinxEDK_CCNT¥pcores¥sys_clk_cnt_ip_v1_00_a¥hdl¥verilog にある user_logic.v を編集します 61 ユーザIPの追加 (19) • clock counter の記述を行います 62 ユーザIPの追加 (20) • 次にプロジェクトにユーザIPを追加します – Hardware -> Create or Import Peripheral… を選択します – Welcome ウィンドウが開きますので Next をクリックしてください 63 ユーザIPの追加 (21) • Peripheral Flow ウィンドウになります – Import existing peripheral をチェックし Next をクリックします 64 ユーザIPの追加 (22) • Repository or Project ウィンドウになります – そのまま Next をクリックしてください 65 ユーザIPの追加 (23) • さきほど設定したユーザIPを指定します – Name : sys_clk_cnt_ip (プルダウンメニューから選択できる) – Use version にチェックをつけてください – Next を押すと確認ダイアログがでますので OK をクリックしてください 66 ユーザIPの追加 (24) • ソースファイルの種類を設定します – HDL source files にチェックをつけて Next をクリックしてください 67 ユーザIPの追加 (25) • HDLソースファイルの設定を行います 1 使用する言語を Mixed に設定 2 C:¥XilinxEDK_CCNT¥pcores¥sys_clk_cnt_ip_v1_00_a¥data¥sys_clk_cnt_ip_v2_1_0.pao を読み込むように設定 68 ユーザIPの追加 (26) • HDLの解析を行います(さきほど編集したファイルにエラーがないか確認 を行う. user_logic.v のチェックは行ってくれないことに注意!) 69 ユーザIPの追加 (27) • 編集したファイルにエラーがなければこのウィンドウが表示されます – OPB Slave にチェックをつけて Next をクリックしてください 70 ユーザIPの追加 (28) • Port の追加, Parameterの設定は共にデフォルトの値を 使用するので, Next をクリックしてください 71 ユーザIPの追加 (29) • 割り込み信号の設定を行います – 今回は割り込みを使わないので, Select and configure interrupt の チェックを外し, Next をクリックしてください 72 ユーザIPの追加 (30) • パラメータとポートの属性を設定します – 今回は行わないのでそれぞれ Next をクリックしてください 73 ユーザIPの追加 (31) • これでIPを追加する作業は終了です – Finish をクリックしてください 74 ユーザIPの追加 (32) • ユーザIPを読み込みます – EDKに切り替えて, IP Catalog タブをクリックしてください – Project Repository にさきほど設定したIPが追加されているので、 ダブルクリックしてください. 確認ダイアログがでるのでYesをクリック してください 75 ユーザIPの追加 (33) • 同様にopb_gpio を追加し, clk_cnt_ioにリネームします • 次に追加したIPのHDL合成を行います – Hardware -> Generate Netlist を選択してください 76 ユーザIPの追加 (34) • 追加したIPをバスに接続します – Filters の BusInterface をチェックしてください – Bus Connection をクリックし, mb_opb を選択してください mb_opbに接続されると 塗りつぶされる 77 ユーザIPの追加 (35) • Port を接続します – Filters の Ports にチェックを付けて、赤枠で囲った部分を 設定してください sys_clk_in を外部のクロックに接続 cnt_num を io に接続 78 ユーザIPの追加 (36) • IO Port を設定します – clk_cnt_io を右クリックし, Configure IP… を選択してください – Channel1 を指定し • Bi-directional : FALSE • Input Only : FALSE としてください 79 ユーザIPの追加 (37) • Base Address を設定します – Filters の Addresses にチェックをつけ, Size を64Kに設定してください – 次に追加したIP以外の Lock にチェックをつけ, をクリックします 3. アドレスを割り振る 1. Size を64Kに設定 2. 追加したIP以外のLockに チェックをつける 80 ユーザIPの追加 (38) • システムを更新し, 追加したIPのソフトウェアライブラリとヘッダを作成します – Device Configuration -> Updata Bitstream を選択してください – C:¥XilinxEDK_CCNT¥microblaze_0¥include 内に sys_clk_cnt_ip.h が作成され, xparameters.h に作成したIPのアドレスが 追加されます 81 ユーザIPの追加 (39) • 新たにソフトウェアプロジェクト system_clk_cnt を作成します – Mark to Initialize BRAMs チェックをつけて下さい – Sources を右クリックし Add New File… を選んで system_clk_cnt.c を作成してください • その他のプロジェクトは Mark to Initialize BRAMs チェックを外します クロック数を計測 この部分を計測 system_clk_cnt を作成し ソースファイルを作成する プログラムを 入力する 82 ユーザIPの追加 (40) • ターミナルソフトを起動してください • ビルドを行い, FPGAにデータを転送します – Device Configuration -> Download Bitstream を選択してください システムクロックは50MHz(20ns周期)なので 20 をかけると時間[ns]がわかる 最初のループと次のループ数は10倍違っている 約10倍くらいの速度差が確認できた 83 ここまでのまとめ • ユーザが独自に設計したIPを追加し、 ソフトウェアでコントロールしてみました • クロックカウンタを設計し, 実時間を計測できるようになりました • 課題: – さまざまなプログラムを動作させ、実行時間を計測してみましょう – ハードとソフトで実現し、両方の手法を速度(動作時間)と面積(ハード ウェアリソース)で比較してみましょう 84 ソフトウェアとハードウェアの比較 • FIRフィルタの設計 – FIR ディレクトリ以下を参照してください – 仕様: • • • • input タップ数は11 対照型フィルタとして設計 係数は適当に設定 (本当に動かすならきちんと設定しないといけません) ハードウェアは50MHz 以上で動作するように適時レジスタを追加して設計 レジスタ 定数乗算器 input + + Σ + Σ + + 85 演算時間の比較 • ハード+ソフトで約10倍高速化を実現 ソフトウェアのみでFIRを設計 ソフト+ハードでFIRを設計 86
© Copyright 2024 Paperzz