求基于Quartus II的奇数分频器源程序

求基于Quartus II的奇数分频器源程序,第1张

//任意奇数分频器,只需要将n改为你想要的奇数即可。

module any_odd_div (clkdiv,clk)

output clkdiv  //输出分频信号

 input clk      //时钟信号

 reg[2:0]cnt1,cnt2//计数器1,计数器2

 reg clk_temp1,clk_temp2

 parameter n = 7  //7分频

 

 always @(posedge clk)

 begin

  if(cnt1 == n-1)

   begin cnt1 <=3'b000end

  else

   begin cnt1 <= cnt1 +1'b1end

  if(cnt1 ==3'b000)

   begin clk_temp1 =1'b1end

  if(cnt1 ==(n-1)/2)

   begin clk_temp1 =0end

 end

 

 always @(negedge clk)

 begin

  if(cnt2 == n-1)

   begin cnt2 <=3'b000end

  else

   begin cnt2 <=cnt2 +1'b1end

  if(cnt2 ==3'b000)

   begin clk_temp2 =1end

  if(cnt2 ==(n-1)/2)

   begin clk_temp2 =0end

 end

 

 assign clkdiv = clk_temp1 | clk_temp2

 

 endmodule

补充一下,如果是大于7的奇数分频情况,不仅需要改变分频参数n,同时还需要将寄存器的位数按分频数作相应的调整。

如果对时序没要求,完全可以不用PLL,而且PLL未必成功。她不是做这件事的!

之所以分频不成功,是因为进位链路太长,延迟超过了1/1M,导致末级未翻转,CY已经改变,或者接近临界状态。解决办法是:<1>先搞个12进制计数器,再用12进制计数器的末级作为下个计数器的时钟源(4-bit

counter,modulo=0x0C,T=20.8ns

进位链延迟超过20.8ns就会掉链子。很容易发生的哟...);

<2>用这个时钟源触发余下的4M计数器即可(22-bit

counter,modulo=0x3D0900,T=250ns不会产生掉链子)。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7885128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存