1. はじめに
このコンテンツでは、Generic Serial Flash Interface Intel® FPGA IP(以下 GSFI)を使用して、Boot Copier 又は XIP(Execute in Place)で Nios® II を Flash ROM(Quad SPI Flash)から Boot させる方法をご紹介します。
GSFI に関しては下記コンテンツをご参照ください。
参考:Generic Serial Flash Interface Intel® FPGA IP User Guide
参考:Generic Serial Flash Interface (GSFI) and Nios II Booting Quick Start Guide
参考:>Embedded Peripherals IP - Generic Serial Flash Interface サンプル
XIP と Boot Copier の違いについては、以下のコンテンツをご参照ください。
参考:Nios® II Boot の種類 と 各 Boot Option における設定方法について
2. 概要
下記コンテンツに記載されている「Boot と Flash Controller の関係性」や「構築方法の基本的な考え方」に大幅な変更はありません。
参考:Embedded Peripherals IP - 各種 Flash Controller の比較 > 3. Nios® II Boot との関係性
参考:Nios® II Boot Option ~ EPCQ Flash ~ (AS IF を使用)
参考:Nios® II Boot Option ~ QSPI Flash ~ (User I/O IF を使用)
しかしながら、Flash Controller を GSFI に変更することによって、下記 2 点の注意点があります。
- I/O Mode(Standard/QUAD)と Flash ROM の仕様に合わせて GSFI のパラメーター設定が必要である
- Nios® II SBT の mem_init に対応していない為、コマンドで HEX ファイルを生成する必要がある
この 2 点を含めて解説していきます。
今回、解説に使用した Platform Designer の構成は【図1】の通りです。
【図1】Platform Designer 構成例
3. その他 IP と Quartus® Prime で必要な設定
3-1. その他 IP のパラメーター設定
Platform Designer において、Nios® II など GSFI 以外で必要な設定は従来通りです。
下記コンテンツも併せてご参照ください。
参考:Nios® II Boot Option ~ EPCQ Flash ~ (AS IF を使用)
参考:Nios® II Boot Option ~ QSPI Flash ~ (User I/O IF を使用)
Nios® II Processor パラメーター設定にある Reset Vector Offset の設定は、Flash ROM のどのアドレスに Nios® II ソフトウェアを格納するかを設定します。
Configuration ROM に格納する(AS Interface を使用する)場合は、下記情報を参考に設定してください。
User I/O に接続された Flash ROM に格納する場合は、格納したいアドレスを自由に設定してください。
参考:Nios® II Boot Option ~ EPCQ Flash ~ (AS IF を使用) > Reset Vector offset の設定方法
3-2. Quartus® Prime の設定
Configuration ROM の中に Nios® II ソフトウェアを格納する場合は、GSFI の パラメーター設定と Quartus® Prime の Configuration scheme の設定を合わせる必要があります。
Assignments tab ⇒ Device ⇒ Device and Pin Options ⇒ Configuration を開いて、【図2】に示す項目を設定してください。
- Standard Boot の場合、Active Serial ×1(can use Configuration Device)
- Quad Boot の場合、Active Serial ×4(can use Configuration Device)
【図2】Quartus® Prime の Device and Pin Options
JIC または POF ファイルを Configuration ROM に書き込むと、Flash ROM の容量 と AS×1 / AS×4 の組み合わせによって、Nonvolatile Configuration Register に書き込まれる Dummy cycles の値が変わります。
AS(Active Serial)Interface を使用している場合、GSFI の パラメーター設定 と Configuration scheme 設定が合っていないと、正しく Boot させることができません。下記情報を参考にダミーサイクルの値を確認して、GSFI のパラメーター調整を行ってください。
参考:Intel Supported Third Party Configuration Devices
User I/O Interface を使用している場合、Nonvolatile Configuration Register の書き換えを行わないため、Nonvolatile Configuration Register の値を確認しておく必要があります。必要に応じて書き換えや GSFI のパラメーター調整を行ってください。
下記サンプル・ソフトウェアのメモリーテストにて Nonvolatile Configuration Register を確認できます。
参考:Embedded Peripherals IP - Generic Serial Flash Interface サンプル
4. Generic Serial Flash Interface のパラメーター設定
Platform Designer における、GSFI のパラメーター設定は、Show/Hide Hidden Parameters という設定で普段は隠れています。【図3】に GSFI レジスター設定の初期値を示します。
Default Settings の項目を設定することで、IP 起動後の初期値を設定しておくことができます。電源投入後 Nios® II が Boot できるように、Default Settings の項目を設定しておきます。
下記コンテンツを参考に、レジスターの内容とパラメーター設定の表示方法を確認してください。
参考:Embedded Peripherals IP - Generic Serial Flash Interface サンプル
【図3】GSFI Default Settings の 初期値
4-1. AS Interface と User I/O Interface の設定
GSFI の Flash ROM との接続は、AS(Active Serial)Interface 、User I/O どちらにも対応しています。
AS Interface の場合は、デフォルトの設定で問題ありません。そして、FPGA 外部 PIN に明示的に接続する必要もなく Tool にて自動的に AS Interface への接続を行います。
User I/O の場合は、【図4】のように、"Disable dedicated Active Serial interface" と "Enable SPI pins interface" の設定を有効にします。Flash ROM に接続する信号を Export させ、Flash ROM につながる FPGA 外部 PIN に直接接続してください。また、タイミング制約ファイル(SDC ファイル)も忘れずに記述してください。
参考:Quartus® はじめてガイド - タイミング制約の方法
【図4】GSFI User I/O 設定
4-2. Addressing と Clock Baudrate の設定
Addressing の設定は Control Register で行います。容量の大きさによって設定する内容が異なります。
Flash ROM アクセス周波数(DCLK)の設定は、Clock Baudrate Register で行います。GSFI の動作周波数からどのくらい分周するかを設定します。動作周波数の 1/2 ~ 1/32 まで設定できます。
【表1】Addressing と Clock Baudrate の設定例
Register Name | Default Value | Setting Example |
Control Register | 0x00000001 |
128 以下 (3byte Addressing) : 0x00000001 256 以上 (4byte Addressing) : 0x00000101 |
Clock Boudrate Register | 0x00000010 |
動作周波数の 1/2 : 0x00000001 動作周波数の 1/32 : 0x00000010 |
4-3. Standard(×1)の設定内容
I/O Mode の設定は Protocol Settings Register で行います。I/O Mode が Standard の場合はデフォルトの設定にします。
Read opcode の設定は Read Instruction Register で行います。 I/O Mode と Flash ROM の型番によって設定内容が異なります。ここでは EPCQ256 での設定例をご紹介します。
【表2】Standard(×1)の場合における I/O Mode と Read opcode の設定
Register Name | Default Value | Setting Example of EPCQ256 |
Protocol Settings Register | 0x00000000 |
デフォルト設定で OK |
Read Instruction Register | 0x00000003 |
Flash ROM の仕様に合わせて設定 [12:8] : Dummy cycles : 0x0 [7:0] : Read opcode : 0x03 |
4-4. QUAD(×4)の設定内容
I/O Mode の設定は Protocol Settings Register で行います。I/O Mode が QUAD の場合、Protocol Settings Register の Read Data と Read Address の設定を Quad(0x2)に変更します。
Read opcode の設定は Read Instruction Register で行います。 I/O Mode と Flash ROM の型番によって設定内容が異なります。ここでは EPCQ256 での設定例をご紹介します。
【表3】QUAD(×4)の場合における I/O Mode と Read opcode の設定
Register Name | Default Value | Setting Example of EPCQ256 |
Protocol Settings Register | 0x00000000 |
0x00022000 [17:16] : Read Data out transfer mode : 0x2 [13:12] : Read Address transfer mode : 0x2 |
Read Instruction Register | 0x00000003 |
Flash ROM の仕様に合わせて設定 [12:8] : Dummy cycles : 0xA (EPCQA の場合は 0x6) [7:0] : Read opcode : 0xEB |
4-5. 【参考】Read Instruction Code 一覧表
参考として【表4】に 各 Flash ROM の Read Instruction Register 設定例を記載します。
注記:
ユーザーガイドに記載の内容をもとにまとめていますので、Flash ROM の仕様を再度確認し検証を行ってください。
【表4】Read Instruction Code 一覧表
Flash ROM Name (*1) |
Vender | Standard | QUAD | ||
Read opcode | Dummy cycles | Read opcode |
Dummy cycles (*2) |
||
EPCQ64 | Intel® | 0x03 | 0x0 | 0xEB | 0xC |
EPCQ256 | Intel® | 0x03 | 0x0 | 0xEB | 0xA |
EPCQA128 | Intel® | 0x03 | 0x0 | 0xEB | 0x6 |
N25Q64A | Micron | 0x03 | 0x0 | 0xEB | 0xC |
MT25QL256 | Micron | 0x03 | 0x0 | 0xEB | 0xA |
MX25L256 | Macronix | 0x03 | 0x0 | 0xEC | 0x6 |
IS25LP256 | ISSI | 0x03 | 0x0 | 0xEC | 0xC |
注記:
*1. Third Party Flash ROM の User Guide は各ベンダーから取得ください。
*2. Nonvolatile Configuration Register のレジスターの値によっては、Dummy cycles の調整が別途必要な場合があります( 3-2. Quartus® Prime の設定 をご参照ください)。
5. Nios® II SBT の設定
4 章までの設定が完了したら、Platform Designer の Generate HDL を実行し、SOPCINFO ファイルを生成します。Quartus® Prime もコンパイルを行い SOF ファイルを生成しておきます。
その SOPCINFO ファイルを使用して、Nios® II SBT で Project を生成します。BSP の設定変更と Build を実行し、ELF ファイル(実行ファイル)を生成します。
ポイント:
- Boot の確認を行う際は、本番で使用するソフトウェアではなく、一旦 Hello World や LED を点灯させるだけなど、簡単なソフトウェアを使って検証を行うと、ソフトウェアの記述が原因で Boot ができないことなどが少なくなるため、スムーズに Boot の検証が行えます。
- Boot の状態を UART Core(または JTAG UART)に出力することができます。【図5】のように
BSP Editor ⇒ Main tab ⇒ Advanced ⇒ hal ⇒ log_port : value に、UART Core(または JTAG UART)を設定すると Boot のログが出力されます。「どこまで処理が進んだのか」、「main 関数が呼ばれたのか」を Terminal 上で確認できます。
BSP Editor ⇒ Main tab ⇒ Advanced ⇒ hal ⇒ log_flags : value に数値を入れることで、表示されるログの数が増えます。(【図5】は log_flags = 0 と設定しています)
【図5】Boot Log Port 設定
5-1. Boot Copier で起動する場合の Nios® II 設定
Boot Copier は、Linker Section をすべて RAM(On Chip RAM または 外部 RAM)に設定し、Flash ROM から RAM に必要なデータを Boot Copier と呼ばれる Boot Loader で展開して Nios® II を動作させる方式です。
Boot Loader ですべて展開してくれますので、hal.linker の設定はすべて OFF にします。
【図6】に設定例を示します。
メモ:
【図6】は Nios® II パラメーターにおける Vectors タブの設定が下記の場合の例です。
・Reset vector memory : GSFI
・Exception vector memory : On Chip RAM 又は外部 RAM
詳しくは下記コンテンツをご覧ください。
【図6】Boot Copier における Nios® II SBT BSP Editor 設定
5-2. XIP で起動する場合の Nios® II 設定
XIP(Execute in Place)は Linker Section の .text 領域を Flash Controller に割り当てて、Flash ROM 上で Nios® II を動作させる方式です。
.text 以外の Section を RAM に格納する設定にした場合は、Boot 時に RAM に展開するために alt_load の設定を有効にする必要があります。
【図7】に設定例を示します。
【図7】の Linker Section 設定の場合は、hal.linker の設定はすべて ON にします。
メモ:
【図7】は Nios® II パラメーターにおける Vectors タブの設定が下記の場合の例です。
・Reset vector memory : GSFI
・Exception vector memory : On Chip RAM 又は外部 RAM
Exception vector memory も GSFI に設定した場合は、alt_load 設定の "enable_alt_load_copy_exceptions" を OFF にします。詳しくは下記コンテンツをご覧ください。
参考:Nios® II Boot Option ~ EPCQ Flash ~ (AS IF を使用) > 2-2. XIP 構成における Nios® II SBT の BSP Editor 設定
参考:Nios® II Boot Option ~ QSPI Flash ~ (User I/O IF を使用) > 2-2. XIP 構成における Nios® II SBT の BSP Editor 設定
【図7】XIP における Nios® II SBT BSP Editor 設定
6. Programming File の生成方法
GSFI を使った Nios® II Boot の場合は、mem_init が対応していないため、Flash ROM に格納する HEX ファイルの生成は、Nios® II Command Shell にてコマンドで生成します。
Boot Copier と XIP によって実行するコマンドが異なります。
6-1. Boot Copier の場合の ELF to HEX コマンド
Boot Copier 用 HEX ファイルの生成手順を記載します。Run As で Nios® II ソフトウェアが動作することを確認してから、HEX ファイルを生成してください。
-
- Nios® II SBT の Application フォルダーに boot_loader_cfi.srec を下記パスからコピーします。
C:\intelFPGA\20.1\nios2eds\components\altera_nios2\boot_loader_cfi.srec
ポイント: 上記は ver 20.1 を例にしたパスですので、ご使用のバージョンに合わせて変更してください。
ポイント: 絶対パスでコマンドが動かないなどを避けるためにコピーします。
- Nios® II SBT にて Application フォルダーを右クリックし、Nios® II ⇒ Nios® II Command Shell を起動します。
ポイント: Application フォルダーのパスで起動します。
- alt-file-convert.exe コマンドの引数を環境に合わせ込み実行します。下記にコマンド例を示します。
- Nios® II SBT の Application フォルダーに boot_loader_cfi.srec を下記パスからコピーします。
alt-file-convert.exe -I elf32-littlenios2 -O hex --input=Boot_LED_Check.elf --output=GSFI_BOOT.hex --base=0x02000000 --end=0x03ffffff --reset=0x02420000 --out-data-width=8 --boot=boot_loader_cfi.srec
<コマンド引数の解説>
alt-file-convert.exe -I elf32-littlenios2 -O hex --input=<ELF File Name> --output=<HEX File Name> --base=<GSFI BASE Address> --end=<GSFI END Address> --reset=<Reset Vector> --out-data-width=8 --boot=boot_loader_cfi.srec
- GSFI BASE Address , GSFI END Address は、Platform Designer で設定した値です。
- Reset Vector = GSFI BASE Address + Reset Vector Offset は、Nios® II パラメーターで設定した値です。
6-2. XIP の場合の ELF to HEX コマンド
XIP 用 HEX ファイルの生成手順を記載します。一度 Boot Copier の設定に変更し、Run As で Nios® II ソフトウェアが動作することを確認してから、XIP の設定に戻し HEX ファイルを生成してください。XIP のデバッグに関しては下記をご参照ください。
-
- Nios® II SBT にて Application フォルダーを右クリックし、Nios® II ⇒ Nios® II Command Shell を起動します。
ポイント: Application フォルダーのパスで起動します。
- elf2hex.exe コマンドの引数を環境に合わせ込み実行します。下記にコマンド例を示します。
- Nios® II SBT にて Application フォルダーを右クリックし、Nios® II ⇒ Nios® II Command Shell を起動します。
elf2hex.exe Boot_LED_Check.elf 0x02000000 0x03ffffff --width=8 --little-endian-mem --create-lanes=0 GSFI_BOOT_XIP.hex
<コマンド引数の解説>
elf2hex.exe <ELF File Name> <GSFI BASE Address> <GSFI END Address> --width=8 --little-endian-mem --create-lanes=0 <HEX File Name>
- GSFI BASE Address , GSFI END Address は、Platform Designer で設定した値です。
6-3. JIC / POF ファイルの生成方法
Convert Programming File で JIC / POF ファイルを生成します。
AS Interface の Configuration ROM に格納する場合は、JIC ファイルを生成して、Quartus® Prime Programmer を使用して JTAG 経由で書き込むことができます。
User I/O Interface に接続した Flash ROM に格納する場合、POF ファイルを生成して、PFL (Parallel Flash Loader) を内蔵したデザインと Quartus® Prime Programmer を使って JTAG 経由で書き込みができます。
また、Convert Programming File にて Create config data RPD を有効にしておくことで、JIC / POF のバイナリーファイルを同時に生成することができます。
JIC ファイルを生成する場合は、下記コンテンツをご参照ください。
参考:Nios® II Boot Option ~ EPCQ Flash ~ (AS IF を使用) > 4-2. JIC ファイルの生成
POF ファイルを生成する場合は、PFL も含めて下記コンテンツをご参照ください。
参考:Nios® II Boot Option ~ QSPI Flash ~ (User I/O IF を使用) > 4-2. POF ファイルの生成
ポイント:
XIP の場合、HEX ファイルの設定によって Absolute addressing がうまく機能しない場合があります。
その際は下記 FAQ をご参照ください。
参考:Convert Programming Files の Relative Addressing で HEX の格納アドレスを調整する方法を教えてください。
弊社では Nios® II に関する各種情報をまとめた「Nios® II まとめページ」をご用意しております。
本記事以外にも有用な情報が満載ですので、こちらも併せてご確認ください。