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