連載
» 2015年11月13日 07時00分 公開

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

[大原 雄介,MONOist]

出力をArduino I/Oとしたプログラム

 プログラムそのものは前回利用したLチカプログラムをそのまま流用して、List 2の様にしてみた。修正点は「クロック信号の表記をclkからClockに変更」「出力をArduino_IO13のみにする」の2点である。間違いがなければ、あっさり動作するハズだ(Movie01)。

module LED_Flash2(
	//Clock from oscillator
	input Clock,
	//Arduino I/Os
	inout Arduino_IO13
);
	reg[15:0] div_cntr1;
	reg[9:0] div_cntr2;
	reg dec_cntr;
	reg half_sec_pulse;
	
	initial begin
		div_cntr1 = 0;
		div_cntr2 = 0;
		dec_cntr  = 0;
		end
		
	
	always@(posedge Clock)
		begin
		div_cntr1 <= div_cntr1 + 1;
		if (div_cntr1 == 0) 
			if (div_cntr2 == 762) 
				begin
				div_cntr2 <= 0;
				half_sec_pulse <= 1;  
				end
			else
				div_cntr2 <= div_cntr2 + 1;
		else
			half_sec_pulse <= 0;
		
		if (half_sec_pulse == 1)	
			dec_cntr <= !dec_cntr;
			
		end	
		
		
	assign Arduino_IO13 = dec_cntr ;
endmodule
List2

 さて、この状態で点灯間隔はどの程度になるかをオシロスコープでちょっと確認してみた。前回で説明した通り、On/Offの周期は厳密には65536×763=500173968サイクルとなる。クロックは50MHzなので、周期は1.000348秒という事になる。

 1周期の波形を見てみるとこんな感じ(Photo03)で、ほぼ1秒っぽく見えるが、これは解像度不足というか、1周期分で判断するのは無理っぽい。そこで150周期分を一気に表示してみたのが下の画像だ(Photo04)。150周期で150.125秒ほどになり、1サイクルあたり1.0008333……秒となる。本来の周期より若干長い理由は、1つはオシロスコープの精度の問題だが、もう1つ別の理由もある。これは後述することにしたい。

横軸は200msecで、ほぼ1秒ごとにOn/Offを繰り返している様に見える Photo03:横軸は200msecで、ほぼ1秒ごとにOn/Offを繰り返している様に見える
ここまで縮小すると、カーソルを1ピクセル移動するだけで数十ミリ秒の変化になるので、精度はあまりよろしくない Photo04:ここまで縮小すると、カーソルを1ピクセル移動するだけで数十ミリ秒の変化になるので、精度はあまりよろしくない

Copyright © ITmedia, Inc. All Rights Reserved.