1. はじめに
MAX® 10 FPGA にはフラッシュメモリーが内蔵されており、後述で示す通り CFM/UFM という形で提供されます。この時 Nios® II のソフトウェアをフラッシュメモリーに格納する場合 UFM に実装することになりますが、フラッシュメモリーのサイズとしては CFM を含めた全体のサイズで定義されます。
このため Nios® II を使用する際にプログラム・サイズが On-Chip Flash の UFM 領域のサイズを超えていても Error として通知されません。
その為、MAX® 10 の UFM にユーザープログラムを格納する場合には、ユーザー側で常にサイズに注意する必要があります。
この記事では、MAX® 10 で Nios® II を使用する際の On-Chip Flash での注意点と対処方法について説明します。
2. MAX® 10 デバイスの On-Chip Flash
MAX® 10 は、低コスト、シングルチップ、スモール・フォーム・ファクターの不揮発性プログラマブル・ロジック・デバイスです。 アナログ・デジタル・コンバーター (ADC) や、2 つのイメージを格納してダイナミックに切り替えることが可能なデュアル・コンフィグレーション・フラッシュメモリーなどの機能をシングルチップ上に搭載しています。
また、Nios® II ソフト・コア・エンベデッド・プロセッサーのサポート、デジタル信号処理 (DSP) ブロック、ソフト DDR3 メモリー・コントローラーといった、フル装備の FPGA 機能を備えています。
📄 参考:
MAX® 10 FPGA についての詳細は、以下のページを参照ください。
MAX® 10 FPGA (altera.com)
MAX® 10 は、On-Chip Flash が 2 つの部分に分割されています。
● Configuration Flash Memory (CFM)
MAX® 10 のハードウェア・コンフィグレーション・データを格納します。
● User Flash Memory (UFM)
ユーザーデータまたはソフトウェア・アプリケーションを格納します。
MAX 10 User Flash Memory User Guide • Altera Documentation and Resources Center
3. MAX® 10 で Nios® II を使用する際の On-Chip Flash での注意点
Platform Designer (旧 Qsys) にて On-Chip Flash IP (Altera On-Chip Flash IP) を下図のように設定した場合、Nios® II Software Build Tools (SBT) for Eclipse では UFM 領域のみならず、CFM の領域まで On-Chip Flash として見えています (この資料では、MAX® 10 の 10M08 デバイスを例として説明しています)。
【図 1】 On-Chip Flash IP の設定
Nios® II SBT の BSP Editor から見ても、UFM と CFM の区別はしておらず、CFM も含めたサイズ (319456 Bytes) として On-Chip Flash 領域が見えています。
【図 2】 Nios® II SBT から見た On-Chip Flash 領域
注意点1. プログラムが UFM より大きいサイズの場合でも Error にならずビルドが通ってしまう
上記のことから、.text を On-Chip Flash に配置する際は、プログラム (.elf ファイル) が UFM に収まるかではなく、On-Chip Flash に配置できるかでしかビルド時に判定されません。
つまりプログラムが UFM より大きいサイズの場合でも Error の表示無くビルドが通ってしまいます。
そのため UFM のサイズを考慮してプログラムを作成する必要があります。
【図 3】 UFM と CFM のアレイサイズ
【図 4】 Nios® II SBT でビルドしたプログラムが 10M08 の UFM サイズ 32 KB を超えた例
注意点2. サイズオーバーした elf ファイルは HEX 変換や POF 生成を行っても Error にならない
● HEX に変換
● POF を生成
● プログラムする
などに使用されますが、サイズオーバーした elf ファイルは、これらのどの過程でも Error は発生しません。
【図 5】 HEX に変更した場合のログ
【図 6】 POF を生成した場合のログ
MAX® 10 の UFM で Nios® II をブートさせてみよう [前編]
MAX® 10 の UFM で Nios® II をブートさせてみよう [後編]
4. 対処方法
Nios® II SBT の BSP Editor 上であらかじめ配置できるセクション・サイズに変更します。
セクション・サイズを変更することでビルド時に Error として出力されるようになります。
① Platform Designer の On-Chip Flash IP (Altera On-Chip Flash IP) において UFM として使用できる領域を確認します。
例) この例では、0x0 ~ 0x1c7ff まで使用可能です (※ 0x1c800 → 116736 Byte)
【図 7】 On-Chip Flash IP において UFM として使用できる領域を確認
② Nios® II SBT の BSP プロジェクトを右クリックし、「Nios II」 ⇒ 「BSP Editor」 を開きます。
【図 8】 Nios II SBT の BSP Editor を開く
③ BSP Editor の Linker Script タブにおいて、onchip_flash_data の領域を Platform Designer で確認したサイズに設定します。このとき、先頭の 32 Byte (リセットベクター領域) を引いた値で設定します。
例) 10M08 の場合は、 116736 - 32 = 116704 Byte
【図 9】 変更前の onchip_flash_data のサイズ (10M08 の場合の例)
【図 10】 変更後の onchip_flash_data のサイズ (10M08 の場合の例)
④ [Generate] ボタンをクリックし、その後 [Exit] ボタンをクリックします。
【図 11】 [Generate] ボタンをクリックし、その後 [Exit] ボタンをクリック
⑤ Nios® II SBT の Application プロジェクトを右クリックし、「Build Project」 を実行します。
【図 12】 Application プロジェクトのビルド
本問題に対応するために、MAX® 10 の UFM 内にソフトウェアが収まるかどうかを簡易的にチェックするソフトウェア check_size.exe (check_size.c) を用意しました 。
⚠ 注記:
ソフトウェア check_size.exe (check_size.c) は、参考として提供するものであり、運用した結果の影響については責任を負いかねますので、あらかじめご了承ください。
このソフトウェアでは、Nios® II SBT の Application プロジェクト内でビルド時に作成された .objdump ファイル内の記載から対象セクションのサイズを抜き出し足し合わせて、最終的にどれくらいのサイズが必要なのかを出力しています。
⑥ Nios® II SBT によるビルド後、Nios® II Command Shell より下記コマンドを入力し check_size.exe を実行して、作成したソフトウェアが指定した UFM に収まるかを確認します。
⚠ 注記:
check_size.exe を実行する前に、Application プロジェクト・ディレクトリーに check_size.exe をコピーしておきます。
【図 13】 check_size.exe ツールによる UFM に収まる場合の表示例
【図 14】 check_size.exe ツールによる UFM に収まらない場合の表示例
資料/サンプル
📕 資料
max10_ocflash_check_size_r1__1.pdf
PDF 版(内容は本記事と同一です。)/Rev.1
📦 サンプル
check_size__1.c
ソフトウェア・サイズ・チェック・プログラム(Cソースコード)
check_size__1.exe
ソフトウェア・サイズ・チェック・プログラム (実行ファイル)
おすすめページ
弊社では Nios® II に関する各種情報とまとめた「Nios® II まとめページ」をご用意しております。本記事以外にも有用な情報が満載ですのでこちらも併せてご確認ください。