0

我正在尝试生成一个时钟,它是系统时钟的(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一旦功能正常,它将被实施。请帮忙?

4

2 回答 2

1

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

  1. sys_clk_tp的初始值为0.0。所以你的 always 块进入一个无限的 0 延迟循环。时间无法前进
  2. 您正在对 使用非阻塞赋值t1,t2,因此在评估时 t2 仍然为 0t1-t2
  3. 您正在使用$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
于 2018-09-27T06:04:33.210 回答
0

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

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

  • #算子只在模拟中有效。它在合成过程中被忽略。

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

如果您的目标是 ASIC,请联系您的代工厂。

于 2018-09-27T06:13:43.937 回答