Upload
dangphuc
View
223
Download
1
Embed Size (px)
Citation preview
2
はじめに
• 本ドキュメントは
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も習得しておくことが望ましい)
両方のバージョンが一致しないとEDKが起動しません!
3
ドキュメントの内容
• 簡単なMicro Blaze の設計– EDKの使い方の習得
• 既存IPの追加– LEDをCでコントロール
– IPの追加法を習得
• ユーザIPの追加
– クロックカウンターを追加
– Import/Create IPの使い方を習得
• ソフトウェアとハードウェアの比較– FIRフィルタを設計し, ハード・ソフト混在システムを設計
– ハードとソフトの速度を計測
4
簡単なMicro Blaze の設計(1)• ここでは簡単なMicro Blazeを設計し, EDKの使い方を覚えます
• をダブルクリックしてEDKを起動してください
• プロジェクトを作成し, Micro Blaze の設定を行います
– Base System Builder wizardをチェックしOKを押してください
5
簡単なMicro Blaze の設計(2)• プロジェクトを置く場所とプロジェクト名を指定します
• Project fileに直接入力するか, Browseで指定してください– プロジェクトディレクトリ: C:¥XilinxEDK– プロジェクト名: system.xmp
• ディレクトリを指定したら, OKをクリックしてください
6
簡単な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
• 指定が終わったらNextをクリックしてください
8
簡単なMicro Blaze の設計(5)• 次にFPGAとプロセッサを指定します
• StarterKitはFPGAとプロセッサが決まっているのでここでは 何もおこないません. そのままNextをクリックしてください
9
簡単なMicro Blaze の設計(6)• ここからはMicro Blazeの設定を行います
– メインメモリがデフォルトでは
8KByteと少ないので, 32KBtyeに増やしておきます
– その他は変更しません
– 設定が終わったらNextをクリックしてください
10
簡単な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
• 設定が終わったらNextをクリックしてください
13
簡単なMicro Blaze の設計(10)• ソフトウェアの設定を行います
• そのままNextをクリックしてください
– 一応サンプルアプリケーションは残しておくことをお勧めします
(初めて作成したプロジェクトは一度合成を行う必要があり、
何かアプリケーションを置いておかないと合成が上手くいかないか
ら!?)
15
簡単なMicro Blaze の設計(12)• システムの設計は完了です
• そのままGenerateをクリックしてください(図1)
• 次にFinishをクリックしてください(図2)
図1:System Created 図2:Finish
17
簡単なMicro Blaze の設計(14)• Platform Studioが起動します(図1)• この時点で C:¥XilinxEDK フォルダ(図2)を見るとわかるのですが、
まだMicroBlazeのHDLファイルとCのテンプレート・ヘッダが生成されて
いません. この時点で設計を行うと上手くいきません!!
図1:Platform Studio
図2:C:¥XilinxEDK
18
簡単な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フォルダ、及び直下のディレクトリの
ファイルを閉じてください
(ビルド時にファイルを削除・追加するので、フォルダや
ファイルを開いていると操作できなくてビルドが終わらない)
プログラムのサイズ
ヘッダーフォルダ
20
簡単な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: ソフトウェアプロジェクトの追加
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… を選択図3: ソースファイル名を指定
22
簡単なMicro Blaze の設計(19)• Sources に tutorial.c が追加されます
– C:¥XilinxEDK¥tutorial.c をダブルクリックするとエディタが起動する
ので, 以下のプログラムを入力して保存
してください
Xilinx 専用のライブラリ. printfでは
メモリ量が多すぎる!
改行は¥r¥n
23
簡単なMicro Blaze の設計(20)• プロジェクトをBuild して, Bitstreamを生成します
– Software -> Build All User Applications (図1)– Device Configuration -> Update Bitstream (図2)
以上の順で操作を行ってください
図1: プロジェクトのビルド図2: Bitstreamの作成
24
簡単な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 … を選択し
上記のように設定
26
簡単なMicro Blaze の設計(10)• FPGAに書き込みます
– Device Configuration -> Download Bitstream を選択してください
– ターミナルに表示されます!
プログラムの停止(FPGAをクリア)
リセット
27
ここまでのまとめ
• EDKの使い方を習得しました
– プロジェクトの作成法
– 初期設定の方法
– ソフトウェアプロジェクトの作成法
– 簡単なプログラムの実行方法
• 課題:– tutorial.c をいろいろ改造して、ターミナルに表示させてみましょう
28
既存IPの追加(1)• ここでは、前回設計したシステムに既存のIPを接続し、
ソフトウェアでコントロールする方法を習得します– Starter Kit の LEDを接続してみましょう
– C:¥XilinxEDK をコピーしてC:¥XilinxEDK_LED を作成します
Xilinx_EDK をコピー(中身は同じ)
29
既存IPの追加(2)• EDK を起動します
• コピーした
C:¥XilinxEDK_LED¥system.xmpを開きます– 初のプロジェクトウィンドウでは
Cancel を選択
– メインウィンドウが起動するので
File -> Open Project… を選択し,
C:¥XilinxEDK_LED にある
system.xmpを開いてください
30
既存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を選択
図2: 確認ダイアログ
図3: gpioがシステムに追加される
31
既存IPの追加(4)• 追加したIPをバス(OPB)に接続します
– FiltersのBus Interface にチェックを入れ,Bus Connection にある
opb_gpio_0 の No Connection をクリック
してください
– プルダウンメニューの中から
mb_opb を選択します
• opb_gpio_0をクリックして
LED_8bitにリネームしてください
IPがバスに接続されると
緑色で塗りつぶされる
32
既存IPの追加(5)• 次にポートの接続を設定します(バスに接続した個々の信号
線を設定すると思えばよい)– FiltersのPortsをチェックし, LED_8bitにある
GPIO_d_outのNetを
クリックして, プルダウンメニューから
LED_8bit_GPIO_d_outを選択
してください
(選択はメニューを選んで、どこか他の部分をクリックす
ると行われることに注意!)
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: FALSEChannel 1 is Input Only: FALSE
8
34
既存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を選択
仮のアドレスが表示されたらクリック仮のアドレス
36
既存IPの追加(9)• Clean Netlist を行い, Update Bitstream を行って
ハードウェアとソフトウェアを一度に更新します
(なぜかClean Netlistを行わないと更新できない…何で!?)
37
既存IPの追加(10)• C:¥XilinxEDK_LED¥microblaze_0¥include内にある
xparameters.h を開いてみてください– LED_8BITのアドレス定義が追加されています!
このアドレスに値を書けばLEDを
コントロールできます
38
既存IPの追加(11)• 次にFPGAピンをLEDに接続します
– Projectタブを選択し, UCF File をダブルクリックします
– ピン配置ファイル(**.ucf) に以下の内容を記述します
– ピン名はさきほどのExternal Ports名を指定, ピンの位置はデータシート
(Spartan3E Starter Kit Board User Guide を参考に)
39
既存IPの追加(12)• Clean Netlist を行い, Update Bitstream を行って
ハードウェアとソフトウェアを一度に更新します– なぜかこの手順(更新→.ucfを後から編集→更新)で行わないと
エラーがでる…
40
既存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ポートに値を書き込む関数
ベースアドレス, オフセット, 値
42
既存IPの追加(15)• プログラムの入力が終わったら保存しFPGAに書き込みます
– Device Configuration -> Download Bitstream を選択してください
(Build Project や Update Bitstream を同時に行ってくれる)
LEDが交互に点滅します!
43
ここまでのまとめ• EDKにあらかじめ用意されているIPを追加しました
• 課題:– このシステムはあらかじめ, Dip SwitchとPush Button が接続され、
設定も済んでいる
– gpio_l.h には関数XGpio_mReadReg(BaseAddress, RegOffset)が用意されており, ベースアドレスをこれらのスイッチのアドレスに設定すれば
ボードのスイッチを操作できる
– スイッチからLEDを操作できるようにプログラムを改造せよ
(ソースコードだけ改造すればできる)
44
ユーザIPの追加 (1)• ここではユーザが独自に設計したオリジナルのハードウェア
をMicro Blazeに接続し, 動かしてみます
• なお、追加するにあたって– ユーザが設計したハードは正しく動作する(ハードを設計しながら
Micro Blazeを設計してるととても非効率!)– ユーザのハードはVerilogで記述されている
ことを前提に説明を行っていきます
MicroBlaze
clock counter
FPGA
今回はこの部分を設計
OPBバス
clk cnterI/O
clock
45
ユーザIPの追加 (2)• C:¥XilinxEDK_CCNT フォルダを作成し, 前回設計した
C:¥XilinxEDK_LED フォルダの中身をコピーしてください
• EDK を起動し, Cancel を選んでください
• File -> Open Project でさきほどコピーした C:¥XilinxEDK_CCNT にある
system.xmp を開きます
46
ユーザIPの追加 (3)• ユーザIPを追加します
– Hardware -> Create or Import Peripheral… を選択してください
– Welcomeウィンドウが開きますので, Next をクリックしてください
47
ユーザIPの追加 (4)• 次に新規に作成するか, 既存のIPを読み込むか聞いてきます
– 今回は新規に作成するので Create templates for a new peripheral にチェックをつけて
Next をクリックしてください
48
ユーザIPの追加 (5)• 作成したIPを格納する場所を指定します
– デフォルトはプロジェクトの
pcores フォルダに作成されます
– 今回はデフォルトで指定されている場所に格納します
– そのまま Next をクリックしてください
今回はここに格納される
49
ユーザIPの追加 (6)• ユーザIPの名前とバージョンを指定します
– Name に sys_clk_cnt_ip と入力し, Next をクリックしてください
– 今回はバージョンの設定をデフォルトの
1.00.aにします
51
ユーザIPの追加 (8)• バスとユーザIP間のインタフェースを設定します
– S/W reset and MIR, User logic interrupt support のチェックを外します
– User logic S/W register support にチェックをつけます
52
ユーザIPの追加 (9)• ユーザIPのレジスタを設定します
– Number of software accessible registers: 1– Data width of each register: 32 bit とします
54
ユーザ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 をクリックしてください
色が変わる
57
ユーザIPの追加 (14)• pcores フォルダ内に新しいフォルダが作成されます
• ここからは直接ファイルを編集します
IPコア名IPコアの設定ファイルを置くフォルダUser Logic と
IFのHDLファイルを
置くフォルダ User Logic (verilog)インタフェース
(VHDL)
58
ユーザ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 から開くと予約語に色がつくので編集しやすいでしょう
59
ユーザIPの追加 (16)• C:¥XilinxEDK_CCNT¥pcores¥sys_clk_cnt_ip_v1_00_a¥data¥hdl¥vhdl にある
sys_clk_cnt_ip.vhd を編集します
entity に信号を追加
component に信号を追加
61
ユーザIPの追加 (18)• C:¥XilinxEDK_CCNT¥pcores¥sys_clk_cnt_ip_v1_00_a¥hdl¥verilog にある
user_logic.v を編集します
63
ユーザIPの追加 (20)• 次にプロジェクトにユーザIPを追加します
– Hardware -> Create or Import Peripheral… を選択します
– Welcome ウィンドウが開きますので
Next をクリックしてください
66
ユーザIPの追加 (23)• さきほど設定したユーザIPを指定します
– Name : sys_clk_cnt_ip (プルダウンメニューから選択できる)– Use version にチェックをつけてください
– Next を押すと確認ダイアログがでますので OK をクリックしてください
68
ユーザ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を読み込むように設定
72
ユーザIPの追加 (29)• 割り込み信号の設定を行います
– 今回は割り込みを使わないので, Select and configure interrupt の チェックを外し, Next をクリックしてください
75
ユーザIPの追加 (32)• ユーザIPを読み込みます
– EDKに切り替えて, IP Catalog タブをクリックしてください
– Project Repository にさきほど設定したIPが追加されているので、
ダブルクリックしてください. 確認ダイアログがでるのでYesをクリック
してください
76
ユーザIPの追加 (33)• 同様にopb_gpio を追加し, clk_cnt_ioにリネームします
• 次に追加したIPのHDL合成を行います– Hardware -> Generate Netlist を選択してください
77
ユーザIPの追加 (34)• 追加したIPをバスに接続します
– Filters の BusInterface をチェックしてください
– Bus Connection をクリックし, mb_opb を選択してください
mb_opbに接続されると
塗りつぶされる
78
ユーザ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• Input Only : FALSE としてください
80
ユーザ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のアドレスが
追加されます
82
ユーザ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倍くらいの速度差が確認できた
84
ここまでのまとめ• ユーザが独自に設計したIPを追加し、
ソフトウェアでコントロールしてみました
• クロックカウンタを設計し, 実時間を計測できるようになりました
• 課題:– さまざまなプログラムを動作させ、実行時間を計測してみましょう
– ハードとソフトで実現し、両方の手法を速度(動作時間)と面積(ハード
ウェアリソース)で比較してみましょう
85
ソフトウェアとハードウェアの比較• FIRフィルタの設計
– FIR ディレクトリ以下を参照してください
– 仕様:
• タップ数は11
• 対照型フィルタとして設計
• 係数は適当に設定 (本当に動かすならきちんと設定しないといけません)• ハードウェアは50MHz 以上で動作するように適時レジスタを追加して設計
Σ
レジスタ 定数乗算器
+
+
+
+
+
Σ
inputinput