9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DE0-Nano-SoC (Atlas-SoC)でNios iiを動かす

Last updated at Posted at 2016-02-06

概要

terasicのFPGAボードDE0-Nano-SoCで、AlteraのソフトコアであるNios iiを動かす手順です。
Nios iiでスイッチに接続したParallel IOのInputを監視して、内容によってLEDに接続したOutputの1/0を切り替えて点灯させるプログラムを動かします。

Atlas-SoCについてはAtlas-SoC素晴らしいんじゃないのを参照。
Atlas-SoCについて大雑把に説明するとARMのCPU(Cortex-A9)とFPGA(Cyclone V)が乗ったSoCと、ひととおりのペリフェラルが載ったボードです。$99とXlinksのZynqよりもお手頃。
terasicの購入ページではAtlas-SoCとDE0-Nano-SoCがありますが、ハードは同様でSDカードの中身が異なるだけなのでどちらを買っても良いです。私はAtlas-SoCがOut of StockだったためDE0-Nano-SoCの方を注文しました。

プロジェクトの準備

Quartus Prime 15.1 Lite Edition, SoC EDS 15.1をインストールしておきます

SDカードにはAtlas-SoCを焼いておきます
http://rocketboards.org/foswiki/view/Documentation/AtlasSoCSdCardImage

DE0-Nano-SoC CD-ROMをダウンロード
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=941&PartNo=4

DE0-Nano-SoC CD-ROMを解凍した中にあるTools/SystemBuilder/DE0_Nano_SoC_SystemBuilder.exeを起動します。
2016-02-06.png
CLOCK, LED, Button, Switch, Arduino Headerにチェックを入れ、こんな感じでGenerateします。

GenerateするとDE0_NANO_SoC_NIOS2.qpfができるので、開くとQuartus Primeが立ち上がります。

Qsys

Quartus PrimeのメニューからTools→QsysでQsysを開きます。

IPの追加

まず、Nios IIを追加します。左側に表示されているIP Catalogから、Nios II Processorをダブルクリック。
Nios II ProcessorはLibrary -> Processors and Peripherals -> Embedded Processorsの中にあります。
タブのMainでNios II/eを選択し、右下のFinishを押す。

次にメモリを追加します。メモリはOn-Chip Memory (RAM or ROM)という名前です。
IP Catalogの中のLibrary -> Basic Function -> On Chip Memory の中にあります。
Sizeを16384 bytesに設定し、右下のFinishを押す。

次に、Parallel IOを追加します。Parallel IOはPIO(Parallel I/O)という名前です。
IP Catalogの中のLibrary -> Processors and Peripherals -> Peripheralsの中にあります。
InputとOutputが必要なので、合計2つ必要となります。
まずOutputから追加します。
Basic Settingsの中のWidthを1にし、DirectionをOutputにします。その後右下のFinishを押す。
次にInputを追加します。
こちらも同様にBasic Settingsの中のWidthを1にし、DirectionをInputにします。その後右下のFinishを押す。

最後に、JTAG UARTを追加します。
IP Catalogの中のLibrary -> Interface Protocols -> Serial -> JTAG UARTにあります。
なにも設定を変えず、そのままFinishを押します。

接続

2016-02-06 (1).png
こんな感じになるように、白丸をポチッとクリックすると黒丸になって接続されます。

次にIOの接続をします。
pio_0, pio_1のexternal_connectionのExportの欄に、それぞれout_port_from_pio_0,in_port_to_pio_1といれます。

アドレスの設定

メニューのSystem->Assign Base Addressを選択すると、良い感じにBase Addressが設定されます。
その後、nios2_gen_2_0をダブルクリックし、タブのVectorsでReset Vector memoryをonchip_memory2_0.s 1に、Exception vector memoryもonchip_memory_2_0.s 1に変更。

HDLの生成

メニューのGererate->Generate HDL...を選択し、Generateをクリック。
VerilogかVHDLかはおこのみで。私はVerilogを選択しました。

Generateが終わったら、メニューのGenerate->Show Instantiation Templateを選択し、表示されているExample HDLをメモしておきます。
ここまでできたらQsysを保存しQuartus Primeに戻ります。

合成

Quartus Primeに戻り、左に表示されているProject Navigatorの表示をHierarchyからFilesに変更する。
Filesを右クリックし、Add/Remove Files in Projectを選択。出てきたウィンドウでAdd Allをクリック。
image
こんな感じにファイルが追加されていれば問題無いです。

次に、DE0_NANO_SOC_NIOS.vを編集します。
REG/WIRE declarationsの下に、以下のコードを追加します。

wire RSTN = KEY[0];

Structural codingの下に、先ほどメモしたExample HDLをコピーします。

    nios2 u0 (
        .clk_clk                    (<connected-to-clk_clk>),                    //                 clk.clk
        .in_port_to_pio_1_export    (<connected-to-in_port_to_pio_1_export>),    //    in_port_to_pio_1.export
        .out_port_from_pio_0_export (<connected-to-out_port_from_pio_0_export>), // out_port_from_pio_0.export
        .reset_reset_n              (<connected-to-reset_reset_n>)               //               reset.reset_n
    );

()の中を、適切なピンに変更します。
変更後は以下のようになるはずです。

    nios2 u0 (
        .clk_clk                    (FPGA_CLK1_50),                    //                 clk.clk
        .in_port_to_pio_1_export    (SW[0]),    //    in_port_to_pio_1.export
        .out_port_from_pio_0_export (LED[0]), // out_port_from_pio_0.export
        .reset_reset_n              (RSTN)               //               reset.reset_n
    );

メニューから、Processing->Start Compilationを選択します。
私の環境(Intel Xeon E3-1220v3)では約3分くらいで終了しました。

最後に、FPGAに回路を書き込みます。
メニューから、Tools->Programmerを選択します。
image
こんな感じになっていればOKです。DE-SoC [USB-1]となっていないときはUSB BlasterのUSBポートが接続されているか確認してください。
左のStartを押すと、回路が書き込まれます。

次はNios II上で動くプログラムを書くために、Nios II Software Building Tools for Eclipseを使います。
メニューから、Tools->Nios II Software Building Tools for Eclipseを起動します。

Nios II プログラムの作成・実行

メニューから、File->New...を選択します。
Target hardware informationのSOPC Information File nameに、Qsysで作成された.sopcinfoファイルを選択します。
Project TemplateはHello Worldを選択します。
image
こんな感じになります。Finishを押しましょう。

プロジェクトhelloの中の、hello_world_small.cを編集します。

#include "sys/alt_stdio.h"
#include "system.h"

int main()
{ 
  while (1) {
	  int reg = *(volatile unsigned long *)PIO_1_BASE;
	  *(volatile unsigned long *)PIO_0_BASE = reg;
  }

  return 0;
}

ひたすら入力(PIO_1_BASE)の値を出力(PIO_0_BASE)に反映し続けるというプログラムになっています。

いよいよプログラムを実行します。
プロジェクトhelloを右クリックし、Run As -> Nios II Hardwareを選択します。
target connectionタブで、デバイスが接続されていることを確認してください。
image
右下のRunボタンを押すと、FPGAへのプログラムのダウンロードと実行が開始します。
LED0の点灯状態ががSW0の操作によって切り替われば成功です。うまくいかない場合はKEY0を押してNios IIをリセットしてみましょう。

お疲れ様でした。

参考

DE1-SoCでNios IIプロセッサからLEDを制御する
DE1-SoCはDE0-nano-SoCの上位版のようなボードで、大いに参考にさせていただきました。

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?