Menu
Coddy logo textTech

Clock Generation

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

クロックは、一定の間隔で0と1の間を継続的にtoggleする信号です。クロックは、フリップフロップやカウンターなどの順序論理に不可欠です。

なぜクロックを生成するのか

テストベンチでは、順序回路をテストするためにクロックが必要です。クロックは、フリップフロップ、レジスタ、ステートマシンの動作を駆動します。

クロックを生成する方法

方法説明
always# 遅延最も一般的な方法
forever ループ代替方法
repeat ループ固定回数の cycles に使用

方法1:遅延を伴うalwaysブロック

reg clk;

initial begin
  clk = 0;
end

always #5 clk = ~clk;
  • clk = 0(時刻 0)
  • 5 time units ごとに、clk が切り替わる
  • Period = 10 time units
  • Frequency = 1/10 = 0.1 per time unit

方法 2:無限ループ

reg clk;

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end

alwaysメソッドと同じ結果です。

方法 3:固定サイクル数だけ繰り返す

reg clk;

initial begin
  clk = 0;
  repeat (10) begin
    #5 clk = ~clk;
  end
end

正確に 10 個のクロックエッジ(5 完全サイクル)を生成してから停止します。

challenge icon

チャレンジ

4 time units ごと(period = 8 time units)に切り替わる clock を生成するために、不足しているコードを追加してください。

実行すること:

  1. initial block を使用して、time 0 で clk を 0 に初期化する
  2. delay を伴う always block を使用して、4 time units ごとに clk を切り替える

自分で試してみよう

module clock_challenge;
  reg clk;
  
  // TODO: ステップ1 - clk = 0 に設定する initial ブロックを追加
  
  
  // TODO: ステップ2 - 4 時間単位ごとに clk をトグルする always ブロックを追加
  

  initial begin
    $monitor("Time %0t: clk = %b", $time, clk);
    #20;
    $display("Clock generated for 20 time units");
    $finish;
  end
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

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