Menu
CoddyTech

クロック生成

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

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

クロックを生成する理由

テストベンチでは、順序回路をテストするためにクロックが必要です。クロックは、フリップフロップ、レジスタ、状態機械の動作を制御します。

クロックを生成する方法

方法説明
always と # 遅延最も一般的な方法
forever ループ代替方法
repeat ループサイクル数が固定の場合

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

reg clk;

initial begin
  clk = 0;
end

always #5 clk = ~clk;
  • clk = 0 時刻 0 に
  • 5 時間単位ごとに、clk が切り替わる
  • 周期 = 10時間単位
  • 振動数 = 1/10 = 時間単位あたり0.1

方法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 時間単位ごとに切り替わるクロック(周期 = 8 時間単位)を生成するため、不足しているコードを追加してください。

やること:

  1. initial ブロックを使って、時刻 0 で clk を 0 に初期化します
  2. 遅延を指定した always ブロックを使って、4 時間単位ごとに 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オンラインコンパイラ