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
© Copyright 2024 Paperzz