前面分别介绍了偶数和奇数分频(即整数分频),接下来本文介绍小数分频。
对于要求相位以及占空比严格的小数分频,建议采用模拟电路实现。 而使用数字电路实现只能保证尽量均匀,在长时间内进行分频 。
在讨论小数分频之前,先问一个问题:设计中是否真的需要50%占空比的时钟
在回答这个问题之前,可以先回顾之前我们写过的RTL设计,可以看一下之前的RTL设计代码中always块是不是大部分都是@(posedge clk)。 对于绝大多数的触发器,其实只需要用到时钟的上升沿触发,很少用到下降沿。 在这种情况下,只要上升沿和时钟频率有关系,什么时候来下降沿不重要! 所以50%的占空比不是必须的 。
因此在小数分频器中我们关注的是如何得到一个尽量均匀的分频信号,而不是得到一个绝对50%占空比的分频信号。
下面以4.5倍的分频(非50%占空比)作为例子介绍,即每9个参考时钟包含2个对称脉冲。 下面是4.5分频的设计步骤。
①:使用复位值为000000001的9位移位寄存器,可以在每个时钟上升沿使移位寄存器循环左移一位。
②:要产生第一个脉冲,必须使在半周期时移动第一位并将第一位与第二位进行或操作。
③:要产生第二个脉冲,第5位和第6位必须在半周期时移动并与原始第6位进行或操作。
注意:所有这些移位都是用来保证输出波形不含毛刺的必要条件。
上面产生的时钟占空比为40%,并且输出的时钟完全不含毛刺。
always@(posedge clk or negedge rst_n)
if(!rst_n)
cnt[9:1] <= 9'b000000001;
else
cnt[9:1] <= cnt[9:1] << 1;
always@(negedge clk or negedge rst_n)
if(!rst_n)begin
count1 <= 1'b0;
count5 <= 1'b0;
count6 <= 1'b0;
end
else begin
count1 <= cnt[1];
count5 <= cnt[5];
count6 <= cnt[6];
end
assign clkout = (cnt[6] | count5 | count6) |
(cnt[0] | cnt[1] |count1);
全部0条评论
快来发表一下你的评论吧 !