MAX10でNiosII動かしてみた(追記あり) [FPGA]

連休中は台風19号接近のため、予定していた九州慰安旅行がキャンセルになってしまいました。
なので、ずっとMAX10ボードをいじっていたわけですが。

前回で書き込みファイルはできるようになったので、今回はNiosIIをMAX10で動かしてみます。
QuartusIIでプロジェクトを作成してQsysでコンポーネントを追加するのはそのままですが、MAX10では旧来のNiosIIはサポートされていないので、Gen2をインスタンスする必要があります。
max10nios2_00.png

NiosII Gen2では、コアの種別が/eコアと/fコアの2種類になりました。
max10nios2_01.png

これまでの/sコアはどうなったのかというと、/fコアのカスタマイズで/sコア相当のものが作れるようになっています。
逆にこれまでできなかった、/sコアにあとデータキャッシュだけ欲しい、という細かい設定が可能になりました。
/fコア自体も、ECCメモリによるエラー保護や高速割り込みに対応したシャドウレジスタ機能など、細かいアップデートが施されています。

また、Gen2ではメモリタイプのペリフェラルに紐付けされていたベクタアドレスを、絶対値アドレスで設定できるようになりました。
max10nios2_02.png

Qsysでは生成したコンポーネントをさらにQsysで再利用できますが、これまでNiosIIを内蔵したコンポーネントではペリフェラル名のオフセットでベクタが指定されてしまうため、プログラムを外部に置くようなシステムコンポーネントが作りづらかったのが、独立したMPUとしても扱えるようになりました。

(追記) >‥‥と書いててなんですが、どうもNiosII Gen2 /fコアのデータキャッシュを使うと、IORD/IOWRによるマクロが上手く動作しないようです。特にIORDでのレジスタポーリングが致命的で、コンパイラはldwio命令を生成しているものの、挙動を見る限りデータキャッシュがバイパスされていない模様です。
どうやら基板裏に実装したSDRAMのバーストアクセスでごくまれにリードミスを起こしている模様。ロジックのせいではないようです。 → MAX10ボードがそろそろ限界(2014-11-01)


そんなNiosII Gen2ですが、実際の使い勝手は旧来のNiosIIとまったく同じです。
いつもの通り、100MHzのシステムクロックと、40MHzのペリフェラルクロックを生成して、NiosIIコアと内蔵メモリとペリフェラルを生成します。

ペリフェラルはいつもの通り、sysid、timer、jtag-uart、それからLEDとDIPスイッチを読むIN/OUTのPIOと、MAX10 EVKボード上のArduinoシールドコネクタピンに直結しているBidir-PIOをつけました。

ペリフェラルアクセスにはクロックドメインを跨ぐ必要がありますが、Avalon-MM Pipeline Bridge でまとめてペリフェラルクロックへドメインをまとめます(ちなみに Avalon-MM Clock Crossing Bridge を使わないのは、ペリフェラル側はバーストアクセス不要なのでLEをケチるため)。


途中いろいろすっ飛ばしてLチカをしてみたのがこちら


さらに途中をすっ飛ばして、SDRAMコントローラとVGAコンポーネントを追加してHDMIに絵を出してみたのがこちら