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

FPGAでのLチカをVerilog HDLで理解するMAX 10 FPGAで学ぶFPGA開発入門(3)(2/5 ページ)

[大原 雄介,MONOist]

module宣言

 さて、ソースの最初に出てくるのがmodule宣言である。この場合はLED_Flash_allというモジュール名をつけている(ユニークであればなんでもいい)のだが、ここで入出力はclkというinput、それとLED1〜5というoutputがあることを示している。

module LED_Flash_all(
    input clk,
    output LED1,
    output LED2,
    output LED3,
    output LED4,
    output LED5
    );
Module入出力宣言

 つまりFPGAには(電源以外だと)Clock信号のみが入力され、LED駆動出力5本が出てくるという仕組みだ。このmodule宣言と対をなすのが、リストの最後にあるendmoduleで、この間に挟まれたブロックは全て、ここで宣言したinputとoutputしか(外部に出す信号としては)使えないことになる。

 余談になるが、きちんと文法的に正しく書くのであれば

module LED_Flash_all(
    input wire clk,
    output wire LED1,
    output wire LED2,
    output wire LED3,
    output wire LED4,
    output wire LED5
    );

 とした方が良い。input/outputは入出力だが、次の"wire"は配線を示す。つまり信号線の形でつながっている事を明示的に示すもので、これに対比されるのが"reg"(レジスタ)である(Quartus IIではここでwireを省いても問題はないのだが)。ちなみに当然ながらclkやLED1〜5は何れも1bitの変数として扱われ、保持できる値としては0か1ということになる。

レジスタ定義

 さて、これに続いてレジスタ定義部が来る。

	reg[15:0] div_cntr1;
	reg[9:0] div_cntr2;
	reg dec_cntr;
	reg half_sec_pulse;
レジスタ定義

 これは内部でカウンタを使う際に利用するもので、物理的な実体は内部のラッチである。レジスタも当然黙っていると1bit幅になるので、もっと幅が欲しい場合には、例えばdiv_cntrl1の様に

reg[15:0] div_cntrl1;

 といった指定を行うことになる。こうするとMSBが15、LSBが0となる16bit幅のレジスタが確保される(要するにラッチが16個並ぶ)事になる。これもまた変数として扱える事になる。

Copyright © ITmedia, Inc. All Rights Reserved.