クロック生成
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
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を切り替えます
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ