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 步:添加 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Verilog 在线编译器