FPGAのLED制御プログラムを深く理解するMAX 10 FPGAで学ぶFPGA開発入門(4)(3/5 ページ)

» 2015年11月13日 07時00分 公開
[大原 雄介MONOist]

正確に1秒間隔とするために

 若干長い理由はともかくとして、正確に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
List3

 カウンタは26bitになったが、これは50,000,000まで数えるには25.58bitが必要なためである。ただList 2ではdiv_cntr1が16bit、div_cntr2が10bitで結局26bit分を使っているので、実はここで差は無い。このやり方の場合、カウンターの周期をオシロスコープで見てみると148周期で147.962secほどになり(Photo05)、1周期の時間は0.9997秒と1秒を切ってしまったのだが、これはオシロスコープ側の精度の限界(カーソル機能の精度が足りない)であり、実際は148secに非常に近いと思われる。

一応147.962secということになっているが、有効数字は小数以下1桁程度と思われる Photo05:一応147.962secということになっているが、有効数字は小数以下1桁程度と思われる

 ただし、当然ながらその代償もある。Photo06はこのケースでの回路全体のマップをQuartus IIのツール「Technology Map Viewer」で表示したものだ。前回に比較すると、相当長くなっているのが分かる。

「無駄に長い構成」(筆者談) Photo06:「無駄に長い構成」(筆者談)
こちらは前回の単純なLチカ回路 こちらは前回の単純なLチカ回路

 要するにカウンタのデコードが、前回のケースだと65536はシンプルなデコーダ(16bitが全部1になっていればいい)で済み、763のみ“1011111011”のデコードが必要になるのでちょっと複雑、というものだったのが、今回は50000000=“10111110101111000010000000”のデコードが必要になり、これによって回路が大規模化しているという訳だ。

 リソースの比較をして見るとこれは分かりやすい。Photo07がもとのLED Flashにおける構成でのリソース利用率、Photo08がList 3でのリソース利用率で、ロジックエレメントを5つほど余分に消費している。これが大問題か?といわれると、全体で8064個もロジックエレメントがあるうちの45個と50個だから、大きな違いではないのだが。

ELの消費量。まだまだ余裕 Photo07:まだまだゆとりはある
List3でのEL消費量 Photo08:ちょっとだけ無駄づかい

Copyright © ITmedia, Inc. All Rights Reserved.