さて、ソースの最初に出てくるのが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 );
つまり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.