MAX10搭載開発ボード「MAX 10 NEEK」には各周辺機器が備えられており、その中にはDDR3メモリも含まれる。ソフトコアCPU「Nios II」からの利用も含めて手順を紹介する。
先月も触れた、MAX 10 Evaluation BoardとTempSensorの話であるが、やっと問題が解決したので最初にこちらの話をしておきたい(MAX 10 FPGAで学ぶFPGA開発入門(9):「MAX 10 NEEK」へソフトコアCPUを組み込む)。
経緯を説明すると、アルテラのWebサイトで提供されるMAX 10 Evaluation Board用のサンプルである「Nios II On-die Temperature Sensor Design Example」(現在は存在しない:理由は後述)をダウンロードし、マニュアルの手順に従って構築する際、Quartus II 14.1を使う限りにおいては正常に動作するのだが、Quartus II 15.0、あるいはQuartus Primeを利用するとNIOS IIコアが正常に動作しないという現象が出ていた。この件に関して、Alteraより正式に原因と対処に関しての連絡を頂いた。
そもそも動かない原因は2つあり、1つはBSPの再ビルドが必要だった事、もう1つはADCの初期化コードが含まれていなかった事だ。1つ目については前回紹介した通り、TempSensor_bspの再構築を実施すればよい。問題は2つ目だ。
アルテラによれば、ADCに対してまず初期化の際に割り込み禁止を実施する必要があるとの事。ただしこれがAlteraのドキュメントから欠落しており、またサンプルコードにもこの割り込み禁止を行う処理が抜けていた。この結果、NIOS IIが起動してADCを有効にした途端、ADCからの割り込みが発生する事になる。悪い事に今回のサンプルでは割り込みハンドラが無いので、割り込みが発生してもユーザープログラムに制御が一切戻らないという事になっていた。
対策であるが、現在のサンプルでは初期化ルーティンが
//Starting the ADC sequencer IOWR(MODULAR_ADC_0_SEQUENCER_CSR_BASE, 0, 0); usleep(10); IOWR(MODULAR_ADC_0_SEQUENCER_CSR_BASE, 0, 1);
となっている。これを
//Starting the ADC sequencer IOWR(MODULAR_ADC_0_SEQUENCER_CSR_BASE, 0, 0); usleep(1000); IOWR(MODULAR_ADC_0_SAMPLE_STORE_CSR_BASE, 64, 0); IOWR(MODULAR_ADC_0_SEQUENCER_CSR_BASE, 0, 1);
と変更する事で解決できるとの話であった。この3行目に追加された "IOWR(MODULAR_ADC_0_SAMPLE_STORE_CSR_BASE, 64, 0);" が、ADCに割り込みの発生を禁止させる設定である。これを入れたところ、正常に動作するようになった(Photo01)。
ちなみになぜQuartus II 14.1で動作したのかであるが、Quartus IIでは明示的に初期化していない設定値をどう扱うか、に関してバージョン毎に異なっているのだそうで、「たまたま」Quartus II 14.1ではADCの割り込みを無効化する初期値になっていた。だが、Quartus II 15.0以降ではこれが変わってしまっていた、という事が真相の様だ。
既にこのNios II On-die Temperature Sensor Design Exampleは“Nios II On-die Temperature Sensor Design Example 2”(15.0用、15.1用)としてアップデートされており、こちらでは問題は解決している。またADCのドキュメントへの反映を現在本国に依頼中との事で、新しくサンプルをダウンロードすれば問題は解決する筈だ。ということで、やっと一件落着である。
Copyright © ITmedia, Inc. All Rights Reserved.