MAX10デバイスを使う場合の注意まとめ(その1) [FPGA]

さて、先月からMAX10デバイスを一通り使ってみて、途中基板を速攻で起こす羽目になったりしてプチ修羅場な状況だったのだけども、なんとか収束してきたのでMAX10を使うにあたってのまとめをしてみよう。
DSC_0340.JPG

MAX10はラインナップ上いくつかのバリエーションがあるものの、ここでは全部網羅することはできないので、MAX10 evalボードおよびSODALITE基板で採用の10M08SAE144C8GESに限って話をすすめることにします。それ以外のデバイスについては適宜データシートを参照のこと。
 → オンライン資料:MAX 10 FPGA


1.コンパイル編

まずQuartusIIでのコンパイルから。
MAX10はまだQuartusIIでは正式に対応している状態ではなく、14.0のアップデートパッチ(Update2)による暫定対応となっています(正式対応は14.1で、これは来週のALTERAサーバーメンテ開けにリリースされるものと思われる)。
 → 参照:MAX10ボードがもうすぐ到着

QuartusII 14.0をインストール後、Update2パッチをインストールすることでMAX10デバイスが選択できるようになります。また14.0 Update2ではラインナップのうち、10M02/10M04/10M08と10M40および50がライブラリとして用意されており、まだ全ラインナップが揃っていません。

次にコンパイルに関しても、MAX10では既存のFPGAデバイスとはくせの違う部分があります。
大きな差の一つが、メモリマクロの初期値についての問題で、MAX10デバイスで初期値付きのメモリを使う場合は Settings→Analysys&Synthesis→More Settings で追加設定を開き、その中のEnable ERAM PreloadをOff→Onにします。
 → 参照:MAX 10 エンベデッド・メモリ・ユーザーガイド(4-6 注釈)

2.書き込み編

続いてデバイスへのダウンロード。
14.0 Update2ではSOFまでしか生成されず、POFは手動で生成してやる必要があります。
 → 参照:MAX10ボード使ってみた

ここで注意しないといけないのは、MAX10では(少なくとも現段階では)何もコンフィグレーションされてない状態ではPOFの書き込みが出来ない点です。これはかなりハマりました‥‥。
なので、予め何らかのSOFをダウンロードしてMAX10デバイス内部をコンフィグレーションさせておく必要があります。
MAX10 evalボードでは最初にテストコンフィグが入っていますが、デバイスイレースをすると未コンフィグ状態になるので注意が必要です。

またもう一つ、MAX10デバイスのES品では出荷時にリコンフィグレーション・タイムアウト機能が有効になっていて、何も書き込まずにSOFだけダウンロードしていると勝手にリコンフィグします。傍目にはブラウンアウトリセットがかかったように見えるのでタチが悪い‥‥。

リコンフィグレーション・タイムアウト機能の解除の仕方はErrata Sheet and Guidelines for MAX 10 ES Devices (英語版・PDF)の最後に記載がありますが
  1. Programmerを起動
  2. AutoDetectでデバイスを選択
  3. Eraseにチェックを入れる
  4. Startボタンをクリック
  5. 再度電源を入れ直す
の操作が必要です。
イレースしただけではタイムアウト機能はそのままなので、いったん電源を入れ直してデバイス内部を初期化し直す必要があります。

このリコンフィグレーション・タイムアウト機能のやっかいなところは、POFの書き込みにかかる時間よりもタイムアウト時間の方が短いため、最初にこの機能をOFFにしとかないとPOFの書き込みが途中で失敗する(勝手にリコンフィグする)ことです。これまただいぶハマった‥‥。

ところで、うちの環境ではUSB-Blaster Rev.Bの接続で、MAX10 evalボードでもSODALITEボードでもJTAGのリンクが頻繁に切れるという問題が発生してます。
レベル変換を省いてMAX3000A直結のクローンBlasterでは問題が出てないあたり、どうもUSB-Blaster Rev.Bの電気仕様とMAX10のJTAGピンの電気仕様の相性がよろしくないのかもしれません。
単にうちのUSB-Blasterが死にかけなだけかもしれませんが、まあそういう事例も出てますということで。

3.NiosII編

どんどん行きます。
MAX10で新しくNiosIIのデザインをする場合は、旧来のNiosIIではなく、NiosII Gen2を使う必要があります。
 → 参照:MAX10でNiosII動かしてみた

NiosII Gen2では、/eコアと/fコアの2種類に整理されています。/eコアは無償で使えるフリー版で、/fコアは有償コアです。旧来の/sコアは/fコアの設定変更で/sコア相当の機能やフットプリントを選択できるような運用に変更されました。
また内部ロジックはMAX10への実装にあわせ、命令デコーダのテーブルをM9kメモリの初期値を使わないように変更されているようです(リセット動作時にプリロードしている?)。

Gen2ではこの他、割り込みやリセットのベクタを絶対アドレス指定でも行えるようになっています。フィッティングの効率やタイミング収束は旧来のコアとあまり変わりません。NiosII SBTの対応も変更はありません。

ちなみに、既に生成したQsysコンポーネントに含まれるNiosIIのデザインは、MAX10でもそのままコンパイルすることができます。
MAX10で新しくQsysコンポーネントをデザインする場合のみ、Gen2が必要になるわけです。ただ、当然ながらGen2でないNiosIIでは初期値付きのM9kメモリマクロを使っているため、ERAM Preloadのオプションを有効にしておかなければなりません(これの制限については後述)。

なお、MAX10では内蔵のUFM(ユーザーFlashメモリ領域)がAvalon-MMのメモリデバイスとしてマッピングされるため、NiosIIからはそのままROMとして使うことができます。
UFMの内容はコンフィグデータとは別にProgrammerで書き込むことが出来るため、QuartusIIで再コンパイルすることなくブートプログラム(あるいは小規模なアプリケーションなど)を差し替えられるようになり、ワンチップマイコンに近い運用ができるようになりました。

4.I/O編

MAX10のI/O機能はそれまでのデバイスのI/Oに比べるとかなり強化されていて、機能的にはCyclone VとMAX Vを足してさらにLVDSの差動入力を増やしたようなイメージになっています。
 → 参照:MAX 10 General Purpose I/O User Guide
 → 参照:MAX 10 High-Speed LVDS I/O User Guide

内部アーキテクチャが同等のCycloneIII/IV Eと比べてIOEがかなり改良されていて、ピンマッピングが使いやすくなっています。
個人的にSODALITEで10M08SAE144C8GESを使ってみてプラスポイントだったのが
  1. 3.3Vまたは3.0Vの単電源で動く
  2. 低消費電力(~0.5W)
  3. VREFピンにもIOレジスタが割り当てられた
  4. CLKピンが通常のI/Oピンとしても使えるようになった
このうち上2つはI/O機能とは直接関係ないので置いとくとして、下2つがかなり良くなっています。

もともとE144ではI/Oピンが限られていて、特に大規模のデバイスになるとクロックの入力専用ピンが、実運用上I/O数を相当数削ってしまっていたのですが、MAX10ではCLKピンがI/Oとして使えるようになったためI/Oに余裕が出ました。これだけでもかなりありがたい。

また、これまでVREFピンにはIOレジスタがなかったので、SDRAMなどの高速パラレル信号を配置するとデータスキューが頭の痛い問題になっていました(例:DE0のDRAM_WE_NとDRAM_DQ3)が、MAX10ではVREFピンにもIOレジスタが追加されて、他のI/Oピンとデータスキューがきれいに揃うようになっています。

そんなわけでSODALITEではSDRAMのピンアサインをBANK4~BANK7のI/Oピンを片っ端から全部割り当ててピン数を稼ぐことができてます。
sodalite_pins.png

その他、高速系の電気規格についてもBusLVDSや、SLVS、TMDSなどに新たに対応していて、さらにほぼ全ピンに差動入力ペアが設定されており、これまでの廉価FPGAよりもさらに高速シリアル信号のインターフェースを強化してきた印象を受けます。

5.ADC編

さてMAX10の目玉。新しく追加されたアナログ機能です。
 → 参照:MAX 10 アナログ-デジタル・コンバータ・ユーザー・ガイド

MAX10ではALTERAデバイスとしては初めてADCを内蔵しています。
10M08SAE144では10:1のアナログマルチプレクサを搭載し、外部9チャネル+内蔵温度を、最大1Msps、12bit精度の分解能でサンプリングすることができます。
またリファレンス電圧も内部生成のほか外部からの入力にも対応していて、より高精度のA/D変換ができるようになっています。

ただ、現時点(14.0 Update2)ではADC機能モジュールはQsysのAvalonコンポーネントのβ版のみとなっていて、IP Catalogからはインスタンスできないので、使いどころが限られています。あとIPコア自体もまだ使いにくい。
ここはQuarutsII 14.1の正式対応を待ちましょう。


で、ここまでいろいろと機能たくさんのMAX10ですが、当然ながら諸手を挙げて万事OKかというとそうでもなくて、機能毎の排他的な制約がいろいろと付いてくるわけです。
なによりもADCを使った時の制限がなかなかシャレにならず、ものによっては致命的なインパクトになりうる場合があります。

次回エントリではMAX10の制限についてまとめます。