連載
FPGAのLED制御プログラムを深く理解する:MAX 10 FPGAで学ぶFPGA開発入門(4)(2/5 ページ)
FPGA開発に必要なHDLへの理解を深めるため、MAX 10に用意されているArduino I/Oを利用してのLチカを行い、多灯LEDの制御を含めたプログラミングも解説する。今回も連載で使う「MAX 10 FPGA 評価キット」の読者プレゼントをご用意。
出力を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
Movie01
さて、この状態で点灯間隔はどの程度になるかをオシロスコープでちょっと確認してみた。前回で説明した通り、On/Offの周期は厳密には65536×763=500173968サイクルとなる。クロックは50MHzなので、周期は1.000348秒という事になる。
1周期の波形を見てみるとこんな感じ(Photo03)で、ほぼ1秒っぽく見えるが、これは解像度不足というか、1周期分で判断するのは無理っぽい。そこで150周期分を一気に表示してみたのが下の画像だ(Photo04)。150周期で150.125秒ほどになり、1サイクルあたり1.0008333……秒となる。本来の周期より若干長い理由は、1つはオシロスコープの精度の問題だが、もう1つ別の理由もある。これは後述することにしたい。
Copyright © ITmedia, Inc. All Rights Reserved.