Menu
CoddyTech

Alwaysブロック

CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 46/90。

手続きブロックとは、CやPythonのようなソフトウェアプログラミング言語と同じように、文が順番に実行されるコードのブロックです。Verilogには2種類の手続きブロックがあります。initial(1回だけ実行)とalways(継続的に実行)です。まずはalwaysブロックから始めましょう。

alwaysブロックは継続的に実行されます。シミュレーションが始まると、無限に繰り返されます。フリップフロップ、カウンター、組み合わせ論理など、動作し続ける必要があるハードウェアを記述するために使われます。

基本構文:

always @(sensitivity_list) begin
  // 繰り返し実行されるコード
end

@(sensitivity_list)は、ブロックをいつ実行するかを指定します。これがなく(また、その中に#5のような遅延もない)場合、ブロックは無限ループに陥り、シミュレーションが停止してしまいます。

alwaysブロックの例:カウンター

alwaysブロックを使ってカウンターを作成する方法の例を示します。

module counter (
  input clk,
  output reg [3:0] count
);
  always @(posedge clk) count <= count + 1;
endmodule

このコードの仕組み

部分意味
alwaysこのコードを永続的に繰り返し実行する
@(posedge clk)クロックが0から1に変わる(立ち上がりエッジ)のを待つ
count <= count + 1countの現在の値に1を加え、その値を再び保存する

このブロックはクロックの立ち上がりエッジごとに実行されます。そのたびに、countが1増えます。

感度リスト @(posedge clk) は、連続的にではなくクロックエッジでのみ実行するよう指示します。これがないと、ループは遅延なく永久に実行されます。

複数の信号を使うAlwaysブロック

特定の信号を列挙できます。

always @(a or b) begin
  out = a & b;
end

aまたはbが変更されたときに実行されます。

challenge icon

チャレンジ

このモジュールが動作するように、不足しているalwaysブロックを追加してください。

仕組み:

  • クロックの立ち上がりエッジごとに、out1が0から1、または1から0に切り替わります
  • out2はout1に追従します(out1と同じ値になります)

やること:

  1. always @(posedge clk)ブロックを追加します
  2. その中で、out1を切り替えます(out1 = ~out1を使用します)
  3. out2をout1と同じ値にします

自分で試してみよう

module toggler (
  input clk,
  output reg out1,
  output reg out2
);

  initial begin
    out1 = 0;
    out2 = 0;
  end

  // TODO: posedge clkを使用したalwaysブロックを追加する
  // out1はクロックごとに反転する
  // out2はout1に追従する

endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ