若干長い理由はともかくとして、正確に1秒にならないのは、そもそも正確に50Mサイクルを数えるのではなく、65536×763サイクルを数えているためである。では正確に50Mサイクル数えたらどうなるか?というのが下の「List 3」である。List 2と見比べてもらってもループの数が1個減って分かりやすくなったと思う。
List 3: module LED_Flash2( //Clock from oscillator input Clock, //Arduino I/Os inout Arduino_IO13 ); reg[25:0] div_cntr; reg dec_cntr; initial begin div_cntr = 0; dec_cntr = 0; end always@(posedge Clock) begin div_cntr <= div_cntr + 1; if (div_cntr == 50000000) begin dec_cntr <= !dec_cntr; div_cntr <= 0; end end assign Arduino_IO13 = dec_cntr ; endmodule
カウンタは26bitになったが、これは50,000,000まで数えるには25.58bitが必要なためである。ただList 2ではdiv_cntr1が16bit、div_cntr2が10bitで結局26bit分を使っているので、実はここで差は無い。このやり方の場合、カウンターの周期をオシロスコープで見てみると148周期で147.962secほどになり(Photo05)、1周期の時間は0.9997秒と1秒を切ってしまったのだが、これはオシロスコープ側の精度の限界(カーソル機能の精度が足りない)であり、実際は148secに非常に近いと思われる。
ただし、当然ながらその代償もある。Photo06はこのケースでの回路全体のマップをQuartus IIのツール「Technology Map Viewer」で表示したものだ。前回に比較すると、相当長くなっているのが分かる。
要するにカウンタのデコードが、前回のケースだと65536はシンプルなデコーダ(16bitが全部1になっていればいい)で済み、763のみ“1011111011”のデコードが必要になるのでちょっと複雑、というものだったのが、今回は50000000=“10111110101111000010000000”のデコードが必要になり、これによって回路が大規模化しているという訳だ。
リソースの比較をして見るとこれは分かりやすい。Photo07がもとのLED Flashにおける構成でのリソース利用率、Photo08がList 3でのリソース利用率で、ロジックエレメントを5つほど余分に消費している。これが大問題か?といわれると、全体で8064個もロジックエレメントがあるうちの45個と50個だから、大きな違いではないのだが。
Copyright © ITmedia, Inc. All Rights Reserved.