一、偶数分频
以上是实现2、4、10分频的Verilog实现代码及仿真结果时序图,分析一下:
对于2这样的简单分频实现,直接在输入时钟的每个上升沿取反即可,时序图中可见clk_div2就是在clk时钟的每个上升沿取一次反,如此两个时钟周期取反一次,得到的新时钟自然是原时钟的2分频;
4分频可以在2分频的基础上再作一次2分频,即可得到原时钟的4分钟,注意代码中实现4分频时是在2分频时钟的时钟上升沿进行取反;
类似10分频这样分频系数过大的情况,就需要对分频系数N循环计数进行分频,在计数周期达到分频系数中间数值N/2时进行时钟翻转,可保证分频后的时钟占空比为50%,可见代码中定义了一个计数器cnt,它的作用就是在每个时钟上升沿计数一次,每当计数到N/2-1时清零,同时时钟翻转一次,如此就相当于原时钟每隔5个周期状态翻转一次,得到的新时钟周期即原时钟周期的十倍,即实现了10分频。
二、奇数分频
奇数分频若不要求占空比,可以按照如上所述方式实现任意整数分频,若要实现50%占空比分频,则可以利用源时钟双边沿特性、采用“与操作”或“或操作”实现
或操作调整占空比:时序图如下
1、利用源时钟上升沿分频出高电平为1个周期、低电平为2个周期的3分频时钟;
2、利用源时钟下降沿分频出高电平为1个周期、低电平为2个周期的3分频时钟;
3、两个3分频时钟应该在计数器相同数值、不同边沿下产生,相位差半个时钟周期,两者相或即可得到占空比50%的3分频时钟
下面给出一段实现50%占空比、9分频的代码示例及时序图
代码中可以看到,依旧是首先提供一个计数器,计数到分频系数N-1,清零、重复下一计数过程;
DIV_CLK>>1是移位操作,二进制数9移位得到二进制数4,当计数器计数到3时,时钟赋0;当计数器到8时,时钟赋1,即实现在计数器值在4~8时给时钟低电平、0~3时给时钟高电平(当然,计数器每个值对应一个时钟周期),如此即实现利用源时钟上升沿得到一个4个周期高电平、5个周期低电平的9分频时钟;
类似的操作实现利用源时钟下降沿得到一个4个周期高电平、5个周期低电平的9分频时钟,注意在产生这两个9分频时钟的过程中,它们是在计数器相同数值、不同边沿下产生的,相位相差半个周期而已,最后对这两个9分频时钟相或即可得到占空比50%的9分频时钟。
与操作调整占空比:时序图如下
1、利用源时钟上升沿分频出高电平为2个周期、低电平为1个周期的3分频时钟;
2、利用源时钟下降沿分频出高电平为2个周期、低电平为1个周期的3分频时钟;
3、两个3分频时钟应该在计数器相同数值、不同边沿下产生,相位差半个时钟周期,两者相与即可得到占空比50%的3分频时钟
类似地给出一段实现50%占空比、9分频的代码示例及时序图