クロック生成
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 71/90。
クロックは、一定の間隔で0と1の間を継続的に切り替わる信号です。クロックは、フリップフロップやカウンタなどの順序回路にとって不可欠です。
クロックを生成する理由
テストベンチでは、順序回路をテストするためにクロックが必要です。クロックは、フリップフロップ、レジスタ、およびステートマシンの動作を駆動します。
クロックを生成する方法
| 手法 | 説明 |
|---|---|
always と # 遅延 | 最も一般的な手法 |
forever ループ | 代替の手法 |
repeat ループ | 固定サイクル数の場合 |
方法 1: 遅延を伴う Always ブロック
reg clk;
initial begin
clk = 0;
end
always #5 clk = ~clk;- 時刻 0 で
clk = 0 - 5 時間単位ごとに
clkが反転します
- 周期 = 10 時間単位
- 周波数 = 1/10 = 0.1 / 時間単位
方法 2: forever ループ
reg clk;
initial begin
clk = 0;
forever begin
#5 clk = ~clk;
end
endalways メソッドと同じ結果になります。
手法 3: 固定サイクル数の繰り返し
reg clk;
initial begin
clk = 0;
repeat (10) begin
#5 clk = ~clk;
end
end正確に10個のクロックエッジ(5サイクル分)を生成し、その後停止します。
チャレンジ
4時間単位ごとにトグルする(周期 = 8時間単位)クロックを生成するために、不足しているコードを追加してください。
手順:
initialブロックを使用して、時刻 0 でclkを 0 に初期化します。- 遅延を伴う
alwaysブロックを使用して、4時間単位ごとにclkをトグルさせます。
チートシート
クロックは一定の間隔で0と1の間を切り替わります。周期 = 2 × 遅延。
方法 1: Alwaysブロック (最も一般的)
reg clk;
initial begin
clk = 0;
end
always #5 clk = ~clk; // 周期 = 10方法 2: Foreverループ
initial begin
clk = 0;
forever #5 clk = ~clk;
end方法 3: Repeat (固定回数のエッジ)
initial begin
clk = 0;
repeat(10) #5 clk = ~clk; // 10エッジ = 5サイクル
end自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。