【QuartusII入門】LED点灯回路の作成4(寄り道:Verilogの解説2, TB_LED_BLINK)

前回に引き続き今回はテストベンチのVerilogソースについて解説していきます。

テストベンチのソースはこんな感じでした。

`timescale 1 ns/ 1 ps
module tb_led_blink();

reg clk;
reg reset_n;
wire [7:0] led;

led_blink i1 (
.clk(clk),
.led(led),
.reset_n(reset_n)
);

always #10 clk <= !clk;

initial
begin
clk <= 1'b0;
reset_n <= 1'b1;
#100 reset_n <= 1'b0;
#100 reset_n <= 1'b1;

end
endmodule


 

上から順番に行きましょう。

`timescale 1ns / 1ps

前回同様、シミュレーションの時間の単位と精度を設定します。
このテストベンチでは時間指定をする際にns単位で指定することになります。

 

module tb_led_blink();

~中略~

endmodule

同じくモジュール宣言。
テストベンチは内部で完結するので、入出力ポートの宣言はありません。

 

reg clk;
reg reset_n;
wire [7:0] led;

led_blink i1 (
.clk(clk),
.led(led),
.reset_n(reset_n)
);

レジスタ/ワイヤ宣言とテストに使うモジュールの宣言。
一般的にテストに使われるモジュールへの入力はreg,
出力はwireを使います。

入力の値はテストベンチ上で変更するため、値を代入できるregを使うことが多いです。
(※wireを使うこともあります。)

 

led_blink i1 (
.clk(clk),
.led(led),
.reset_n(reset_n)
);

led_blinkの機能をもつi1と言う名前のモジュールを置く。
led_blinkのモジュールを複数置く場合は重複しない名前をつけます。
モジュールが違っても同じ名前はつけられません。

 

.clk(clk),
.led(led),
.reset_n(reset_n)

led_blinkはclk, led, reset_nと言う3つのポートを持っていました。
各ポートにregのclk, reset_nとwireのledを繋ぎます。

今回は名前が同じになるようにしていますが、ポート名と実際に入出力する信号名が異なっていても問題ありません。

 

always #10 clk <= !clk;

また出ましたalways文。
ここの#10と言うのが特定時間待つための指定子です。
(シミュレーション限定です。実際にコンパイルしてハードウェアにすることはできません。)

今回はtimescaleが1nsなので、10nsごとにこのalways文が実行されます。
10ns毎にclkの値を反転させる、と言う構文になります。
2回反転させて1周期のクロックになるので、クロックの周期は20ns(=周波数が50MHz)と言う事になります。

 

initial
begin
clk <= 1'b0;
reset_n <= 1'b1;
#100 reset_n <= 1'b0;
#100 reset_n <= 1'b1;

end

最後にinitial文。
これもシミュレーション限定です。
シミュレーションの開始時から順番に実行されます。

 

今回の場合、

clk <= 1'b0;
reset_n <= 1'b1;

この部分で入力の値を初期化します。

 

#100 reset_n <= 1'b0;
#100 reset_n <= 1'b1;

次にこの部分で、100ns待ってからreset_nを0(=L)にします。
これで回路i1がリセットされます。
さらに100ns後、reset_nを1(=H)にすることで、回路i1の初期化が終了し、
回路が動作を開始します。

 

ちなみにinitial文で値が初期化されるまでregの値は不定値xになります。
ModelSimだと波形が赤くなります。
そのままだと回路が正しく動作しないので、シミュレーションでは必ずinitial文で初期化しましょう。

初期化が終わるとalways文でclkが正しく反転を始めます。

 


以上がテストベンチの解説となります。
もっと複雑な回路になると入力信号を作るためのモジュールなども必要になってくると思います。

次回は実際にFPGAに書込むためのピンの設定から説明していきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です