こんにちは。
マクニカでインテル® FPGA の技術サポートをしている インテル・F・ハナコ です。
今回の "インテル® FPGA でLチカ" は
Nios® II ソフトコア・プロセッサー の登場です!
[関連情報] インテル® FPGA の Nios® II プロセッサー
基板上のプッシュボタンを押したときだけ LED が点灯し、プッシュボタンを離すと消灯する、
この動作を Nios® II ソフトコア・プロセッサー (以下 Nios® II) におこなわせます。
※ HDL 言語の論理回路だけで L チカさせる方法は、こちら のコンテンツをご覧ください。
■ 用意するもの
今回の開発環境は、これらを使用します。
Quartus® Prime Standard Edition
または Lite Edition (無償)
&
Nios II Software Build Tools for Eclipse (※)
Questa* - Intel® FPGA Edition
または
Questa - Intel FPGA Starter Edition (無償)
※ Nios® II Software Build Tools の利用には、Windows Subsystem for Linux と Eclipse のインストールが必要です。
詳細は、こちらのコンテンツ をご覧ください。
■ 開発ボードの接続構成
プッシュボタン [S1] と LED [LED0] は、基板上で図のような接続構成になっています。
(※ その他、プッシュボタン [S2] をシステムのリセット信号として使用します。)
「プッシュボタンを押したら LED が点灯して、プッシュボタンを離すと LED が消灯する」
この動作を Nios® II にさせるためには、作業が大きく2つあります。
✔ FPGA に Nios® II を組み込む
✔ Nios® II に実行させるプログラム (C 言語) を作る
今回の L チカ動作は HDL 言語だと簡単に書けてしまえますが、今回はあえて Nios® II を使ってみましょう。
(これが Nios® II を採用したシステム開発への第一歩です!)
■ 作業ステップ
今回のサンプルプロジェクトでは、以下の作業をおこないます。
- Platform Designer で Nios® II と周辺回路を設計する
- FPGA のデザインを完成させる
- RTL レベル・シミュレーションをする
- 制約を設定する
- コンパイルをする
- タイミングを検証する
- FPGA にハードウエア・デザインをダウンロード
- Nios II Software Build Tools for Eclipse によりソフトウエアをシステムで実行する (Part 2 のページへ)
- Nios® II のブートプログラムを FPGA のオンチップ・メモリに組み込む (Part 2 のページへ)
各作業へのショートカットは、上記または画面左側の項目をクリックしてご利用ください。
大まかな開発の流れは、インテル® FPGA の開発フロー をご覧ください。
1. Platform Designer で Nios® II と周辺回路を設計する
1-1. Quartus® Prime プロジェクト作成
Quartus® Prime の下記メニューを選択し、プロジェクトを作ります。
File ➤ New Project Wizard
ここでは、プロジェクト名と最上位エンティティー名を presspb_led_nios2 に設定します。
ターゲットデバイスは、MAX® 10 FPGA 開発キットの 10M50DAF484C6GES を選択します。
1-2. Nios® II システムを作成
Quartus® Prime の下記メニューから Platform Designer を起動して、Nios® II プロセッサーと周辺回路を作ります。
Tools メニュー ➤ Platform Designer
今回サンプルプロジェクトで作成する Nios® II システム構成は、下図のとおりです。
また、 Nios® II のブートメモリーおよび実行メモリーは、On-Chip RAM とします。
1-2-1.
Nios® II Processor を追加します。
Platform Designer の左上にある IP Catalog から Nios II Processor を選び、コアのタイプから Nios II/e を選択します。
([Finish] ボタンをクリックすると追加されます。)
Messages タブ内にエラーが表示されますが、ここではこのまま進みます。
1-2-2.
On-Chip Memory を追加します。
Nios® II と同様に、IP Catalog から On-Chip Memory (RAM or ROM) Intel FPGA IP を選び、下図のように設定します。
それ以外はデフォルトのまま [Finish] ボタンをクリックします。
1-2-3.
PIO を追加します。
IP Catalog から PIO(Parallel I/O) Intel FPGA IP を選び、バス幅と入出力属性を指定します。
プッシュボタン用の PIO と LED 用の PIO を作ります。
1-2-4.
JTAG UART を追加します。
printf デバッグをするため、パソコンと JTAG インターフェース(USB-Blaster™ II 経由)で UART 通信する JTAG UART Intel FPGA IP を作ります。
デフォルト設定のまま [Finish] ボタンをクリックします。
1-2-5.
各コンポーネントの名前を変更します。
System Contents タブの Name 欄で Rename をします。
サンプルデザインでは、下表のとおりにします。
変更前の名称 | 変更後の名称 |
nios2_gen2_0 | nios2_cpu |
onchip_memory2_0 | onchip_memory |
pio_0 | pb_pio |
pio_1 | led_pio |
jtag_uart_0 | jtag_uart |
1-2-6.
Connections 欄の白丸をクリックして黒丸(接続)に変更し、各コンポーネントを接続します。
サンプルプロジェクトでは、下図のように接続します。
1-2-7.
割り込みポートを接続します。
JTAG_UART の Interrupt Sender と Nios® II Processor の Interrupt Receiver を上図のように接続します。
値は優先順位を示しますが、今回は割り込みが1本なので0のままにしIます。
1-2-8.
Nios® II の Reset Vector / Exception Vector を設定します。
サンプルプロジェクトでは、Nios® II のブートメモリーと実行メモリーを On-Chip RAM(onchip_memory)にするため
Nios® II の Reset Vector と Exception Vector を下図のように設定します。
1-2-9.
リセット信号と PIO を Nios® II システムの外部に Export します。
clk_0 の clk_in_reset の Export 欄をダブルクリックし、ポートを作成します。
pb_pio および led_pio の external_connection の Export 欄をそれぞれにダブルクリックし、ポートを作成します。
1-2-10.
ベース・アドレスが重複のないように設定します。
下記メニューを実行すると、ベース・アドレスが自動的に適切な値に設定されます。
Platform Designer の System メニュー ➤ Assign Base Address
1-2-11.
これで Nios® II システムの完成です。
File メニュー ➤ Save As… で名前を付け qsys ファイルを保存します。
サンプルプロジェクトでは、nios2_system.qsys として保存します。
1-2-12.
Nios® II システムのモジュールを生成します。
[Synthesis] Create HDL design files for synthesis: |
Quartus® Prime でコンパイルするときの論理合成用の HDL 言語を指定します。 |
[Simulation] Create simulation model: |
シミュレーション用モデルのHDL言語を指定します。 |
[Output Directory] Path: |
ファイルを生成するフォルダーを指定します。 (サンプルプロジェクトではデフォルトのままにします。) |
Platform Designer 画面の右下にある [Generate] ボタンをクリックし、モジュールを生成します。
ファイルの生成が完了し Generate Completed ウインドウを [Close] ボタンで閉じた後、Platform Designer の右下にある [Finish] ボタンをクリックし、Platform Designerを閉じます。
以下のウインドウが表示されますので、内容を確認し [OK] ボタンをクリックします。
(※ この記載内容は、操作2-2. で実施します。)
2. FPGA のデザインを完成させる
2-1. Nios® II システムをユーザーデザインにインプリメント
最上位階層の HDL デザインに Platform Designer で作成したシステムモジュールを組み込みます。
最上位階層デザインへ組み込みやすいように Platform Designer で作成した Nios II システムが保存されているフォルダー内に、インスタンス補助ファイル(*_inst.vhd / *_inst.v)があるので、コピペ & 編集で接続を完了させます。
例えばこんな感じです。
VHDL トップデザイン サンプル記述 Verilog HDL トップデザイン サンプル記述
File メニュー ➤ Save As… でファイル名を付け保存します。
このサンプルプロジェクトでは、presspb_led_nios2.vhd / presspb_led_nios2.v として保存します。
2-2. デザインを登録
HDL デザインと Nios® II システムを Quartus® Prime のプロジェクトに登録します。
Project メニュー ➤ Add/Remove Files in Project
作成した最上位の HDL デザイン (presspb_led_nios2.vhd または presspb_led_nios2.v) と、Nios® II システムの .qip ファイルを登録します。
同様に、あとで NativeLink で RTL シミュレーションを実行するために、Nios® II システムの .sip ファイルも登録しておきましょう。
なお
.qip は、Platform Designer で作成したモジュール用フォルダー/synthesis 内にあります。
.sip は、Platform Designer で作成したモジュール用フォルダー/simulation 内にあります。
<関連 FAQ> .sip ファイルとはどのようなファイルですか?
2-3. エラボレーション実行
Processing メニュー ➤ Start ➤ Start Analysis & Elaboration を実行します。
3. RTL レベル・シミュレーションをする
RTL シミュレーションを実行し、動作確認をします。
下表を参考に、シミュレーションを実施したい内容に応じて情報を参照してください。
実施するシミュレーションの内容 |
参照する情報 |
Nios® II のソフトウェア動作を除いた プロジェクトデザイン全体のハードウェア動作のみをシミュレーションする | |
Platform Designer のシステムモジュールのみを使用して、Nios® II のソフトウェア動作をシミュレーションする | |
Nios® II のソフトウェア動作を含むプロジェクトデザイン全体をシミュレーションする |
なお このサンプルプロジェクトは、
3番目の ″Nios® II のソフトウェア動作を含むプロジェクトデザイン全体をシミュレーションする″ フローでご案内します。
3-1. ソフトウエア・プロジェクトを作成
事前に Quartus® Prime プロジェクト・フォルダー内に、ソフトウエア・プロジェクト用のワークスペース (フォルダー) を手動で作成します。
サンプルプロジェクトでは、software フォルダーを作成します。
Quartus® Prime の下記 Tools メニューから Nios II Software Build Tools for Eclipse(以下 Nios II SBT)を起動します。
Tools メニュー ➤ Nios II Software Build Tools for Eclipse
<注意>
Quartus® Prime Standard Edition 19.1 以降の環境で Nios II SBT を利用するには、事前に WSL と Eclipse をインストールしてください。詳細は、下記コンテンツをご覧ください。
(Windows Subsystem for Linux と Eclipse のインストール)
起動した Workspace Launcher の Workspace 欄に、先ほど作成したワークスペース用フォルダー software を指定します。
Nios II SBT が起動します。
Nios II SBT の下記メニューにより、プロジェクト作成用のウィザードを起動します。
File メニュー ➤ New ➤ Nios II Application and BSP from Template
以下を指定します。
項目名 |
設定内容 |
SOPC Information File name |
nios2_system.sopcinfo (操作1. Platform Designer で生成した 組み込みシステムのハードウェア情報が記述された システム定義ファイル .sopcinfo を、ブラウザーで指定します。) |
Project name |
soft_test |
Templates |
Blank Project |
[Finish] ボタンをクリックします。
新しいプロジェクトが作成され、Project Explorer タブ内に soft_test と soft_test_bsp が追加されます。
3-2. Nios® II に動作させる C ソースコードを作成
Nios II SBT 上の soft_test フォルダーを右クリックで選択し、New ➤ Source File 選択します。
New Source File ウインドウにおいて、Source folder を指定し、Source file に作成する C ソースコードのファイル名を入力します。
[Finish] ボタンをクリックします。
メイン画面に表示されたエディターに、下記コードを記述します。
#include "sys/alt_stdio.h"
#include "system.h"
int main()
{
alt_printf("Hello from Nios II !!");
while(1)
{
int reg;
reg = *(volatile unsigned char *) PB_PIO_BASE;
*(volatile unsigned char *) LED_PIO_BASE = reg;
}
return (0);
}
記述完了後、File メニュー ➤ Save でファイルを保存します。
3-3. システムを設定
下記メニューにより BSP Editor を起動します。
″ソフトウエア・プロジェクト名″_bsp フォルダーを右クリック ➤ Nios II ➤ BSP Editor
サンプルプロジェクトは、Nios® II のブートメモリーと実行メモリーが共に On-Chip RAM なので
以下のように設定します。
[Main タブ]
・Settings ➤ Common ➤ hal
それ以外はデフォルトのままにします。
[注意]
“enable_sim_optimize“ オプションは、シミュレーション時に main() 関数の実行までの時間を短縮する効果があります。
シミュレーション作業が終了後は、Off にしてください。チェックを入れた状態でビルドしたコードは、実際のアプリケーションには使用できません。
・Settings ➤ Advanced ➤ hal.linker
[Linker Script タブ]
.bss、.heap、.rodata、.rwdata、.stack、.text をすべて On-Chip RAM(onchip_memory)にします。
その後、[Generate] ボタンをクリックします。
″INFO: Finished generating BSP files. ″ のログを確認したら、[Exit] ボタンで BSP Editor を閉じます。
3-4. ソフトウエア・プロジェクトをビルド
アプリケーション・プロジェクト(_bsp がついていないフォルダー)をマウスで選択し
右クリック ➤ Build Project でビルドを実行します。
3-5. ソフトウェアの Hex ファイルを生成
Nios® II SBT において、アプリケーション・プロジェクト (_bsp が付いていないフォルダー) を右クリック 選択し、下記メニューからソフトウエアの HEX ファイルを生成します。
Make Targets ➤ Build... ➤ mem_init_generate ➤ [Build] ボタンをクリック
\\<アプリケーション・プロジェクト用フォルダー>\mem_init フォルダー内に、*_onchip_memory.hex が生成されたことが確認できます。
Nios II SBT の File メニュー ➤ Exit で画面を閉じます。
3-6. *_onchip_memory.hexファイルをコピー
先ほど生成した *_onchip_memory.hex ファイルを、シミュレーション・モデルの保存フォルダーの
<Quartus Prime プロジェクト>/<Platform Designer フォルダー>/simulation/submodules
へコピーします。
もし、Platform Designer で作成したオンチップ・メモリーの初期値設定が下図のようにデフォルト指定ではない場合は
生成された *_onchip_memory.hex ファイルを指定のフォルダーにコピーし、
さらにファイル名が異なる場合は、*_onchip_memory.hex ファイルを指定ファイル名に変更してください。
3-7. NativeLink シミュレーションの設定
Quartus® Prime 上で NativeLink を実行するための環境を構築します。
こちらのコンテンツ の "環境を設定する" を参考に、設定してください。
Quartus® Prime の下記メニューから、NativeLink シミュレーションの設定をおこないます。
Assignments メニュー ➤ Settings ➤ EDA Tool Settings ➤ Simulation
項目名 |
設定内容 |
Tool name | シミュレーションに使用する EDA ツール |
Format for output netlist |
Verilog HDL を選択 (VHDL 設計であっても、ここでは Verilog を指定してください。) |
Output directory | デフォルト (simulation/<tool_name>) |
Compile test bench |
オリジナルのテストベンチを設定 VHDL テストベンチ サンプル記述 Verilog HDL テストベンチ サンプル記述 作業フロー “3. NativeLink settings 内にて、テストベンチを登録します。” を参考にしてください。) |
各ウインドウを OK で閉じます。
3-8. NativeLink でファンクション・シミュレーション実行
Tools メニュー ➤ Run Simulation Tool ➤ RTL Simulation をクリックします。
※ RTL Simulation 実行には、事前に Analysis & Elaboration または Analysis & Synthesis、あるいは Fitter のプロセスが実行されている必要があります。
ただし、Start Compilation (Processing メニュー) は実行しないでください。EDA Netlist Writer が自動的に実行されてしまい
正常な RTL Simulation 用のスクリプトが生成されない場合があります。
フルコンパイルを実行してしまった場合は、再度 Analysis & Elaboration または Analysis & Synthesis、あるいは Fitter を実行後に
RTL Simulation を行ってください。
Wave ウインドウに波形が表示されます。
期待する動作になっていることを確認後、シミュレーションおよび Questa - Intel FPGA Edition を終了します。
Questa - Intel FPGA Edition の Simulate メニュー ➤ End Simulation、File メニュー ➤ Quit
その後、Quartus Prime の Assignments メニュー ➤ Settings ➤ EDA Tool Settings ➤ Simulation において、Tool name を <none> に戻します。
[参考]
NativeLink を活用せず ModelSim (Intel FPGA Edition を含む) でシミュレーションを実施する場合は
Platform Designer の生成フォルダー内にある シミュレーション用スクリプトファイル msim_setup.tcl をカスタマイズします。
/<Nios II システムのフォルダー>/simulation/mentor/msim_setup.tcl
msim_setup.tcl の編集や作業フローは、下記コンテンツを参考にしてください。
4. 制約を設定する
4-1. ピンアサインを設定
Quartus® Prime の Assignments メニュー ➤ Pin Planner を起動し、デザインのピンを FPGA へピンアサインします。
MAX® 10 FPGA 開発キットの場合、以下のようにピンを設定してください。
4-2. コンフィグレーション・モードを選択
Quartus® Prime の Assignments メニュー ➤ Device ➤ Device and Pin Options により、コンフィグレーション・モードを指定します。
このサンプルプロジェクトでは、Single Compressed Image with Memory Initialization を選択します。
4-3. タイミング制約を設定
プロジェクトデザインに対してタイミング制約を作成します。
サンプルプロジェクトは 50MHz のクロックで動作する仕様のため、クロック定義のコマンドを記述した SDC を作成し、
プロジェクトに追加登録します。
Nios® II システム用の SDC は、qip ファイルの登録時(操作2-2)に自動生成された SDC ファイルが
Timing Analyzer (Assignments メニュー ➤ Settings) に適用されています。
ユーザー I/O ピンのタイミング制約は本来必須ですが、
このサンプルプロジェクトでは入力信号(プッシュボタンを人が押す・離す)も出力信号(LED が点灯・消灯)も超低速なので、ここでは I/O のタイミング制約を省略しています。
ユーザー回路の sdc ファイルを作成し、プロジェクトに登録します。
5. コンパイルをする
以下のメニューにより、コンパイルを実行します。
Processing ➤ Start Compilation
論理合成と配置配線が実行され、FPGA 内部に書き込むプログラムデータも同時に生成されます。
コンパイル終了後に、生成された コンパイル・レポートを検証 します。
6. タイミングを検証する
コンパイルレポート内の Timing Analyzer フォルダーを展開してタイミング検証をします。
各タイミングモデルがクロック周波数の制約条件をクリアしたことが確認できます。
7. FPGA にハードウエア・デザインをダウンロード
MAX® 10 FPGA 開発キットとパソコンを mini-USB ケーブルで接続します。
電源ケーブルを接続し、ボードに電源を供給 (On) します。
[参考情報] USB-Blaster II ドライバーのインストール
Quartus® Prime の下記メニューから Programmer を起動します。
Tools ➤ Programmer
Hardware Setup から USB-Blaster II を選択します
MAX® 10 をコンパイルすると、2種類の書き込み用ファイル (.sof / .pof) が生成されます。
まずは、ハードウェア回路を実機に実装し、ソフトウェアの動作をデバッグするので、SOF ファイルをダウンロードします。
サンプルプロジェクトでは、presspb_led_nipos2.sof をセットし、Start ボタンをクリックします。
Programmer の Progress バーが100% (Successful) になったらデータ転送完了です。
ハードウェアの回路データは FPGA に転送されましたが、内部の Nios® II が実行するためのプログラムがまだありません。
なので、開発ボード上のプッシュボタン [S1] を押しても もちろん LED はうんともすんとも言いません。
続いて、Nios® II に実行させるソフトウェアの開発をしましょう。
インテル FPGA の Nios® II で はじめての L チカ!(Part 2)
おすすめ記事/資料はこちら
インテル FPGA の Nios® II で はじめてのLチカ! Part 1
インテル FPGA の Nios® II で はじめてのLチカ! Part 2
FPGA のオンチップ・メモリーで Nios® II をブートさせてみよう
MAX® 10 の UFM で Nios® II をブートさせてみよう