VHDLいろいろ [FPGA]

今更感あるけども、VHDLで特定用途で便利な記述ネタを。

●LPMやMegafunctionを直接インスタンスする

library altera_mf;
use altera_mf.altera_mf_components.all;

を追加しておくと、コンポーネント宣言を省略してLPMやMegafunctionのマクロをインスタンスできる。
乗算やFIFO、DDRIOなどハードマクロにインスタンスしたい場合に便利。
パラメータのマニュアルはIP Catalogで表示されるコンポーネント名でぐぐれはIntelのpdfがでてくるけど、そのままIP Catalogでソースを出力して該当部分をコピペした方が早い。

そんなわけで、ソース公開するときにライセンス云々でやかましい類の人間に噛みつかれたくないときに重宝。別にQuartusPrimeのツール生成ソースでライセンス上も何の問題も無いのだけれど。

●リダクション演算を使う

use ieee.std_logic_misc.all;

を追加すると以下のリダクション演算ファンクションが使えるようになる。

and_reduce(std_logic_vector)
or_reduce(std_logic_vector)
xor_reduce(std_logic_vector)
nand_reduce(std_logic_vector)
nor_reduce(std_logic_vector)
xnor_reduce(std_logic_vector)

リダクション演算は引数のベクタの全ビットに対して論理演算を行うというもの。例えば and_reduce(data) とやると、dataの全ビットでand演算を行った結果が返される。つまり全ビットが'1'なら'1'が返る。
or_reduce(data)であれば全ビットが'0'の場合に'0'が返る。xor_reduce(data)では'1'のビットが奇数個の時に'1'が返る。
or_reduceは関係演算子でオーバーロードが行われるのでゼロ比較で代用できるけども、and_reduceの機能(任意長のビット幅で全ビットが'1'の判定)は少々面倒なので、パラメタラブルな記述をし始めると出番は多い。


MAX10のコンフィグをシリアルUARTで書き換える [FPGA]

MAX10のデュアルコンフィグ機能を使って内蔵フラッシュを書き換えるツールをリリースしました。
 → MAX10 Serial Config Updater

Githubリポジトリ
 → max10_config_updater


・仕掛けの解説

MAX10のCFM0にブートローダとなるQsysモジュールを書き込んでおき、CONFIG_SEL='0' でまずこのイメージがブートされる。
ブートローダのQsysはPERIDOTのコンフィグレーション層(のエミュレーション)とAvalonMMブリッジを内蔵していて、これでQsysのシステムIDやチップユニークIDの読み出し、内蔵フラッシュの読み書き、デュアルブートコアのアクセスなどを行う。
ホストPCからはASモードに設定された(FPGAコンフィグ機能が使えない)PERIDOTの派生ボードとして見えているので、Canarium.jsのavmメソッドで内部アクセスができる。

MAX10の内蔵フラッシュペリフェラルはAvalonMMスレーブとしてメモリアドレスにマップされている。フラッシュ書き込みの待ち時間もAvalonMMのwaitrequestでハード的に行われるので、Canarium.jsからは単にメモリ領域の読み書きを行っているだけで済んでいる。
コンフィグレーションデータは32ビット単位でビット順を入れ替える必要があるものの、こういうのはChromeアプリ側でやってしまえるので、ハードウェア側で特別に対応する必要はない。

欠点としてはデュアルコンフィグをベースとするので、M9Kの初期値が使えない、CONFIG_SELピンがI/Oとして使えない&外部からH/Lを選択できないといけない、CFMをユーザー領域に使えない、などがある。

あと、一番最初のブートローダーを書き込むのにはUSB-Blasterが必要、というのは変わらないので、ここはなんとかしたい。ので、今はブートローダー書き込み済みのボードを販売できるよう準備を進めているところ。
チップ単品売りも考えてはいるけど、これは手間とか管理コストがかかるので、どこかしら代理店になってくれるとこがあれば。

CZPMPLwWYAAA0oW.jpg
Chromebookからも使えます。

MAX10のデュアルコンフィグPOFを自動生成させたい [FPGA]

いまのとこQuartusPrimeは、MAX10のPOFはシングルイメージコンフィグではコンパイルフローで自動で生成されるものの、メモリ初期値付きの圧縮コンフィグとデュアルイメージコンフィグを使う場合はConvert Programming Filesで手作業で変換してやらないといけない。
USB-BlasterとQuartus Programmerでやる分にはSOFを直接流し込めるので、さほど手間ではないのだけれど、Chromeアプリとシリアル経由でコンフィグするPERIDOT Projectでは毎回RPDを生成せねばならず、なかなかに面倒くさい。

なので、MAX10のデュアルイメージコンフィグ用のファイル(POFと書き込み用RPD)を自動で生成するTclを作った。
 → auto_generate_dualboot_rpd.tcl

このtclファイルをプロジェクトフォルダの直下に置き、qsfファイルに以下の一行を追加する。(表示の都合で2行に折り返されてるけどそこは心眼で)

set_global_assignment -name POST_MODULE_SCRIPT_FILE "quartus_sh:auto_generate_dualboot_rpd.tcl"

これでoutput_filesフォルダの下に自動でPOFとRPDが生成される。RPDは4ファイル生成され、各ファイルの内容は以下のとおり。

<project名>_auto.rpd
内蔵フラッシュ全領域のイメージ

<project名>_cfm0_auto.rpd
コンフィグレーション0領域のイメージ

<project名>_cfm1_auto.rpd
コンフィグレーション1領域のイメージ

<project名>_ufm_auto.rpd
ユーザーフラッシュ領域のイメージ

ただしこのTclで生成しているデータではcfm0とcfm1は同一でufmは利用しておらず、実際に使うのはcfm1のRPDだけ。

なお、このtclはMAX10のデュアルイメージコンフィグ専用なので、それ以外のコンフィグモードを使ってるプロジェクトに設定するとエラーで止まると思いまず。

CZGAW93UYAAYyoc.jpg

MAX10の内蔵Flashを書き換える [FPGA]

MAX10のonchip flashコアはUFMセクタのみを使う場合と、CFMセクタも使う場合ではいろいろと作法が違うのでまとめました。
レジスタマッピングやインスタンスの諸々はMAX10フラッシュメモリユーザーガイドを参照のこと。
 → https://www.altera.co.jp/ja_JP/pdfs/literature/hb/max-10/ug_m10_ufm_j.pdf

■altera_onchip_flashコアの設定

基本的にQsysからAvalon-MMで利用する場合、インターフェースはPallarel、バースト長は2(10M04および08)または4(10M16以上)を選択する。
MAX10の内蔵Flashは5つのセクタからなり、アドレスの若い順にUFM1、UFM0、CFM2、CFM1、CFM0と並んでいる。

・UFM1,UFM0

全てのデバイス、全てのコンフィグレーションモードで利用可能。
UFMのみ初期値をConvert Programing Files→Options/Boot infoのUser Flash Memoryセクションで設定できる。
UFM souceでLoad memory fileを選択して、File pathにHEXまたはMIFを設定する。両方とも0x0000からの絶対アドレスで認識するため、アドレスオフセットは適宜調整しておく(特にHEX)。

・CFM2

FグレードおよびAグレードのデバイスでのみ利用可能。
コンフィグレーションモードがSingle Complessed imageまたはSingle Uncomplessed Imageの場合にはユーザー領域として利用することができる。
Dual Complessed imageの場合にはコンフィグイメージ1の領域として利用される。

・CFM1

FグレードおよびAグレードのデバイスでのみ利用可能。
コンフィグレーションモードがSingle Complessed imageの場合にはユーザー領域として利用することができる。
Dual Complessed imageの場合にはCFM2と共にコンフィグイメージ1の領域として利用される。

・CFM0

FグレードおよびAグレードのデバイスでのみ利用可能。
コンフィグレーションモードがDual Complessed imageの場合に利用可能。
コンフィグイメージ0の領域として利用され、ユーザー領域としての利用はできない。


altera_onchip_flashコアに設定するコンフィグレーションモードと、Quartus側のDevice and Pin Options→Configuration→Configuration schemeの設定は一致していなければならない。
またDual Complessed imageを設定した場合、CFM0にはコンフィグイメージ0、CFM1/2にはコンフィグイメージ1を格納するため、ユーザー用メモリとしては利用できない。
なお、コンフィグレーションモードにDual Complessed imageを選択した場合、そのデザインには必ずaltera_dual_bootコアを含めなければならない。


■セクタの消去とプログラミング

セクタの消去はcsrスレーブへのアクセスで行う。
セクタのプロテクトビットと、セクタイレース、ページイレースのビットが同じコントロールレジスタに存在しているため、プロテクトビット解除→イレース指示の2回のレジスタ操作が必要。
イレース発行後はステータスレジスタで消去の完了を確認する。
以下はCFM2セクタのイレースを行うコード例。

IOWR(FLASH_CSR_BASE, 1, 0xfdffffff); // CFM2のプロテクトを解除
IOWR(FLASH_CSR_BASE, 1, 0xfdbffff); // CFM2のセクタイレースを発行
while((IORD(FLASH_CSR_BASE, 0) & 0x3) != 0x0) {} // セクタ消去終了を待つ

if ( (IORD(FLASH_CSR_BASE, 0) & 0x10) ) { // 消去の可否
 printf("Erase CFM2 success.\n");
} else {
 printf("Erase CFM2 failed.\n");
}


セクタのプログラミングは該当のメモリアドレスへ書き込むことで行う。
書き込み先のセクタは予めコントロールセクタの保護ビットを解除しておく必要がある。イレースと異なり、プログラミングの場合は複数セクタの保護ビットをクリアしておくことが可能。
セクタへの書き込みはAvalon-MMマスタから行う場合は書き込み完了までwaitrequestが発行されるため、ステータスレジスタで待ち時間を取る必要はない。ただし、書き込み時にはシングルアクセスで行う必要があり、NiosII /fコア等でバーストアクセスを持つマスタから書き込む場合には正しくシングルアクセスが行われるよう注意すること。
以下はCFM2、CFM1のプログラミングを行うコード例。

IOWR(FLASH_CSR_BASE, 1, 0xf9ffffff); // CFM2,CFM1のプロテクトを解除

for(i=CFM2_START_ADDR ; i<=CFM1_END_ADDR ; i+=4) {
 confdata = bit_reverse_u32(*rpddata++); // 32bit単位でビットを逆順にする
 IOWR_DIRECT32(FLASH_DATA_BASE, i, confdata); // 書き込み実行
 if ( !(IORD(FLASH_CSR_BASE, 0) & 0x8) ) { // 書き込みの可否
  printf("Write to 0x%x failed.\n", i);
  break;
 }
}

IOWR(FLASH_CSR_BASE, 1, 0xffffffff); // 全セクタプロテクト

CFMにコンフィグレーションデータを書き込む場合、Avalon-MMから見えるビット順とコンフィグレーションストリームとして読み出されるビット順が32bit単位で逆になっているので、RPDファイルを書き込む際にビット順を逆にする必要がある。
ビット逆順の操作はコンフィグレーションデータのみに行う。UFMとして使う場合は読み書き共にAvalon-MMのビット順で行われるため不要。


■Dual Complessed imageデータの作成

Dual Complessed image用のコンフィグデータは自動では作られないので、コンパイル後にConvert Programming Filesで専用のPOFを作成する必要がある。
Programming file typeで.pofを選択した状態で、Mode:プルダウンでInternal Configurationを選択する。
UFMに初期値を設定する場合はOptionsボタンのUser Flash MemoryセクションでHEX/MIFを設定する。

Input files to convertタブにSOF Dataを2つ追加する。
ここで追加できるのは両方ともコンフィグレーションスキームでDual Complessed imageを設定したsofのみ。それ以外のsofは設定できない。また、sofを1つだけ設定することもできない。
片方のイメージだけ利用する場合、両方に同じsofを設定してpofを生成する必要がある。

Quartus Programmer以外の手法でCFMを書き換える場合、Create config data RPDにチェックを入れておく。
RPDファイルを生成した場合、全領域用のfoo_auto.rpd、CFM0(イメージ0)用のfoo_cfm0_auto.rpd、CFM1/2(イメージ1)用のfoo_cfm1_auto.rpd、UFM0/1用のfoo_ufm_auto.rpdの4つのファイルが作られる。

Dual Complessed imageを設定する場合にはもう一つ、CONFIG_SELピンの扱いがある。Device and Pin OptionsのGeneralでEnable CONFIG_SEL pinにチェックを外すと、必ずイメージ0のコンフィグで起動する。この場合イメージ1へはイメージ0のaltera_dual_bootコアでリコンフィグレーションすることになるため、CONFIG_SELピンを使用しない場合はdual_bootコアを操作できるAvalon-MMマスタが存在しなければならない。これがないとイメージ0のデータが破損しない限りイメージ1へのスイッチが行われない。
イメージ1のコンフィグを直接ブートする場合は、イメージ0、1両方のデバイス設定でEnable CONFIG_SEL pinにチェックを入れておかなければならない。


■MAX10のコンフィグレーションについて

MAX10の内蔵Flashはaltera_onchip_flashコアを使って書き換える事ができるが、MAX10のコンフィグレーションスキームを書き換えることはできない。例えばDual complessed imageのPOFを書き込んだ後にCFMにSingle Complessed imageを書き込んでもブートできない。
これはMAX10のコンフィグレーションスキームを格納する領域(ICB)はPOFでしか書き込む事ができないため。
altera_onchip_flashコアで行えるのは、あくまで同一コンフィグレーションスキームのデータ差し替えに限定されることに注意しなければならない。


オンラインショップ開設 [FPGA]

PERIDOT CRAFTの常設オンラインショップが開設しました。
 → PERIDOT CRAFTオンラインショップ

ニコ技イベントやMaker Faireなどで販売した在庫や、処分品などのスポット品を取り扱っていきます。
またPERIDOT CRAFTのイベント出展情報などもコチラで発信しますので、週一チェック推奨です。ヨロシク!

shop_banner.png


FPGAマガジン過去記事フォロー [FPGA]

FPGAマガジン1号~3号のNiosII記事のサンプルバイナリをこちらでも公開します。

No.1 cq_viola_v1.zip(1.3Mバイト)

No.2 cq_viola_v2.zip(1.1Mバイト)

No.3 cq_viola_v3.zip(1.2Mバイト)





USB 3.0 × FPGA (FPGAマガジン No.2)

USB 3.0 × FPGA (FPGAマガジン No.2)

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2013/11/27
  • メディア: 単行本



高速Ethernet × FPGA  (FPGAマガジン No.3)

高速Ethernet × FPGA (FPGAマガジン No.3)

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2014/04/12
  • メディア: 単行本



どこでも入店チャイム [FPGA]

先に発売されたFPGAマガジン9号に記事かきました。

FPGAマガジンNo.9 2015年5月号

FPGAマガジンNo.9 2015年5月号

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2015/04/25
  • メディア: 雑誌


本文中では大人の事情により明言されていませんが、ナショナル電工のEC522をFPGAで再現してます。サブカル的にわかりやすく言えばファミマチャイムです。

Githubリポジトリはこちら
github.com/osafune/CQEXT_melodychime

DE0じゃないけど動作してるところ



ところでこのメロディサイン、オリジナルはMN6221DというオルゴールICで作られていて、基本発振やエンベロープはアナログ回路で作られてます。
なので外部回路のつくりかたで結構音色が変わってくるわけですが、今回はニコ技の尻Pこと野尻抱介先生が、過去にニコニコ動画でファミマチャイムが盛り上がった時期に公開された実機からの録音データをリファレンスとして使わせてもらいました。
2009-09-09 ファミマ入店音(野尻blog)

ここのWAV波形から基本周波数とエンベロープの時定数を取っているので、アナログ部分の癖は野尻先生宅のEC522のクローンになってます。

野尻先生といえば「南極点のピアピア動画」にてコンビニエンスストアを舞台にしたSFを書かれています。ちなみに作中のコンビニ(ハミングマート)のチャイムにはアルテラ製FPGAが使われている設定で、その点からいえばこれはファミマチャイムというよりも、作中の「ハミマチャイム」であると言えましょう。

南極点のピアピア動画 (ハヤカワ文庫JA)

南極点のピアピア動画 (ハヤカワ文庫JA)

  • 作者: 野尻 抱介
  • 出版社/メーカー: 早川書房
  • 発売日: 2012/02/23
  • メディア: 文庫


MAX10のUFMでNiosIIをブートする方法 [FPGA]

1.前準備
NiosII Gen2とUFMとメモリをQsysでインスタンスする。
NiosIIのリセットベクタをUFMに割り当てる。Exceptionベクタは適宜。
IDEでプロジェクトを作成。

2.BSPの設定
LinkerタブでrodataセクションとtextセクションをUFMに割り当てる。
bss、heap、rwdata、stackのセクションはメモリに割り当てる。
bsp_linker.png

Settings→Advanced→hal→linkerでallow_code_at_resetとenable_alt_load_copy_rwdataにチェックを入れる。Exceptionベクタをメモリに置いている場合はさらにenable_alt_load_copy_exceptionにもチェックを入れておく。
bsp_settings.png

GenerateでBSPを生成してプロジェクトをビルドする。

3.elfファイルをHEXファイルに変換
IDEでビルドしたelfファイルをメモリ初期値ファイルに変換する。
NiosII Shellを立ち上げてIDEプロジェクトのフォルダへ移動後、次のようにする。

$ elf2hex --base=<UFM先頭アドレス> --end=<UFM終了アドレス> --input=<elfファイル> --output=boot.hex --width=8

UFMは32kバイトのうち、前半16kバイトと後半16kバイトに分かれているが、POFにパッキングするときはまとめて32kバイトとして扱われる。
正しくBSPが設定されている場合、UFMのリセットベクタ(先頭32バイト)に実効コードへのジャンプ命令が追加されている(HEXファイルの2行目のデータフィールドが0で埋まってなければOK)

ちなみにhexファイル名は自由に付けてOK。
注意するのはその後、UFMの要素はバイト列なので --width=8 の指定を忘れないこと。

4.POFファイルを生成
QuartusIIに戻って、File→Convert Programming Files...を選択。

ファイルタイプはPOFを指定。ModeにはInernal Configrationを指定。出力ファイル名を指定して、Add Filesでsofファイルを追加する。
なお、最初にConfigration deviceがEPCEになってないと、ModeのプルダウンにInternal Configrationが出てこないので注意。
conv_sof2pof.png

全部設定できたら、Options/Boot info...をクリックして次へ

UFM sourceをLoad memory fileに変更して、File pathに先ほど生成したhexファイルを指定する。
conv_option.png

全部設定できたらGenerateボタンでPOFを生成する。

5.書き込み
ProgrammerでPOFファイルをMAX10に書き込む。
UFMのみにチェックをつければ、UFM部分だけを書き換えることができる。
programmer.png

デバイスをリブートすればUFMのコードでNiosIIが実行される。

CLIでQuartusIIを使ってみる [FPGA]

通常、Linux版のQuartusIIをインストールするにはX環境が必要なんだけど、サーバーみたいなCLIのみの環境でも使えたのでまとめてみた。
環境はさくらVPSのCentOS 6.3/64bit

1.ダウンロード
まずアルテラのダウンロードページからQuartusII WebEditionのLinux版をダウンロードする。
デバイスライブラリはとりあえずCycloneIVだけ。

2.VPSに転送
SSHでログインして、SCPでcyclone-14.1.0.186.qrzとQuartusSetupWeb-14.1.0.186-linux.runをコピー。
.qrzは.runと同じディレクトリに置いておく。

3.インストール
実行パーミッションを追加してインストーラをテキストモードで起動

$ chmod +x QuartusSetupWeb-14.1.0.186-linux.run
$ ./QuartusSetupWeb-14.1.0.186-linux.run --mode text


4.環境変数を追加
.bashrcにパスを追加してシェルを再起動

PATH="$PATH":<ホームパス>/altera/14.1/quartus/bin

これで

$ quartus_sh --help

を実行してみてヘルプが出てくれば環境構築はOK

5.プロジェクトファイル
今回はサーバー側でコンパイルを走らせるのが目的なので、プロジェクトファイルは別に用意した。
WindowsやLinuxクライアント環境のQuartusIIでプロジェクトを作成し、qsfファイルとソースファイルをftpやscpでVPSの任意フォルダ(ここではqpf_workとする)に転送後

$ cd qpf_work
$ quartus_sh --flow compile <プロジェクト名>

でコンパイル→TimeQuest解析まで実行される。

コマンドラインスクリプトの詳細はQuartusIIハンドブック Vol.2 の Command Line Scripting(英語版PDF)を参照。

Linux環境メインの人はあんまり関係なさげだけども、Windows環境からデータを持っていく場合、日本語コードが混ざってるソースはUTF-8Nにしておくのが無難。
また、.shや.tclなどのスクリプトファイルについては改行コードもCR+LFからLFのみにしておかないと、CRが悪さをすることがあるので注意。

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の制限についてまとめます。