Altera FPGAのチュートリアル - HirokiNakaharaOboe.Net

Altera CycloneII評価ボードの
チュートリアル
九州工業大学 笹尾研究室
中原 啓貴
1
本ドキュメントの構成
1.
2.
3.
4.
QuartusII version 6.0の使用法
Altera DE2ボードの各パーツについて
Altera NiosIIの使用法
NiosIIと各パーツを用いたシステムの設計
事例
2
QuartusII version 6.0の使用法
3
QuartusII version 6.0の使用法
• Altera FPGAの設計フロー
• QuartusII の使用法
– デモンストレーションの合成と書き込み
– 加算器の設計
– シミュレーションツールの使用法
4
Altera FPGAの設計フロー
シミュレーション
Verilog (VHDL)ファイル
設計した回路が
仕様通りに動作するか
チェックを行います.
verilog をRTL部品に合成します. 次に, RTLを
FPGA上に配置・配線を行い, ネットリストを生成します.
ネットリスト
ネットリストから, FPGAに転送するデータ
(ビットストリーム)を生成します.
ビットストリーム
(コンフィギュレーションデータ)
FPGAにコンフィギュレーションデータを送ります.
5
DE2ボードのデモを動作させる(1)
•
•
•
デモを動作させます
CD-ROMの中の
¥DE2¥DE2_demonstrations¥DE2_Default
をフォルダごと適当な場所(C:¥など)にコピーしてください
QuartusIIのアイコンをダブルクリックしてQuartusIIを
起動します
QuartusIIのアイコン
6
QuartusIIを起動した直後は…
ファイルの操作・各コマンドの指示を行うアイコン
設計デザインの
各モジュールを表示
Verilog ファイルや
各ツールを表示する部分
実行中の
プロセスを表示
エラーや警告などのログを表示
7
DE2ボードのデモを動作させる(2)
• QuartusIIは各設計をプロジェクト毎に管理します
– 各プロジェクト毎にフォルダを作るといいでしょう
(同一フォルダに複数のプロジェクトがあると, エラーを引き起こす可能性がある)
•
サンプルデザインのプロジェクトを読み込みます
– File -> Open Projectをクリックしてください(図1)
– 先ほどコピーしたフォルダの中にあるDE2_Default.qpfを開いてください(図2)
図1:プロジェクトを開く
図2:DE2_Default.qpfを開く
8
DE2ボードのデモを動作させる(3)
設計対象のFPGA
(ボード上のFPGAと同じはず)
アイコンをクリックすることで
各種のコマンドを実行します
トップモジュール
クリック
コンパイル(RTL合成+配置配線+
コンフィギュレーションデータ作成)
を行う.
RTL合成のみ行う. 機能設計時は
配置配線を行う必要がないので,
こちらのコマンドを行うとよい.
タイミング解析を行う. タイミング
制約を決定するときに使う.
'+'をクリックすることで下位層モジュールを
見ることができます
シミュレーションを行う. ただし
セッティングが必要.
レポートを表示
プログラマ(書き込みツール)
を起動する
9
DE2ボードのデモを動作させる(4)
• コンフィギュレーションデータを作成します
– コンパイルアイコン
をクリックしてください
が表示されれば成功です!
現在実行中のプロセス
Analysis & Synthesis: RTLを合成
Fitter:
配置配線
Assemble:
Timing Analyzer: タイミング解析
10
DE2ボードのデモを動作させる(5)
• FPGAにコンフィギュレーションデータを転送します
– ボードに各線を接続してください
– 初めて書き込みを行う場合は, 各線を接続する前にByte Blasterを
インストールしてください
– ボードの電源スイッチをオンにしてください
(LEDや7SEGがピカピカするはず…)
付属のACアダプタ
スピーカの端子(変な音がでるので音量は小さめに!)
USB(パソコンに接続)
電源スイッチ
VGAケーブル
11
Byte Blasterのインストール
• DE2評価ボードは Byte Blaster 経由でPCから
書き込み(コンフィギュレーション)データを受け取ります
• Byte Blasterをインストールする必要があります
• 評価ボードの電源を入れ, USBケーブルを接続してください
– USBのデバイスインストールのウィンドウが開くので,
C:¥altera¥quartus60¥drivers¥usb-blaster にある usbblst.inf を指定してください
(Quartus を C:¥altera にインストールした場合)
12
DE2ボードのデモを動作させる(6)
• FPGAにコンフィギュレーションデータを転送します
• Programmerを起動してください
– メニューから起動(右図)
– アイコン をクリックして起動
13
DE2ボードのデモを動作させる(7)
No Hardwareの場合
Hardware Setup..をクリック
USB-Blasterを選択してClose
となればOK!
Programにチェック, その他のチェックは外す
全てが終わったら,
を押して
FPGAに書き込みを行って
ください
14
ここまでのまとめ
• DE2ボードのデモンストレーションを行って
合成(コンパイル)→書き込み(コンフィギュレーション)までを
行いました
課題:
• デモンストレーションフォルダにあるデモを
色々動作させてみましょう
(各フォルダには簡単な説明を記述したREADME.txtがある.)
15
加算器の設計(1)
• 簡単な加算器を設計し, ボードで動かします
• 仕様
–
–
–
–
8bit加算器 (8bit + 8bit = 9bit)
入力はディップスイッチ8個×2
入力と出力を7セグメントに表示
組合せ回路を verilog で記述
16
加算器の設計(2)
• QuartusIIを起動してください
• 今回はプロジェクトを新規に作ります
– File -> New Project Wizard をクリックしてください
– New Project Wizard Introduction が出ますので,
Nextをクリックしてください
File -> New Project Wizard
New Project Wizard Introduction
17
加算器の設計(3)
• プロジェクトを置くディレクトリを設定します
– 適当なディレクトリを指定してください
– What is the name of this project? でプロジェクト名を指定します
– What is the name of the top-level design dentity ...で
トップモジュールの名前を指定します
– すべて終わったら Next が有効になるのでクリックしてください
プロジェクトを置く
ディレクトリ
プロジェクト名
トップモジュール名
18
加算器の設計(4)
• 次に既存の verilog (VHDL) File を読み込むか聞かれます
• もし, 読み込む場合はファイルを指定して取り込んでください
(この作業は後からでもできます)
• 今回は新たに設計するので, Nextをクリックしてください
19
加算器の設計(5)
• ターゲットデバイスを指定します
• 今回のボードのFPGAは(Altera CycloneII EP2C35F672C6)
• ターゲットデバイスを指定したら, Nextをクリックしてください
Family (Cyclone,Stratixなど)を指定
FPGAのリスト
デバイス名はパッケージに
書かれていることが多い
ターゲットデバイスの条件
(ピン数,パッケージ等)を指定
指定するとFPGAのリストが
絞られる
20
加算器の設計(6)
• 他のベンダーのツールを指定します (図1)
• 最後に確認のウィザードが出ますので (図2)
Finishをクリックしてください
図1:他のベンダーのツールを指定
図2:確認ウィザード
21
加算器の設計(7)
• では, 加算器の verilog を記述しましょう
• ファイル新規作成アイコン をクリックし, Verilog HDL File
を選択してOKをクリックしてください
1.
2.
3.
22
加算器の設計(8)
• エディタが現れますので, 加算器を記述してください
• 記述が終わりましたら, 保存します
– デフォルトは先ほど指定したTopModule名ですが、ここでは敢えて
ファイル名とモジュール名を変更します!(よい子はそのまま・・ね)
2. 保存
アイコンを
クリック
1. verilogを
記述
3. ファイル名を指定 (トップモジュール名になってるはず)
23
加算器の設計(9)
• コンパイル を行ってください
• 正しいverilogが記述されトップモジュールの指定が正しく
行われていた場合, Full Compilation Successful が表示されます
• 今回はトップモジュール名が違うので・・・!
• というわけで、トップモジュールを指定し直しましょう
– Entity下のデバイス名を右クリック->Setting をクリックしてください
24
加算器の設計(10)
• Setting ウィンドウで設定をやり直します
– コンパイルオプションを指定したり, 先ほどの設定をすべて行える
1. General
をクリック
2. Top-level entity
のファイル選択をクリック
3. リストから
トップモジュール名を
指定し, OK をクリック
25
加算器の設計(11)
•
Full Compilation Successful
が表示されましたか?
• 次にピン配置を行います
– Assignments -> Assignment Editor をクリックしてください
26
加算器の設計(12)
• Assigment Editor が起動するのでピン配置を行います
– To の下をダブルクリックすると が現れるので,
クリックして Node Finder を選択してください
27
加算器の設計(13)
• FilterでPins: unassigned を指定し, Listをクリックします
• ピン配置を行いたいNodeを指定し をクリックしてください
• 右のSelected NodesにコピーされるのでOKをクリックしてください
1. Filter を設定
2. Listを表示
4. ピン配置を行いたい 5. OK で Assignment
Node をコピー
Editor に転送
3. ピン配置を行いたい
Node を選択
28
加算器の設計(14)
• To の部分にNode Finderで選択したNodeが表示されます
• Assignment Name でLocation を選択してください
• CD-ROMの¥DE2¥DE2_lab_exercisesに
ピン名を記述したDE2_pin_assignment.csv があります
– Value の部分に選択したNode に割り当てたいピン名を入力してください
1. ピンを割り当てたい
Nodeが表示される
3. ピン名を入力
2. Locationを指定
面倒くさいわ
ピン名を記述したファイル
29
加算器の設計(15)
• ピンを1本づつ割り当てていると時間がかかるので…
まとめて設定しましょう!
– Assignments -> Import Assignments をクリックしてください(図1)
– File name で先ほどのDE2_pin_assignment.csvを読み込んで
OKをクリックしてください(図2)
ここをクリックして
DE2_pin_assignment.csvを指定
図1:Import Assignments
図2:ファイル名の設定と読み込み
30
加算器の設計(16)
• Verilog で記述した端子名とピン名が一致していれば
ピン名を個別に割り当てる必要はありません!(これは便利♪)
– そうでなければ個別に配置していきましょう・・・
ピン名が表示される
31
加算器の設計(17)
• 再度コンパイル を行ってください
• 後は"DE2ボードのデモを動作させる"で説明した
FPGAへの書き込み を行えば・・・
1001 0101
1100 0010
32
ここまでのまとめ
• プロジェクトの作成から書き込み(コンフィギュレーション)まで
を行いました
– 初期設定・ピン配置を新たに行いました
– 8bit 加算器の設計を行いました
課題:
• 加算器の記述を書き換えていろいろな加算器を
作ってみましょう!
– PUSHボタンで入力を増減させて, 他のPUSHボタンで演算という
電卓もどきをつくるのもいいでしょうね(順序回路の記述が必要)
33
シミュレーションツールの使用法(1)
• 設計した回路が仕様通り動くのか検証が必要です
• バグを発見するためにもシミュレーションが必要
• シミュレータの使い方を覚えましょう!
• 余裕があればModelSim Altera も覚えるとよい
– 高度な検証が可能 (複雑なテストベンチをverilogで記述できる, テス
トデータをファイル経由で扱える)
– シミュレーションが高速
– NiosIIの標準シミュレータ
– Xilinx FPGAのシミュレータとしても仕様可
– Alteraでも期間限定試用バージョンがでた!?
34
シミュレーションツールの使用法(2)
• シミュレータツールを起動します
– Processing -> Simulator Tool を起動してください
35
シミュレーションツールの使用法(3)
• シミュレータツールが起動します
– 行いたいシミュレーションを選択してください
Functional: 機能(論理)シミュレーション
遅延のシミュレーションを行わないので高速.
まず、このシミュレーションを行って
論理記述の誤りを検証するとよい
Timing: タイミング(遅延)シミュレーション
遅延を含めたシミュレーションを行う.
ハザード(レースやメタステーブルなど)を
検証することができる.
Timing using Fast Timing Model:
Timingを高速に行えるが、正確さに欠ける?
(あまり使わないのでよくわかりません・・)
(注) Functional シミュレーションを行う場合は, シミュレーションの度に
"Generate Functional Simulation Netlist" をクリックして仮ネットリストを作ってください!
36
シミュレーションツールの使用法(4)
• 初めてシミュレーションを行う場合, シミュレーション入力波形
を作成します
各種時刻の表示
•
をクリックしてください
各動作の
アイコン
入出力Node
の表示
シミュレーション波形表示部
37
シミュレーションツールの使用法(5)
• まず, 入出力Nodeを入力します
– Nameの空いてる部分をダブルクリックすると,
下図のウィンドウが表示されます
– Node Finder でシミュレーションで扱いたい入出力ノードを選択しましょう
(Filterを変えることで様々なNodeを選択できる)
1. 空いている部分を
ダブルクリック
2. Node Finderを
クリック
38
シミュレーションツールの使用法(6)
• 入力Nodeに波形を割り当てます
– 波形を割り当てたい部分を選択してください
Node全てを選択したい場合
Node名をクリック
Nodeの一部だけを選択したい場合
選択したい部分をドラッグ
で選択部分を拡大・縮小できます
39
シミュレーションツールの使用法(7)
• 入力Nodeに波形を割り当てます
– 選択部分を右クリックしてValueを選び, 割当てたい値を入力してください
Forcing Low: 論理値0を割当て
Forcing High: 論理値1を割当て
Invert : 選択範囲の論理値を反転する
Count Value: 指定した間隔でカウントした値を
割当て. カウント値はBinaryとGrayを選択可
Clock: クロックを割り当てる. 周期を指定.
Arbitrary Value: 指定した区間に任意の値を
割り当てる.
Random Value: 指定した区間にランダムな値を
割り当てる.
40
シミュレーションツールの使用法(8)
• 先ほどの加算器にCount Valueを割り当てたのですが...
桁が大きすぎて二進数表示では見えません.
• 表示を変えてみましょう
– 波形の上で右クリック -> Properties をクリックしてください
Radix(基数)を
Hexadecimal に変更
16進数表示にすると見えました!
41
シミュレーションツールの使用法(8)
• 入力した波形を保存し, シミュレータウィンドウを選択します
• さきほどの波形ファイルを読み込み
を押せば
シミュレーションが開始されます
波形ファイルの
読み込み
シミュレーション期間の設定
End simulation at: を指定すると
決められた時間まで
シミュレーションを行う
42
シミュレーションツールの使用法(9)
• シミュレーションが成功すると"Simulation Successful"が
表示されます
–
をクリックしてください. シミュレーション結果を見ることができます
43
ここまでのまとめ
• シミュレーションツールを使いました
• 波形の割当て方, 様々なシミュレーションを行いました
• 課題:
– 順序回路のシミュレーションを行い, FunctionalとTimingシミュレー
ションの違いを確認してみましょう.
ハザードがある場合はそれを直してください.
– ModelSim を使ってみましょう. 使い勝手, シミュレーション速度,
能力を確認してみましょう.
44
Altera DE2ボードの
各パーツについて
45
Altera DE2ボードの各パーツについて
•
•
•
•
•
•
•
•
•
LED
7Segment Display
Push Switch
Dip Switch
SRAM
LCD
VGA Controller
Audio Codec Chip
SD Card
46
LED
• 赤と緑の二種類があります
• 正論理(Hでオン, Lでオフ)
47
7Segment Display
• 7bit入力 (小数点の部分は未使用)
• 負論理(Hでオフ, Lでオン)
• CD-ROM¥DE2¥DE2_Default内のSEG7_LUT.vを参考に
するとよいでしょう
– 4bitの16進数を入力して, 7bitにデコードする回路
x 未使用
48
Push Switch と Dip Switch
• Push Switch (4個)
– 負論理(押されるとL, 押されてないときH)
PUSH!
– チャタリング対策が必要!?
• Dip Switch (18個)
– 正論理(バーが上にあるとH, バーが下にあるとL)
49
SRAM
• 容量は512KByte (18入力16出力)
• 50MHzで動作可
• 非同期動作(クロック不要)
16
SRAM_DQ: SRAMのデータ信号線
18
SRAM_ADDR: SRAMのアドレス信号線
SRAM_UB_N: 上位バイト(8bit)データのマスク
(H: 上位8byteを無効, L: 有効)
SRAM_LB_N: 下位バイト(8bit)データのマスク
(H: 下位8byteを無効, L: 有効)
SRAM_CE_N: SRAMチップセレクタ (負論理)
SRAM_WE_N: 書き込みイネーブル (負論理)
(L: 書き込み, H:読み込み)
SRAM_OE_N: 出力イネーブル (負論理)
50
SRAM読み出し回路の記述例
初期設定:
CE_N, LB_N, UB_NをL
WE_NをH
CLOCK
読み出しアドレス
SRAM_ADDR
H
SRAM_WE_N
次のクロック:
データを読み出し
SRAM_OE_N
SRAM_LB_N
SRAM_UB_N
SRAM_CE_N
SRAM_DQ
最初のクロック:
アドレスをセット
OE_NをLにする
L
読み出しデータ
inout のverilog 記述
assign SRAM_DQ = ( SRAM_WE_N == 1'b0) ? WDATA : 16'hzzzz;
51
SRAM書き込み回路の記述例
初期設定:
CE_N, LB_N, UB_NをL
OE_NをH
CLOCK
書き込みアドレス
SRAM_ADDR
SRAM_OE_N
H
次のクロック:
WE_NをLにしてデータ書き込み
SRAM_WE_N
SRAM_LB_N
SRAM_UB_N
SRAM_CE_N
WDATA
最初のクロック:
アドレスをセット
WE_NをHにする
L
書き込みデータ
inout のverilog 記述
assign SRAM_DQ = ( SRAM_WE_N == 1'b0) ? WDATA : 16'hzzzz;
52
LCD
•
•
•
16 x 2 キャラクター表示
256種類の文字を表示可能 (デフォルトのデータはASCIIコードと同じ!)
初期化が必要
LCD_RW: 読み書きイネーブル信号
(H: LCDから読み込み,L: LCDへ書き込み)
LCD_EN: イネーブル信号
LCD_RS: レジスタ選択信号(L: 命令,H: データ)
LCD_DATA[7:0]: データ信号
LCD_ON: LCDオン信号(Hでオン)
LCD_BLON: バックライト信号(Hでオン)
53
LCD書き込み回路の設計例
CLOCK
LCD_RS
L:命令/ H:データ
LCD_R/W
LCDは応答速度が遅いので
数μsec かけて転送すると
安定して動作しました
LCD_EN
LCD_DATA[7:0]
書き込みデータ
LCDには各命令毎に
応答速度が決まっています
(数msecオーダの場合も!)
54
LCDのアドレス
• 7ビットを使用 (LCD_DATA[7]はドント・ケア)
• DDRAMに表示データを格納する
(DDRAMを書き換えれば表示を変えることができる)
55
代表的な命令
LCD_RS
LCD_RW
LCD_DATA[7:0]
Cursor or Display Shift
カーソルの移動(S)とディスプレイの
シフト(R)を行う
0 0 0 0 0 1 S R *
* 39μs
Display ON/OFF Control
ディスプレイ(D)とカーソルのON/OFFを設定
(C:カーソル,B:点滅するかどうか)
Clear Display
ディスプレイをクリアする(DDRAMをクリア)
Entry Mode Set
カーソル(I)とシフト(S)の設定
Set DDRAM Address
DDRAMのアドレス(A)を設定
Write Data to RAM
DDRAMにデータ(D)を書き込む
0 0 0 0 0 0 1 D C B 39μs
0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
1.53
ms
I H 39μs
0 0 1 A A A A A A A 39μs
1 0 D D D D D D D D 43μs
56
LCDの初期化
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 1 1 1 0 0 0
3
8
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 1 1 0 0
0
6
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 0 0 0 0 0 0 0
8
ディスプレイをクリア
1
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 1 1 0
0
ディスプレイをONにする
C
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 0 0 1
0
カーソルとディスプレイシフトを行う
0
入力モードをセット
(カーソルは使わない)
DDRAMアドレスを00にセット
57
VGA Controller
• 640x480を描画 (RGBの各色成分は10ビット)
• バッファメモリを使用 (M4Kで実現)
• VGA DACチップは25.2MHzで動作 (PLLを使用)
VGA_CLK: VGA DACチップのクロック(25.2MHz)
VGA_BLANK: ブランク(空白)信号(H:描画 L:空白)
VGA_HS:垂直同期信号
VGA_VS:水平同期信号
VGA_SYNC: 同期信号(常にLでよい!?)
10
VGA_R:赤成分信号
10
VGA_G:緑成分信号
10
VGA_B:青成分信号
58
画面データと同期信号
HS
VS
800
640
16
480
Display Time
(BLANK = H)
11
525
32 2
96 48
Blanking Time (BLANK = L)
*数字は25.2MHzクロックのカウント数
59
VGAコントローラの設計例
60
バッファメモリの構成
FPGA内部のM4Kをバッファメモリとして使用
メモリ量節約のため, 80x60ドットの画像を拡大して表示
色成分は2bitに圧縮(64色に圧縮)
アドレス(13bit)
0000000000000
色データ(6bit)
0000000000010
60
Y:480 (=60 x 8)
X: 640 (=80 x 8)
80
0000000000011
0000000000100
1111111111111
メモリのアドレス = { Y[8:3], X[9:3]}
61
Audio Codec Chip
•
•
•
•
•
18.2MHzで動作(PLLを使用)
48khz~8000hzのサンプリングレートに対応
データ幅は16ビット/ステレオ
LINE INやMIC INを増幅してデジタル化することもできる
今回はDAC のみ使用
– データはシリアル通信で転送
AUD_ADCLRCK:左右のイネーブル信号入力(今回は未使用)
AUD_ADCDAT:データ信号入力(シリアル)
AUD_DACLRCK:左右のイネーブル信号出力
(H:右データ L:左データ)
AUD_DACDAT:データ信号出力(シリアル)
AUD_XCK: Codec Chip用クロック(18.2MHz)
AUD_BCLK: データストリームクロック
62
Audio Codec Chipのタイミングチャート
• DAC(48khz/16bit/stereo)として使用する場合
– FPGAからデータを送って音を出力
1/f = 1/48000
AUD_BCLK
AUD_DACLRCK
right data = 16bit
15
AUD_DACDAT
14
13
left data = 16bit
0
15
14
0
15
1/f = 1/48000
16bitに量子化
16bit 2の補数表現
right
left
63
Audio Playerの設計例
• 神の声ジェネレータ
○×*Σ◎〒
μ!!
48KHz x 16bit x stereo では
データ量が大!
1.2KHz x 8bit x mono
のデータを展開する
○×*Σ◎〒
μ!!
64
サンプリングとデータの変換
• 12000hz x 4 = 48000hz なので, 4回同じ波形を出力
• 8bitのデータは16bitに拡張
• monoデータを左右両方に送って擬似stereoにする
1/48000
1/12000
16bit
8bit
12000hz
8bit
mono
48000hz
16bit
stereo
65
タイミングチャート
1/f = 1/12000
1/f = 1/48000
AUD_BCLK
AUD_DACLRCK
AUD_DACDAT
同じデータストリームを8回送信する
8bit データを16bitに変換
16bit_data = { 2'b00, 8bit_data, 6'b000000}
ダウンスケーリング誤差による
ピークの変動が激しいため2bit 0を詰めました
66
SD Card
•
•
•
•
•
最高10MHz前後で動作 (バラツキのためこの数値は曖昧)
SPIモードとSD Cardモードがある
4本の信号線でデータをやりとりする(SPIモード)
カードの初期化が必要
データの読み書きはブロック単位(1ブロック=512Byte)
SD_DAT:SDカードからのデータ信号線
SD_DAT3:SDカード選択信号
SD_CMD:送信コマンド信号線
SD_CLK: SDカードへのクロック
67
SDカードとMMCカード
• SDカードはMMCカードの上位互換(SDカードコネクタには
MMCカードも挿入可)
• どちらもSPIモードに切り替えることができる
(同じプロトコルでアクセスできる)
(SDモード/SPIモード)
(MMCモード/SPIモード)
68
信号の接続
SD_DAT
SD_CLK
SD_CMD
SD_DAT3
69
SDカードのコマンドとレスポンス
• コマンド長は6Byte(5Byte:コマンド, 1Byte:CRC)
• N_CR:コマンド応答時間
• レスポンスの読み出し: DOを読み取って"0"を読み取る
70
代表的なコマンド
71
シングルブロックの読み出し
72
SDカードの初期化の手順
1ms待つ
DI→Hにして74clock送信
CS→LにしてCMD0を送る
(CMD0を受け取ったときにCSがLであれば
SPIモードに移行). CRCは0x95に設定
0x00を受け取ればCMD0は成功.
次にCMD1を送る.(SDカードはACMD41の
ほうがよい?)
0x01
レスポンスが…
0x00
初期化完了
73
WAV File Playerの設計例
Audio Codec
コントローラは
先ほどの回路を
流用
12000hz/
8bit/monoデータを
SDカードに保存
FPGAにバッファメモリと
シーケンサを実装
74
Altera NiosIIのチュートリアル
75
Altera NiosIIのチュートリアル
• NiosIIを組込んだシステムの設計フロー
• NiosII を動かしてみよう
– SOPC Builderの使用法
– NiosII IDEの使用法
• Nios II を拡張してみよう
• Model Simを用いたNiosIIのシミュレーション
76
Nios II を組込んだシステムの設計フロー
Nios II
Memory
I/O
DCT
Core
JTAG
Timer
システム設計
SOPC Builder
を使って
システムを構成します
ハードウェア設計
Quartus II
を使って
システムのハードウェアを設計
します
ソフトウェア設計
Nios II IDE
を使って
設計したハードウェアで動かす
ソフトウェアを設計します 77
Nios II を動かしてみよう(1)
• まずプロジェクトを作成します
– 適当なディレクトリを作成し、プロジェクトを作成してください
– ターゲットデバイス:EP2C35F672C6
• 次にSOPC Builderを使ってNiosII を生成します
– Tools -> SOPC Builder をクリックしてください
78
Nios II を動かしてみよう(2)
• システム名を聞かれますので、好きな名前を入力してください
– ここではNiosII_Coreとしておきます
– Target HDL はverilogにチェックをつけてください
– 全て終われば OK をクリックしてください
79
Nios II を動かしてみよう(3)
• SOPC Builderが起動します
– 以下の設定を確認してください
Clock を設定します
'clk', 'External', '50.0'
になってるか確認してください
ターゲットボードを指定します
今回は'Unspecified Board',
Device Familyは'Cyclone II'
にします
80
Nios II を動かしてみよう(4)
• Nios II をシステムに追加します
– Avalon Components -> Nios II Processor をダブルクリックしてください
– Nios II/e にチェックをつけて Finish をクリックしてください
1. Nios II Procesorをダブルクリック
2. Nios II/e にチェックをつける
81
Nios II を動かしてみよう(5)
• Nios II がシステムに追加されました.
• 次にデバッグ用にJTAG-UART を追加します
– Communication -> JTAG UART をダブルクリックしてください
– ウィンドウが開きますので, Finishをクリックしてください
1. JTAG UART をダブルクリック
82
Nios II を動かしてみよう(6)
• メモリをシステムに追加します
– Memory -> On-Chip Memory をダブルクリックしてください
– Total Memory Size に"16"を入力してFinishをクリックしてください
1. On-Chip Memory をダブルクリック
2. Total Memory Sizeを"16"Kbyteにする
83
Nios II を動かしてみよう(7)
• I/Oポートをシステムに追加します
– Other -> PIO (Parallel I/O) をダブルクリックしてください
– 何も変えずにFinishをクリックしてください
1. PIO をダブルクリック
84
Nios II を動かしてみよう(8)
• PIOの名前を変えてみましょう
– pio_0を右クリックし, Renameを選択してください(図1)
– "LEDG"と入力してください(図2)
図2: LEDGと入力
図1: Renameを選択
85
Nios II を動かしてみよう(9)
• Base Addressを設定します
• 組み込みシステムは各機器にレジスタを割り当てて
直接レジスタを読み書きすることで各機器をコントロールします
• SOPC Builder はこれらのアドレスを Base Addressを
使って管理します
• Base Addresはコンポーネントを追加するたびに
自動で設定することができます
– System ->
Auto-Assign Base Addresses
をクリックしてください
86
Nios II を動かしてみよう(10)
• Baseアドレスが更新されます
• この作業はコンポーネントを追加・削除するたびに
必ず行ってください!
87
Nios II を動かしてみよう(11)
• System Generation タブをクリックします
• Simulation にチェックが入っているのを確認し,
Generate をクリックしてください
1. System Generation タブをクリック
2. ModelSim のプロジェクトを生成する
チェックが入っているか確認
3. Generate をクリック
88
Nios II を動かしてみよう(12)
• ExitをクリックしQuatrusIIに戻ります
• ここからは生成したVerilog をQuartus II で合成し
FPGAのダウンロードデータを生成します
• 評価版はNios IIのverilogを直接読み書きできないので
回路図エディタから設計します
– File -> New をクリックし, Block Diagram/Schematic File を選択し
てください
89
Nios II を動かしてみよう(13)
– 回路図エディタをダブルクリックしてください
– シンボルウィンドウが開くので Libraries -> Project -> NiosII_Coreを
選択し OKを押します(NiosII_Coreは先ほど指定したシステム名です)
1. 回路図エディタをダブルクリック
2. Libraries->Project->NiosII_Coreを選択
3. シンボル図が現れる
4. OKをクリック
90
Nios II を動かしてみよう(14)
• Nios II を適当な場所に配置し, 入力ピンを接続します
– 空き部分をダブルクリックし, Symbol ウィンドウを開きます
– Libraries->c:/altera/quartus60/..->primitives->pin->inputを選択し
てください
1. ダブルクリック
2. pin -> inputを選択
91
Nios II を動かしてみよう(15)
• clk の線にピンの端がつながるように配置してください
• 同様に入力ピンをreset_nに接続します
– ピンを選択して, Copy -> Paste で貼り付けることもできます
92
Nios II を動かしてみよう(16)
• 出力にもoutputピンを接続してください
• ピンの名前と信号線幅を設定します
– pin_name (clkに接続しているピン)を右クリックし,
Propertiesを選択します(図1)
– Pin PropertiesウィンドウのPin nameに"CLOCK_50"を入力します(図2)
図1:Propertiesを選択
図2: ピンの名前を設定
93
Nios II を動かしてみよう(17)
• 同様にKEY[0](reset_nへ), LEDG[7..0](outputへ)
を設定します
• 回路図エディタでは複数ビット幅を[n..0]で指定します
(verilog では [n:0]signalで指定していました)
KEY[0]に設定
LEDG[7..0]に設定
94
Nios II を動かしてみよう(18)
• 回路図を保存し, コンパイルを行います
(おそらくトップモジュールとして認識するため, デフォルトの
保存名がトップモジュール名.bdfになるはず)
• コンパイル終わったらピンをFPGAに割り当ててください
(加算機の設計で説明した方法で)
• ピン配置が終わったら, もう一度コンパイルを行ってください.
コンパイルが成功すれば, QuartusIIを使ったハードウェアの
設計は終わりです!
• 次は NiosII IDEを使ってソフトウェアを設計していきましょう
95
Nios II を動かしてみよう(19)
• Nios II IDE を起動します
– work space の場所を確認してくるので OK を選択します
– work space とはプロジェクトやライブラリを置くディレクトリのことです
• 初めにプロジェクトを作成します
– File -> New -> Project を選択します
96
Nios II を動かしてみよう(20)
2. プロジェクト名を設定します
(ここでは"sample_project"とします)
3. 先ほど設計したシステムを読み込みます
1. C/C++ Application
を選択してください
Browse をクリックして先ほど
Quartus II 上で設計した
プロジェクトの
フォルダ内の**.ptfを指定
4. "Hello World Small"を選択
5. Finish をクリック
97
Nios II を動かしてみよう(21)
• まず, ビルドを行ってシステムライブラリを構築します
1. 右クリック -> Build project を選択してください
98
Nios II を動かしてみよう(22)
• 以下のように hello_world_small.c を変更してください
99
Nios II を動かしてみよう(23)
• 入力が終わりましたら, コードを保存 してください
• そしてもう一度ビルドを行ってください
– やりかたはさきほどと同じです
• ビルドが完了したら左にあるC/C++ Project タブ内の
system.h をダブルクリックしてください
100
Nios II を動かしてみよう(24)
• system.h の中身が真ん中のエディタ部に表示されます
• PIO_0_BASE はSOPC Builder で設定したLEDにアクセス
するためのアドレスです
• system.h をインクルードすることでこれらの変数にアクセス
できます
101
Nios II を動かしてみよう(25)
• では実際に FPGA 上で動作させてみましょう
• まず, Nios II を含むコンフィギュレーションデータをFPGAに
転送しなければなりません
– Tools -> Quartus II Programmer を選択してください
– Programmer が起動しますので Add File.. で **.sofを選択し,
Program にチェックをつけてから Start をクリックします
4.
1.
3.
2.
102
Nios II を動かしてみよう(23)
• あとはソフトウェアをFPGAに転送すればおしまいです!
– プロジェクト名を右クリック -> Run As -> Nios II Hardware を選択し
てください
103
Nios II を動かしてみよう(23)
• もしエラーが出る場合はJTAGの設定が行われていないかも
しれません
– Run -> Run.. をクリックしてください
– Runウィンドウが起動しますのでUSB-Blasterが選択されているか
確認し, Runボタンをクリックしてください
104
ここまでのまとめ
• SOPC Builder, Quartus II, Nios II IDEを使ってNios IIを設
計し, 簡単なプログラムを動作させました
• ブロック図エディタを使ってシステムを設計しました
• 課題:
– プログラムを改造してLEDをいろいろ点滅させてみましょう
105
Nios II を拡張してみよう(1)
• LEDだけでは面白くないので7SEGを使ってみます
• Quartus II を起動し, さきほど設計したプロジェクトを開き
SOPC Builder を起動してください
Quartus II を起動
SOPC Builder を起動
106
Nios II を拡張してみよう(2)
• 左のコンポーネントリストから以下のものを追加してください
– PIO: output, 32bit -> SEVEN_SEGMENT にRename
– PIO: input, 18bit -> DPSW に Rename
• 追加し, Renameが終わったら, ベースアドレスを更新します
– System -> Auto-Assign Base Addressesを選択してください
• System Generation タブをクリックし, Generate をクリックし
てください. SOPC Builder での作業はおしまいです.
107
Nios II を拡張してみよう(3)
• QuatrusII に戻り, NiosII の回路図を右クリックして
Update Symbol or Block を選択してください
108
Nios II を拡張してみよう(4)
• Nios II が更新されます. 新しいポート名がさきほどSOPC
Builder で設定したポート名になっているか確認してください
• ポートの接続を行ってください. ただし, SEVEN_SEGMENT
の接続だけは行わないでください.
109
Nios II を拡張してみよう(5)
• 加算機の設計でも述べましたが、7SEGは4bitの数値データを
入力して7ビットのSegmentデータに変換する回路が必要です
• "加算機の設計"で使用した 7segmentのデータに変換する
verilog を現在のプロジェクトにコピーしてください
– CD-ROM¥DE2¥DE2_demonstrations¥DE2_Default にある
SEG7_LUT.v, SEG_LUT.v をコピーしてもよい
• 次にこれらのファイルをプロジェクトに取り込みます
– Entity を右クリック -> Settings ->Files -> Add All を選択してください
110
Nios II を拡張してみよう(6)
• verilog ファイルを開き, 回路図に変換します
– ファイルを開くアイコン
をクリックし, SEG7_LUT_8.vを開いてください
• SEG7_LUT_8.v がエディタに現れている状態で
– File -> Create/Update -> Create Symbol Files for Current File を選
択してください
111
Nios II を拡張してみよう(7)
• 再びNios IIを設計している回路図を開きます
• 空きスペースをダブルクリックすると・・
Project 内に先ほどの verilog の回路図が追加されている!
112
Nios II を拡張してみよう(8)
• このモジュールをNios IIに接続し, ピンを接続してください
– 出力ピン名を7SEGと同じ名前にするとピン割当てが不要になる!
• verilog を書き直した場合, 該当するブロックを右クリックし
Update Symbol or Block を選択すれば更新できます
113
Nios II を拡張してみよう(9)
•
•
•
•
再度コンパイルを行ってください
次はソフトウェアの設計します
Nios II IDE を起動してください
新規プロジェクトを作成します
– プロジェクト名: SEGMENT
– CPU: さきほど設計したディレクトリにある***.ptfを選択
– テンプレート: hello world small
• プロジェクトを作成したら、ビルドを行ってください
114
Nios II を拡張してみよう(9)
• 以下のプログラムを入力して動作させてみましょう
– 動作:Programmer でNios IIをFPGAに転送、Run を行う
115
ここまでのまとめ
• Nios II にverilog で設計した回路を組込み動作させました
• 入出力を扱ってみました
• 課題:
– プログラムを改造して7SEGの表示をいろいろ変えてみましょう
116
おわりに
• 本ドキュメントに対する質問・要望、およびバ
グを見つけたら
nakahara at aries01.cse.kyutech.ac.jp
まで連絡をください
117