FPGAソフトコアCPUにおける最適化を検証する:MAX 10 FPGAで学ぶFPGA開発入門(14)(4/7 ページ)
MAX10搭載開発ボード「MAX 10 NEEK」でソフトコアCPU「NIOS II」を利用する際、最適化しないことを推奨されるが、設定自体は施せる。では最適化すると速くなるのか?有償版も含めて検証する。
簡単にソースを説明すると、まず先頭のTicks/startTick/finishTickはベンチマーク時間測定用のGlobal変数である。次のHextable[]はLED表示用のTableだが、全消灯を示す3ffを新たに追加した。次のKeyFlagと2つのDefinitionはキーのOn/Offに絡むものだ。
その下のRec_pointer型の定義〜NUMBER_OF_RUNSの手前まではdhry_1.cの中身をそのままコピーであるが、画面表示などは行わないので必要ないものは抜いている。NUMBER_OF_RUNSは文字通り、Dhrystoneを何回まわすかの定義だ。
LEDR_outは10個のLED列を点灯/消灯するもので、これは前回(http://monoist.atmarkit.co.jp/mn/articles/1608/10/news045_5.html)と全く同じだが、次のHEX_out2桁まとめて表示(00〜99)すると同時に、-1が来たら全消灯するように変更した。別に深い意味はなく、単に見栄えの問題である。
次のAlarm_Intは、Timer_1msで割り込みが入ると立ち上がる割り込みルーティンである。Tickは無条件で1ms毎にカウントアップする変数で、時間測定はこのTickを参照する形にしたが、これとは別にこの中でKEYの値を見るようにした。これによりユーザーの操作がすぐ反映されるようになっている。
さて、dhry()は、元々はdhry_1.cの中にあるmain()であるが、繰り返し数を決めうち&結果の表示を全て取っ払ってすっきりさせた形だ。void型で宣言した通り、特に戻り値などは見ていない。Proc_1()〜Func_3()まではdhry_1.cとdhry_2.cの中身をそのままコピーしており、改変はしていない。
最後がmain()で、まずLED表示の初期化後、alt_alarm_start()を呼び出して1msのタイマーを有効にしている。そのあとはwhile()の中でキー1が押されたらFLAGを1に、キー2が押されたらFLAGを0にし、そしてFLAG=1なら1回(=NUMBER_OF_RUNSで実行した数だけ)dhrystoneを実行して所要時間を表示する(この時間測定のために、dhry()の先頭と最後で、そのその時点のTickの値をstartTickとfinishTickに保存している)。LEDは右端を、Dhrystone実行中の間だけ点灯、2桁の7セグメントLEDはDhrystone実行後にループ100回分の所要時間(ms)を表示している。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- FPGAの内蔵温度センサーから値を得る
アルテラのFPGA「MAX 10」には温度センサーが内蔵されており、自身の温度を測定可能だ。メガファンクション「ALTPLL」を使い、内蔵センサーからの値を得るまでを試みる。 - オンボードされた温湿度センサーからFPGAで値を得る
FPGA「MAX 10」搭載開発ボード「MAX 10 NEEK」には各周辺機器が備えられており、そこにはTI製の温湿度センサーも含まれる。サンプルプログラムを元に、オンボードされたデバイスの制御を試みる。 - 「MAX 10 NEEK」でストップウォッチを開発し、内蔵メモリから起動する
アルテラのFPGA「MAX 10」を搭載した開発ボード「MAX 10 NEEK」にはLEDやフラッシュメモリなどの各周辺機器が備えられている。今回はLEDを使ったストップウォッチを開発し、内蔵メモリから起動する。 - 「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の制御までを紹介する。