时钟生成
本课属于 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 个完整周期),然后停止。
挑战
补充缺失的代码,生成一个每隔 4 个时间单位切换一次的时钟(周期 = 8 个时间单位)。
操作步骤:
- 使用
initial块在时间 0 将clk初始化为 0 - 使用带延迟的
always块,每隔 4 个时间单位切换一次clk
亲手试试
module clock_challenge;
reg clk;
// TODO:第 1 步:添加 initial 块,将 clk 设置为 0
// TODO:第 2 步:添加 always 块,让 clk 每隔 4 个时间单位翻转一次
initial begin
$monitor("Time %0t: clk = %b", $time, clk);
#20;
$display("Clock generated for 20 time units");
$finish;
end
endmodule这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Verilog 在线编译器