为什么以下时钟乘法 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 个问题。
sys_clk_tp
的初始值为0.0。因此,您的 always 块会进入无限的 0 延迟循环。时间不能提前
- 您正在对
t1,t2
使用非阻塞赋值,因此计算 t1-t2
时 t2 仍为 0
- 您正在使用
$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,请联系您的铸造厂。
我正在尝试生成一个时钟,它是系统时钟的 (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 个问题。
sys_clk_tp
的初始值为0.0。因此,您的 always 块会进入无限的 0 延迟循环。时间不能提前- 您正在对
t1,t2
使用非阻塞赋值,因此计算t1-t2
时 t2 仍为 0
- 您正在使用
$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,请联系您的铸造厂。