Article header nios2header beginner  7

FPGA に Nios® II を入れてLチカ!(ハードウェア編)

Article header hanako 25x25  11

こんにちは、インテル・アルテラ・ハナコ です。
今回の FPGA でLチカは、インテル® の MAX® 10 FPGA に “Nios® II を入れてLチカ” です。

Article header img02  2

以前ご紹介した HDL でLチカと同じで、基板上のプッシュボタン(PB0)を押したときだけ LED0 が点灯し、PB0 を離すと消灯します。

こんな感じ →→→

ただ今回のLチカは、FPGA に組み込んだ Nios® II にLチカするプログラムを実行させて実現します。

Article header cb 03  1

用意するもの

ここからは、評価ボードに Mpression 製 Odyssey(オデッセイ)MAX® 10 FPGA 評価キットを使ってご案内します。

Article header img03  2

USB-microUSB ケーブル
(PC と Odyssey 接続用)
Quartus® Prime
ライト・エディション

(有償エディションでもOK)

基板上の プッシュボタン/FPGA/LED の接続構成はこんな感じ

Article header img04 1  3

今回 Nios® II でLチカを実現するには、作業が大きく2つあります。

  •  FPGA に Nios® II を組み込む
  •  Nios® II に実行させるプログラム(C言語)を作る

Lチカ動作は HDL 言語だと簡単に書けてしまえますが、今回はあえて Nios® II を使ってみましょう。(これが Nios® II を採用したシステム開発への第一歩です!)



早速 Quartus® Prime でハードウェア設計スタート!

インテル® デバイスの開発環境 Quartus® Prime を使って、FPGA/CPLD の一般的な開発フロー に基づいて作業を進めます。

1. Qsys で Nios® II と周辺回路を設計する

プロジェクトを作ります。その後 Qsys(Tools メニュー > Qsys)を起動して Nios® II プロセッサと周辺のペリフェラルを作ります。
今回作る Qsys システム構成はこんな感じ。

Article header img05 1  1

 
では作っていきましょう!
 

1-1. Nios® II Processor を追加します。
Qsys の左上にある IP Catalog から “Nios II Processor” を選び、コアのタイプから Nios® II/e を選択します。

Article header img06  2


1-2. On-Chip Memory を追加します。
同様に、IP Catalog から On-Chip Memory (RAM or ROM) を選び、図のように設定します。


Article header img07  2


1-3. PIO(入力/出力)を追加します。
IP Catalog から PIO(Parallel I/O) を選び、バス幅と入出力属性を指定します。PB0 用、LED0 用の2つ PIO を作ります。

Article header img08  3


1-4. JTAG UART を追加します。
printf デバッグをするため、パソコンと JTAG インタフェース(USB-Blaster II 経由)で UART 通信する JTAG UART を作ります。


Article header img09  3

Article header img10  2


1-5. 各コンポーネントの名前を変更します。
System Contents タブの Name 欄で Rename をします。こんな感じにしてみました。

1-6. 各コンポーネントを接続します。
Connections 欄の白丸をクリックして黒丸(接続)に変更します。
こんな感じでつなぎます。

Article header img11  1


1-7. 割り込みポートを接続します。
JTAG_UART の Interrupt Sender と Nios® II Processor の Interrupt Receiver を上図のように接続します。値は優先順位を示しますが、今回は割り込みが1本なので0のままにします。


1-8. 作成した Nios® II の Reset Vector と Exception Vector を、図のように設定します。

Article header img12  2

1-9. 作成した PIO の入力・出力信号を Qsys の外部に Export します。

Article header img13  2


1-10. ベース・アドレスが重複のないように設定します。
Qsys の System メニュー > Assign Base Address を実行すると、ベース・アドレスが自動的に適切な値に設定されます。


1-11. これで Qsys システムは完成です。File メニュー > Save As… で名前を付けて、.qsys ファイルを保存します。

Article header img14  1


1-12. Qsys 画面の右下にある [Generate HDL] ボタンをクリックし、Qsys システムのモジュールを生成します。
  • Syntesis
    Quartus® Prime でコンパイルするときの論理合成用の HDL 言語を指定します。
  • Simulation
    シミュレーション用モデルのHDL言語を指定します。

今回は VHDL で設計するので “VHDL” を選択しています。

[Generate] ボタンをクリックし、Qsys システム・モジュールの生成が終了します。


2. FPGA のデザインを完成させる

Article header img15  2


2-1. 最上位階層の HDL デザインに Qsys システムを組み込みます。
最上位階層デザインへインプリしやすいように Qsys システムが保存されているフォルダ内にインスタンス補助ファイル(*_inst.vhd)があるので、コピペ&編集で接続を完了させます。
例えばこんな感じです。
library ieee;
use ieee.std_logic_1164.all;

entity led_press_button_nios2 is
 port (
    CLK   : in std_logic;
    PB0   : in std_logic;
    LED0   : out std_logic
    );
end led_press_button_nios2;

architecture rtl of led_press_button_nios2 is

 component nios2_system is
  port (
     button_pio_external_connection_export   : in std_logic;
     clk_clk   : in std_logic;
     led_pio_external_connection_export   : out std_logic
     );
 end component nios2_system;

 signal  button_wire  : std_logic;
 signal  wire_led  : std_logic;

begin
 button_wire <= not PB0;

 nios2: nios2_system
 port map (
      clk_clk => CLK,
      button_pio_external_connection_export => button_wire,
      led_pio_external_connection_export => wire_led
       );

 LED0 <= not wire_led;

end rtl;

2-2. HDL デザインと Qsys システムを Quartus® Prime のプロジェクトに登録します。
Project メニュー > Add/Remove Files in Project において、作成した HDL デザインと Qsys システム .qip ファイルを登録します。

Article header img16  2

3. 論理シミュレーションをする

4. 制約を設定する

4-1. ピンアサインを設定します。
「FPGA ではじめてのLチカ!」の作業3-1 をご覧ください。

4-2. コンフィギュレーション・モードを選択します。
「FPGA ではじめてのLチカ!」の作業3-2 をご覧ください。

4-3. タイミング制約を設定します。
Qsys 作成時に自動生成された SDC ファイルが、qip ファイルの登録(作業2-2)と同時に TimeQuest Timing Analyzer 設定画面(Assignments メニュー > Settings)に自動セットされます。 また、今回のデザインは50MHzのクロックで動作する仕様なので、クロック定義のコマンドを記述した SDC を別途作成し、プロジェクトに追加登録します。本来は、ユーザー I/O ピンのタイミング制約も必須ですが、入力信号(PB0 を人が押す・離す)も出力信号(LED0 が点灯・消灯)も超低速なので、I/Oのタイミング制約は省略します。

Article header img17  2

5. コンパイルをする

6. タイミング検証する

コンパイル・レポート内の TimeQuest Timing Analyzer フォルダを展開して、各タイミング・モデルがクロック周波数50MHzの条件をクリアしたことが確認できます。

Article header img18  2

7. プログラミングする

「FPGA ではじめてのLチカ!」の作業6 をご覧ください。
Programmer の Progress バーが100%になったらデータ転送完了です。

Article header img19  1

Article header hanako 25x25  12

(ここまでがハードウェアの開発です。)
ハードウェアの回路データは FPGA に転送されましたが、内部の Nios® II が実行するためのプログラムがまだありません。だから、Odyssey の PB0 を押しても もちろん LED0 はうんともすんとも言いません。

続いて、Nios® II に実行させるためのソフトウェアの開発 をしましょう。


Article header cb line top  3

Article header img01  3

Nios® II とは、“FPGA に入れられるプロセッサ” のようなものです。
プロセッサと言っても Nios® II の場合は FPGA 内部に CPU のチップが内蔵されているわけではなくて、ユーザーが作った論理回路を実現するために使用されるロジック・エレメント(通称 LE)で構築する “ソフトコアのプロセッサ” です。自分の必要なペリフェラル(機能)だけをつないで構築して FPGA に組み込めますし、1つの FPGA に Nios® II を複数組み込むこともできます。また、組み込む器(デバイス・ファミリ)によってパフォーマンスも変わります。要はカスタマイズできる(ソフトコア)プロセッサです。
Nios® II は Fast(Nios® II/f)と Economy (Nios® II/e)の2タイプで、性能が異なります。ちょっとしたマイコンレベルの処理で高速さを求めないのであれば、Nios® II/e は無償で使用できて、無償の Quartus® Prime ライト・エディションでも使用できますので、手軽に気軽に Nios® II を採用することができます。また Nios® II/f も通常は有償ですが、評価用として “OpenCore Plus” と言う環境が用意されています。OpenCore Plus については、MACNICA フォーラムのコチラの投稿内容 をご覧ください。
その他の Nios® II に関する情報は、メーカーのホームページ をご覧ください。
また、Nios® II の無償ワークショップについては、こちらをご覧ください。

Article header cb line btm  5

おすすめ記事はこちら

関連商品

関連タグ