クロック生成
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
endalways メソッドと同じ結果になります。
方法 3: 固定サイクル数の repeat
reg clk;
initial begin
clk = 0;
repeat (10) begin
#5 clk = ~clk;
end
end正確に 10 回のクロックエッジ(5 完全サイクル)を生成し、停止します。
チャレンジ
4 time units ごとに toggle する Clock(Period = 8 time units)を生成するために不足しているコードを Add してください。
作業手順:
initialblock を使用して time 0 でclkを 0 に初期化する- ディレイを伴う
alwaysblock を使用して 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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。