できないことはできない

ただのメモの置き場所

MAX10でNiosを動かす

さてNiosを動かします。

AlteraのFPGAは最近触り始めたばかりなので、Niosのことはよくわからないけどいろいろやってたら動いたのでまとめてみます。

XilinxMicroblazeはI2Cを動かすためだけに1度だけ使ったあの経験が役に立ったのか立たなかったかは謎。

今回はNiosでLEDをチカチカさせます。マクニカのブログを見ながらやった時に気になったことなどをちょこっと書きつつ。

Qsys編

QuartusのQsysを起動してポチポチやります。追加するIPはマクニカのOdysseyのブログを参照しましょう。 基本的にデフォルトでだいたいOKなのですが、on chip memoryだけはデフォルトのサイズだとNiosの実行ファイルが入りきらないので適当なサイズにする必要があります。これはクソ仕様だと思う。

f:id:i8087:20160502213410j:plain

XilinxXPS or IP IntegratorでMicroblazeを作ろうとするとある程度の構成を提示してくれて、それを自分でカスタムすることができたけど、 Alteraはイチからポチポチやらないとダメっぽい。意外と面倒だし接続ミスが極稀にあるからやっぱりXilinxの方が好き。

あと割りとイライラしたのは、ポチポチやったけどナンダカエラーが消えないことがたまにある。そんなときはF5を押して更新すると消えることがある。多分再読み込みをするんだと思う。

上図のエラーはそれとは関係なく、単にBase Addressが設定されていないだけ。どうしてもこのアドレスを使いたい、ということがなければ自動的に割り振りましょう。

上のメニューバーの「System」→「Assign base Address」で自動的に割り振ってくれます。 f:id:i8087:20160502214510p:plain

実行後。まだエラーが残っています。 f:id:i8087:20160502214654j:plain

これはNiosの設定でResetがかかったときにどのアドレスから開始するのか指定されていないというエラーメッセージ(だと思う)。

Niosの設定画面を開いてOn Chip Memoryを指定しましょう。 f:id:i8087:20160502214909p:plain

エラーメッセージが無くなってQsysの構成は完了です。Saveしましょう。 f:id:i8087:20160502215158j:plain

この作成したQsysのプロジェクトをインスタンスするためにGenerateします。Qsysウインドウの右下のGenerateをポチッと。ラッパーデザインやSimulationファイルや合成に必要なファイルを生成してくれます。

f:id:i8087:20160502215517j:plain

エラーがでたら残念。どこかで良くないことをしています。エラーメッセージを見ながら頑張りましょう。

Qsysをインスタンス化する場所に書きましょう。

u0 : component nios_m10
port map (
 clk_clk                            => CLK,  -- clk.clk
 pio_in_external_connection_export  => PB0,  -- pio_in_external_connection.export
 pio_out_external_connection_export => LED1  -- pio_out_external_connection.export
);

これでHDL側は終わり。

おまけ:Niosの実行ファイルの埋め込み

順番が前後してしまうのですが、次で説明するNios EDSで作成した実行ファイルのようなもの(メモリの初期値:.hex)をQuartusでコンパイルするときに自動で読み込んでsofファイルに埋め込んでくれるやり方があります。

ネットにごろごろ転がっているNiosの作成方法だと、Quartusの「File」→「Convert Programming file」でhexファイルを指定して・・・という方法が紹介されているけど、これだとコンパイルする度にやらないとダメので面倒。

そんな面倒なことはしたくないので、自動で生成するようにします。 Qsysでon chip memoryの設定画面を開きます。 f:id:i8087:20160502220940p:plain 下の方のMemory Initializationで、Initialize memory contentをチェックします。これでOK! 自動でNiosのプロジェクトの出力ファイルの場所を探してくれるみたいですが、Alteraはまだ全然信用していないので、自分で指定します。Enable non-default initialization fileをチェックしてmemory_initの下にあるhexファイルを指定します。

あとはQuartusでAssemblerをしたときに生成されてるpofファイルを書き込んで上げればOK。これはMAXだけじゃなくてPROMでも使えるはず。

Xilinxはプロジェクトにelfファイルを追加するだけで全部やってくれるんだけどね・・・。Nios周りは本当に残念なところが多い。

Nios EDS側

QsysからでもQuartusからでも直接プログラム一覧からでも良いのでNios EDSを起動します。Nios EDSという名のEclipseが立ち上がります。

File→New→Nios II Board Support Packageを選択。 f:id:i8087:20160502222124p:plain ちなみにBoard Support Package(BSP)が先ほど作成したQsysのIPコアのファイルやBase Addressなどが入ったものになります。そのBSPでこれから作成するアプリケーションが動くイメージです。

後はウィザードを進めていきます。 f:id:i8087:20160502222652p:plain Project neme:適当 SOPC Information file name:先ほど作成したQsysのファイル 後はそのまま。

「SOPC Information file name」に作成したQsysのファイルを指定すると「CPU:」の部分がQsys内で指定したniosの名前になっていると思います。

f:id:i8087:20160502223015p:plain

適当にHello Worldを。 f:id:i8087:20160502223026p:plain

f:id:i8087:20160502223113p:plain

hello_world.cを編集します。詳しくはマクニカのodysseyブログで。 完全にコピペするだけ。で、Shift+F9でビルドします。 f:id:i8087:20160502223316p:plain

するとエラーがでます。よく読んでみると、メモリが足りないっぽい。このブログの最初の方でクソ仕様と言ったデフォルトのon chip memoryのサイズのことはこれです。 f:id:i8087:20160502223414p:plain 3672Byteオーバーフローしてると言っているのでon chip memoryのサイズを4KByte+3672Byte=7672Byte以上にする必要があります。

Qsysに戻って値を修正。 f:id:i8087:20160502223935p:plain ちょーてきとーに1024x10KBにします。 設定したらsaveしてGenerateします。

Nios EDSに戻って再度コンパイル。 の前にBSPを再読込します。BSPにマウスを合わせて右クリック、Nios II→Generate BSP Qsys側に変更があったら必ず実行してください。じゃないと漏れ無くエラーになります。 f:id:i8087:20160502224315p:plain

気を取り直してShit+F9でビルド。無事ビルドできました。 f:id:i8087:20160502224439p:plain

Run ConfigurationsでUSB Blasterを認識させます。Refresh ConnectionでOK。 f:id:i8087:20160502225217j:plain

わかりにくですが、LED0が前回の記事のカウンターの値で光るLED、LED1がNiosを経由して点灯させたLEDになります。 f:id:i8087:20160502225147j:plain

ちゃんと光りました。めでたしめでたし。


niosがちゃんと動いたし、実装基板が来るまでのデバッグはこのOdysseyでやると格段に効率上がりそう。 というか現在進行形でやってるけど、かなり良い感じ。MAX10のサイズ的に全てのモジュールは同時に入らないけど、個々モジュールの検証ならできるので、かなりいい感じ。ただModelsimの使い方が分からなくて実機に逃げただけだけど・・・。