分频出来的时钟不稳定 问题 请高手指教
从参考时钟153.6MHz, 用计数器分频出16Hz 出来, 最后管脚量的时钟有10ms抖动(附图是示波器打上persistent view)
单独测参考时钟153.6Mhz 很稳定
不明白code哪里有问题 请高手指教
reg [22:0] clk_sync_out_count;
reg clk_sync_out_r;
parameter CLK_div_N1=23'd4799999;
//16Hz output has jitter
always @(posedge refclki or posedge reset)
begin
if (reset == 1'b1)
begin
clk_sync_out_count <= 23'd0;
clk_sync_out_r <= 1'b0;
end
else
begin
if (clk_sync_out_count == CLK_div_N1)
begin
clk_sync_out_r<=~clk_sync_out_r;
clk_sync_out_count <= 23'd0;
end
else
clk_sync_out_count<=clk_sync_out_count+1;
end
end //end alway
OBUF #(
.DRIVE(12),
.IOSTANDARD("DEFAULT"),
.SLEW("SLOW")
) OBUF_inst (
.O(clk_sync_out),
.I(clk_sync_out_r)
);
把reset和refclki都拉出来看看先。
refclki 是稳定的 管脚可以量到reset 没有拉出来看 可以试试弄出来看看
另外做了个实验 分频出9.6MHz 的时钟 时钟是稳定的
我想是不和counter bit数太高 有没有关系
看下有没有如下问题:
1.pll锁定信号是不是一直锁定的?有没有出现失锁现象。
2.时序约束中有没有时序告警?
你的reset管脚是否有高频干扰? 试一试把:
always @(posedge refclki or posedge reset)
改成:
always @(posedge refclki)
因为reset肯定比一个refclki 时钟周期长,不怕检测不到reset。
或者干脆去掉代码中的复位逻辑试一试。
建议你检查一下时序。看静态时序分析的结果
Xilinx FPGA内部有DLL,建议用来同步此种分频出来后的clock 减低 jitter
同意7#建议。使用DLL/DCM/PLL 等内建结构来产生高需求的时钟
那个IP 最低只能做到1MHz , 做不到16Hz
产生9.6MHz 没有问题, refclki 是稳定的 pll 一直lock 没发现跳动refclki 有约束, 16Hz 出来 , 太慢了 我想也不需要需要约束吧 9.6MHz 也没有约束 出来的信号挺好
用PLL分成低频时钟,然后再产生16HZ。
时序有问题,fpga出来的不会这么差!
代码好像没有问题,建议你先仿真,然后看板子结果
一般来说前后仿真对了输出就应该对,如果不对 你就应该查一下你的板子了。
计数器 分段来做,保证你可靠运行
同意
建议如何分段? 有经验值吗?
就是计数器位数不要一下子那么大!可以分成几部分,不然计数器跑不了很高的速度!
#4楼和#6楼的建议你有没有试一试?你的设计能达到这么高的频率吗?
没有试过分这么倍·
信元不够了。
感谢小编分享。蠋蝛蠝癧蛯
感谢小编分享。
clk_sync_out_count == CLK_div_N1改成 clk_sync_out_count > CLK_div_N1试试,或者把输出加 assign clk_out = clk_sync_out_r;
或者分级分频
最大可能还是你时序有问题,150多M的速度不算慢了,你分9.6M计数器组合逻辑小,你分16Hz,计数器组合逻辑大很多,很有可能会不满足。
最好不要用分频的时钟,在系统时钟下产生一个16k时钟的时能信号,替代16k的时钟。
分频的不是组合逻辑,计数器大应该也没有问题啊
我说的是23个cnt的q端出去要经过一堆组合逻辑再loop回到23个cnt的d端。如果只有5个cnt的话这部分组合逻辑就小很多。
Gooooooooooooood。
你选择的芯片支持这么高的时钟输入么?建议看手册确认。
可以试着再分频一次