Xilinx MicroBlazeのチュートリアル

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