List 2: //======================================================= // This code is generated by Terasic System Builder //======================================================= module NEEK_LED( //////////// CLOCK ////////// input ADC_CLK_10, input MAX10_CLK1_50, input MAX10_CLK2_50, input MAX10_CLK3_50, //////////// LEDR ////////// output [9:0] LEDR, //////////// HEX ////////// output [6:0] HEX0, output [6:0] HEX1, //////////// PS2 ////////// inout PS2_CLK, inout PS2_CLK2, inout PS2_DAT, inout PS2_DAT2 ); //======================================================= // REG/WIRE declarations //======================================================= reg[22:0] div_cntr; reg[3:0] dec_cntr; reg[9:0] disp_cntr; //======================================================= // Structural coding //======================================================= initial begin div_cntr = 0; dec_cntr = 0; disp_cntr = 0; end always@(posedge MAX10_CLK1_50) begin div_cntr <= div_cntr + 1; if (div_cntr == 5000000) begin dec_cntr <= dec_cntr + 1; disp_cntr<= 1<<dec_cntr; if (dec_cntr == 10) begin dec_cntr <= 0; disp_cntr <= 0; end end end assign LEDR = disp_cntr; endmodule
おおむね昔のLチカに近いが、一応意図を説明しておけば、外部からは50MHzでクロックが入ってくるので、これを50万回(つまり5M回)ごとにカウントし、内部のdec_cntrというレジスタをインクリメントするとともに、どのLEDを表示するかを定めるdisp_cntrというレジスタを書き換えるというものだ。
LEDは全部で10個なので、dec_cntrが10になったら0に戻している。disp_cntrの方は、右から左にLEDが流れるようにシフト演算の形で1の値の位置を移動している。これをassignでLEDR(LED出力)に割り当てて完了である。
これをコンパイルすると特に問題なく生成されるはず(筆者のマシンだと46秒ほど要した)なので、Programmerを使って書き込んでやると完了である(Photo20)。プログラミングが終わると、こんな具合にLEDが流れるように点滅するはずだ(Movie02)。
ということで今回はMAX 10 NEEKを紹介した。来月はここにNIOS IIも組み込んで、もう少し本格的に取り組んでみたい。
Copyright © ITmedia, Inc. All Rights Reserved.