xilinx社spartan 3e starter kit を使った micro blazeの...

86
1 XilinxSpartan 3E Starter Kit を使った Micro Blazeのチュートリアル 九州工業大学 笹尾研究室 中原 啓貴

Upload: dangphuc

Post on 05-May-2018

223 views

Category:

Documents


1 download

TRANSCRIPT

1

Xilinx社 Spartan 3E Starter Kit を使った Micro Blazeのチュートリアル

九州工業大学

笹尾研究室

中原

啓貴

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をクリックしてください

12

簡単なMicro Blaze の設計(9)• 内部IPの追加ウィンドウが開きます

• そのままNextをクリックしてください

13

簡単なMicro Blaze の設計(10)• ソフトウェアの設定を行います

• そのままNextをクリックしてください

– 一応サンプルアプリケーションは残しておくことをお勧めします

(初めて作成したプロジェクトは一度合成を行う必要があり、

何かアプリケーションを置いておかないと合成が上手くいかないか

ら!?)

14

簡単なMicro Blaze の設計(11)• 初期化プログラムをどこに置くか聞いてきますので

Nextを押します(Peripheral Testも同様に)

15

簡単なMicro Blaze の設計(12)• システムの設計は完了です

• そのままGenerateをクリックしてください(図1)

• 次にFinishをクリックしてください(図2)

図1:System Created 図2:Finish

16

簡単な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

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にします

50

ユーザIPの追加 (7)• 作成したIPを接続するバスを指定します

– On-chip Periperal Bus にチェックをつけて

Next をクリックしてください

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 とします

53

ユーザIPの追加 (10)• バスとIP間の制御信号の設定を行います

– 今回はデフォルトで用意されている信号を使用するので Next をクリックしてください

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 をクリックしてください

色が変わる

56

ユーザIPの追加 (13)• 確認ウィンドウに切り替わるので

Finish をクリックしてください

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 に信号を追加

60

ユーザIPの追加 (17)• 同様にポートにも信号定義を追加します

61

ユーザIPの追加 (18)• C:¥XilinxEDK_CCNT¥pcores¥sys_clk_cnt_ip_v1_00_a¥hdl¥verilog にある

user_logic.v を編集します

62

ユーザIPの追加 (19)• clock counter の記述を行います

63

ユーザIPの追加 (20)• 次にプロジェクトにユーザIPを追加します

– Hardware -> Create or Import Peripheral… を選択します

– Welcome ウィンドウが開きますので

Next をクリックしてください

64

ユーザIPの追加 (21)• Peripheral Flow ウィンドウになります

– Import existing peripheral をチェックし

Next をクリックします

65

ユーザIPの追加 (22)• Repository or Project ウィンドウになります

– そのまま Next をクリックしてください

66

ユーザIPの追加 (23)• さきほど設定したユーザIPを指定します

– Name : sys_clk_cnt_ip (プルダウンメニューから選択できる)– Use version にチェックをつけてください

– Next を押すと確認ダイアログがでますので OK をクリックしてください

67

ユーザIPの追加 (24)• ソースファイルの種類を設定します

– HDL source files にチェックをつけて

Next をクリックしてください

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を読み込むように設定

69

ユーザIPの追加 (26)• HDLの解析を行います(さきほど編集したファイルにエラーがないか確認

を行う. user_logic.v のチェックは行ってくれないことに注意!)

70

ユーザIPの追加 (27)• 編集したファイルにエラーがなければこのウィンドウが表示されます

– OPB Slave にチェックをつけて

Next をクリックしてください

71

ユーザIPの追加 (28)• Port の追加, Parameterの設定は共にデフォルトの値を

使用するので, Next をクリックしてください

72

ユーザIPの追加 (29)• 割り込み信号の設定を行います

– 今回は割り込みを使わないので, Select and configure interrupt の チェックを外し, Next をクリックしてください

73

ユーザIPの追加 (30)• パラメータとポートの属性を設定します

– 今回は行わないのでそれぞれ Next をクリックしてください

74

ユーザIPの追加 (31)• これでIPを追加する作業は終了です

– Finish をクリックしてください

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

86

演算時間の比較

• ハード+ソフトで約10倍高速化を実現

ソフトウェアのみでFIRを設計 ソフト+ハードでFIRを設計