Menu
Coddy logo textTech

クロック生成

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

クロックは、一定の間隔で0と1の間を連続して切り替える(toggle)信号です。クロックは、フリップフロップやカウンタなどの順序回路において不可欠です。

クロックを生成する理由

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

Clockを生成する方法

Method説明
# 遅延を伴う always最も一般的な方法
forever ループ代替方法
repeat ループ固定 cycles 数用

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

reg clk;

initial begin
  clk = 0;
end

always #5 clk = ~clk;
  • 時刻0で clk = 0
  • 5時間単位ごとに、clk が反転(toggle)します
  • Period = 10 time units
  • 周波数 = 1/10 = time unit あたり 0.1

手法2: Forever Loop

reg clk;

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

always メソッドと同じ結果になります。

方法 3: 固定サイクル数の repeat

reg clk;

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

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

challenge icon

チャレンジ

4 time units ごとに toggle する Clock(Period = 8 time units)を生成するために不足しているコードを Add してください。

作業手順:

  1. initial block を使用して time 0 で clk を 0 に初期化する
  2. ディレイを伴う always block を使用して 4 time units ごとに clk を toggle する

自分で試してみよう

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腕試し

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

基礎のすべてのレッスン