我正在尝试生成一个系统时钟的(3/16)时钟。因此,我决定从系统clk生成一个3x时钟,然后从该时钟生成(1/16)x时钟。
现在,我只能生成3倍时钟。我这样做是通过计算系统时钟的时间周期,然后在该周期的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
可以正常运行。
请帮忙吗?
答案 0 :(得分:1)
您的代码有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
答案 1 :(得分:0)
您试图做的是徒劳的。即使您设法使其在仿真中正常工作,它也不会合成:
$realtime
函数仅在仿真中可用。它不能用于综合;如果需要实时时钟,则需要自己制作。
#
运算符仅在仿真中有效。在合成过程中会被忽略。
如果要在FPGA上倍增时钟信号,大多数FPGA都有时钟管理硬宏(通常是DLL或PLL),可用于此目的。有关详细信息,请查阅目标零件的参考手册。
如果您要定位ASIC,请与您的代工厂联系。