連載
FPGAでのLチカをVerilog HDLで理解する:MAX 10 FPGAで学ぶFPGA開発入門(3)(1/5 ページ)
今回はFPGAでのLチカを例に、FPGA開発に必要なハードウェア記述言語の解説をしたい。用いる「Verilog HDL」はArduinoやCの経験がある方なら、理解そのものはそう難しくないと思う。今回も連載で使う「MAX 10 FPGA 評価キット」の読者プレゼントをご用意。
前回(「MAX 10 FPGA」のテスト環境を構築する)はではMAX 10 FPGAとQuartus II、それにUSB Blasterを使って簡単にソースコードを書き換えるところまでご紹介した。今回はもう少し中身を説明したいと思う。
下のリストが前回も説明した、Lチカのソースコードとなる。記述はQuartus IIがサポートするVerilog HDLでのものだ。
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: Axelsys // Engineer: Greg Miller // // Create Date: 11:21:08 08/21/2014 // Design Name: LED // Module Name: LED_Verilog // Project Name: Altera MAX10 Breakout Board // Target Devices: 10M08SAE144C7G // Tool versions: 14.0 // Description: // LEDs, D1 through D5 will blink on for 1/2 second and off for 1/2 second. // Clock is operating at 50MHz. // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module LED_Flash_all( input clk, output LED1, output LED2, output LED3, output LED4, output LED5 ); 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 clk) 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 LED1 = dec_cntr ; assign LED2 = !dec_cntr ; assign LED3 = dec_cntr ; assign LED4 = !dec_cntr; assign LED5 = dec_cntr ; endmodule
まず冒頭の"`timescale 1ns / 1ps"は、実はLチカの動作とは全く無関係である。これはQUartus IIから呼び出されるシミュレータで利用されるもので、意味としてはns単位の割り込み(例えば開始後12.5142ns後に入るとする)をps単位に丸める(開始後12514psに割り込みが入る)という意味である。ということで無視してもらいその後に来るのがコメントだが、これも見れば分かると思うので説明は割愛する。
Copyright © ITmedia, Inc. All Rights Reserved.