Menu
Coddy logo textTech

Always Block

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

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

alwaysブロックは継続的に実行されます。シミュレーションが開始されると、永遠に繰り返されます。フリップフロップ、カウンター、Combinationalロジックなど、動作し続ける必要があるハードウェアを記述するために使用されます。

基本構文:

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

@(sensitivity_list)は、blockがいつ実行されるかを指定します。これがなく(かつ、内部に#5のような遅延もない)場合、blockは無限ループしてシミュレーションが停止します。

Always blockの例: Counter

ここでは、always blockを使用してcounterを作成する方法の例を示します。

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

このコードの仕組み

部分意味
alwaysこのコードを繰り返し、永遠に実行する
@(posedge clk)clock が 0 から 1 になるまで待つ(rising edge)
count <= count + 1count の現在の値を取得し、1 を加えて、再び保存する

block は clock の every rising edge ごとに runs します。毎回、count は 1 増加します。

@(posedge clk) の sensitivity list は、連続的にではなく、clock のエッジでのみ実行するよう指示します。これがないと、ループは遅延なしで forever 実行されます。

複数の信号を使用するalwaysブロック

特定の信号を一覧にできます:

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

これは when a または b changes すると実行されます。

challenge icon

チャレンジ

Add the missing always block to make this module work.

仕組み:

  • 各 rising clock edge で、out1 は 0 から 1、または 1 から 0 に切り替わります
  • out2out1 に follows します(out1 と同じ値になります)

行うこと:

  1. always @(posedge clk) ブロックを Add します
  2. その中で、out1 を切り替えます(out1 = ~out1 を使用します)
  3. out2out1 と等しくします

自分で試してみよう

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オンラインコンパイラ