「MAX 10 NEEK」でストップウォッチを開発し、内蔵メモリから起動する:MAX 10 FPGAで学ぶFPGA開発入門(11)(7/10 ページ)
アルテラのFPGA「MAX 10」を搭載した開発ボード「MAX 10 NEEK」にはLEDやフラッシュメモリなどの各周辺機器が備えられている。今回はLEDを使ったストップウォッチを開発し、内蔵メモリから起動する。
List 4解説
List 3からの変更点は、alt_alarm関数への対応、それとキー入力への対応である。
まずKEY_START/KEY_HOLD/KEY_STOP/KEY_RESETという4つの定義が出てくるが、これはKEY 0〜KEY3の4つのキーそれぞれへの対応である。今回の場合、IORD_ALTERA_AVALON_PIO_DATA(KEY_BASE) を呼ぶとキーの状態が5bitの形で返ってくるが、0bit目がKEY 0、1bit目がKEY 1...となっており、それぞれに対応した形だ。
新しくAlarm_Int()という関数が追加されているが、これはAlarmで呼び出されるCallback関数だ。今回の場合、Alarmは1msにセットされている(つまりAlarm_Int()は1ms毎に呼び出される)事になるので、内部でカウンタを回して100回(つまり100ms)経過したらNum(0.1秒単位のカウンタ)を1つ増やし、それにあわせてLEDと7セグメントLEDの表示を行って戻るだけの処理を行う。
一方メインルーティンだが、while(1)の中でまずキーの値を読み取り、何かしらキーが押下されていた(7セグメントLEDと同じく、押されていないと1、押されると0がbitfieldに返ってくる)ら、それにあわせてAlarmをストップしたりスタートしたり、あるいはカウンタ(TickとNum)をクリアしたり、といった処理を行っているだけである。
余談になるが、先にPhoto03のキャプションでこのKEYの入力についてはEdge Captureを最終的に無効にしたと書いた。本来この機能は、割り込みと組み合わせて使うものだ。Photo03を見ると「Interrupt」という項目があって、必要ならキーの押下を検出して割り込みを発生させることができる。この際、押しっぱなしにすると延々割り込みが発生するのはまずいので、押された瞬間を検出しようというわけだ。
ところが今回の様にポーリングで検出する場合、押された瞬間があまりに一瞬すぎるためにほぼ取りこぼす。そんな訳で今回は「押されている」という状態を検出するようにしたわけだ。
さらに余談になるが、こうした確認にはprintfデバッグが有効である。ところがメモリが64KBだとprintfが動かない(厳密にいえば、printf ("Hello, world\n");は動作するが、printf( "Hello, %d", 100);はメモリが足りずにビルドに失敗する)ため、128KBにしたというわけだ。
さて、あとはビルドして実行させるだけである。実行結果はこんな感じ(Movie02)である。ボタンは右からSTART/HOLD/STOP/RESETに設定されており、7セグメントLEDで秒を、10個のLEDで0.1秒をそれぞれ示している。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 「MAX 10 NEEK」に搭載されたDDR3メモリを使う
MAX10搭載開発ボード「MAX 10 NEEK」には各周辺機器が備えられており、その中にはDDR3メモリも含まれる。ソフトコアCPU「Nios II」からの利用も含めて手順を紹介する。 - 「MAX 10 NEEK」へソフトコアCPUを組み込む
周辺機器の充実したMAX10搭載開発ボード「MAX 10 NEEK」に、ソフトコアCPU「NIOS II」を組み込み、ソフトコアCPUからボード搭載LEDの制御までを紹介する。 - 周辺機器の充実した「MAX 10 NEEK」で本格的な開発を目指す
FPGA開発において周辺機器(回路)は見落とせない要素の1つ。タッチパネルや各種出入力などを備えた「MAX 10 NEEK」を導入して、本格的な開発を目指す。 - FPGAのソフトコアCPUをベンチマークで測定する
FPGA「MAX10」に「NIOS II」と呼ばれるソフトIPコアを導入することで、ソフトコアCPUを構築できる。ではその処理能力はどれほどか。ベンチマークソフトで測定してみよう。 - FPGA上でソフトコアCPUを動かす手引き
これまでFPGAの開発基礎としてLチカなどを紹介してきたが、今回はちょっと目先を変えてFPGA上でのCPUコア動作に取り組む。今回も連載で使う「MAX 10 FPGA 評価キット」の読者プレゼントをご用意。