为什么以下时钟乘法 Verilog 代码对我不起作用?

Why is the following clock multiplication Verilog code not working for me?

我正在尝试生成一个时钟,它是系统时钟的 (3/16)。因此,我决定从系统 clk 生成一个 3x 时钟,然后从中生成 (1/16)x 时钟。 现在,我坚持只生成 3x 时钟。我通过计算系统时钟的时间周期然后每 1/6 周期切换 3x 时钟来做到这一点。但是我的模拟永远停滞不前。我没有在任何地方使用 forever 块,我已经检查过了。因此没有计时结构。 以下是我正在处理的代码。

module eec_clk_gen (
    input logic arst,
    input logic sys_clk,
    output logic eec_clk
);

real t0;
real t1;
real sys_clk_tp;


logic eec_clk_x3;


//Calculating clock period of sys_clk
initial
begin
    @(posedge sys_clk) t0 = $realtime;
    @(posedge sys_clk) t1 = $realtime;
    sys_clk_tp = t1 - t0;
end



//Generating clock at 3 times sys_clk freq

initial
begin
    @(posedge sys_clk) eec_clk_x3 = 1'b1;
end

always
begin
    #(sys_clk_tp/6) eec_clk_x3 <= ~eec_clk_x3;
end

endmodule: eec_clk_gen

我不担心我的代码中缺少 arst 信号。一旦 eec_clk 起作用,它将被实施。 请帮忙?

您的代码有 2 个,可能是 3 个问题。

  1. sys_clk_tp的初始值为0.0。因此,您的 always 块会进入无限的 0 延迟循环。时间不能提前
  2. 您正在对 t1,t2 使用非阻塞赋值,因此计算 t1-t2
  3. 时 t2 仍为 0
  4. 您正在使用 $time 而不是 $realtime 如果您的输入时钟由于不同的时间尺度而有任何小数延迟,$time 会截断。 我愿意

`

initial
     begin
        @(posedge sys_clk) t0 = $realtime;
        @(posedge sys_clk) t1 = $realtime;
        sys_clk_tp = t1 - t0;
        forever  #(sys_clk_tp/6) eec_clk_x3 = ~eec_clk_x3;
    end

你的努力是徒劳的。即使你设法让它在模拟中工作,它也永远不会合成:

  • $realtime功能仅在模拟中可用。它在合成中不可用;如果你需要一个实时时钟,你需要自己制作。

  • #运算符只在模拟中有效。综合时忽略。

如果您想在 FPGA 上倍增时钟信号,大多数 FPGA 都有时钟管理硬宏(通常是 DLL 或 PLL),可用于此目的。有关详细信息,请参阅目标部件的参考手册。

如果您的目标是 ASIC,请联系您的铸造厂。