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不会产生掉链子)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)