前言:众所周知,分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如altera的PLL,Xilinx的DLL.来进行时钟的分频,倍频以及相移。但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以达到对时钟操作的目的。另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语言的理解程度。在数字系统的设计中,设计人员会遇到各种形式的分频需求,如偶数分频、奇数分频、半整数分频、小数分频和分数分频等。在某些设计中,系统不仅对频率有要求,而且对占空比也有严格的要求。由计数器或计数器的级联构成各种形式的偶数分频及非等占空比的奇数分频实现起来较为简单,但对半整数分频及等占空比的奇数分频实现较为困难,小数分频和分数分频更困难。整数分频器偶数分频器的设计较为简单,可以利用计数器实现。假设要实现m=2n分频,当计数器的值为0~j-1时,输出时钟为1,计数器的值为j~2n-1时,输出时钟为0,在计数器值为2n-1时复位计数器,如此循环下去,即可实现占空比为j/2n的分频,m和j都是预置数,j用于调节占空比,m调节分频系数。m的值不同,分频系数也就不同,如果预置数m是奇数则可实现占空比不等于50%的奇数分频。占空比为50%的奇数分频实现起来较为困难,实现的方法较多,主要有三种办法:1:对两个相差为90的占空比最接近50%的N分频计数器输出进行或运算。假设要实现占空比为50%的m=2n+1分频,选择两个2n+1进制计数器控制两个中间时钟clk1和clk2,1号计数器在输入时钟clk的上升沿计数,2号在clk的下降沿计数。当计数器1输出为0~n-1时clk1为1,输出为n~2n时clk1为0且计数器1输出为2n时计数器1清0,如此循环下去;当计数器2输出为0~n-1时clk2为1,输出为n~2n时clk2为0且计数器2输出为2n时计数器2清0,如此循环下去。可见2种计数器实现方法一样,只是翻转的边沿不一样,最终输出的时钟clkout=clk1+clk2。占空比为50%的奇数分频。2:先2N分频,再倍频实现50%占空比。倍频的方法是相移90度进行异或运算。两个相位差为90度的2N分频输出信号进行异或,从而得到占空比50%的奇数N分频电路。下图中TFF为T触发器,输入为1时,进行翻转,这样就可以得到两路2N分频的信号D0,D1。TFF0的输入为1发生在Cal=时,有一个周期的延迟,即当Cal=1时,D0翻转。在Cal=N+1时,再次翻转。为使D1有90度的相移,需要在(N+2)/2处翻转,为此我们在(N+1)/2处使TFF1输入为1,并在(N+2)/2采样,这里正好对应着下降沿,所以采用下降沿采样。3:对进行奇数倍n分频时钟,首先进行n/2分频(带小数,即等于(n-1)/2+0.5),然后再进行二分频得到。得到占空比为50%的奇数倍分频。详细见半整数分频。半整数分频1:模N+1计数,然后翻转触发时钟扣除半个脉冲,脉冲周期剔除法进行n+0.5分频一般需要对输入时钟先进行操作。其基本设计思想是:首先进行模n的计数,在计数到n时,将输出时钟赋为'1',而当回到计数0时,又赋为0,这样,当计数值为n时,输出时钟才为1,因此,只要保持计数值n为半个输入时钟周期,即可实现n+0.5分频时钟。因此,保持n为半个时钟周期即是该设计的关键。从中可以发现,因为计数器是通过时钟上升沿计数,故可在计数为n时对计数触发时钟进行翻转,那么,时钟的下降沿就变成了上升沿。即在计数值为n期间的时钟下降沿变成了上升沿,也就是说,计数值n只保持了半个时钟周期。由于时钟翻转下降沿变成上升沿,因此,计数值变为0。所以,每产生一个n+0.5分频时钟的周期,触发时钟都要翻转一次。需要设计一个分频系数为N-0.5的分频器,其电路可由一个模N计数器、一个二分频器和一个异或门组成,如图7-1所示。在实现时,模N计数器可设计成带预置的计数器,这样就可以实现任意分频系数为N-0.5的分频器。异或门模N计数器f0/(N-0.5)二分频器f0/(2N-1)f0通用半整数分频器小数分频小数分频器的实现方法很多,但其基本原理一样:在若干个分频周期中采取某种方法使某几个周期少计一个或几个数,即吞脉冲原理,从而在整个计数周期的总体平均意义上获得一个小数分频比。如设计一个分频系数为10.1的分频器时,可以将分频器设计成9次10分频,1次11分频,这样总的分频值为:F=(9×10+1×11)/(9+1)=10.1双模前置小数分频器假设时钟源的频率为F0,期望得到的频率为F1,则其分频比X有X=F0/F1其中,X1。若MXM+1,M为整数,则有其中,N1和N2均为整数。当N1和N2取不同的正整数时,从N2/(N1+N2)可以得到任意一个小数,就可以从理论上实现任意小数分频比的分频.从工程角度可以进一步构造出下列关系:它有明确的物理意义,它的右边实际上是个多位累加器。当分频比X为无限小数时,例如把13MHz的时钟信号分频为11MHz时,x=1118181818⋯,此时,尽管在理论上可以设计这样的多位累加器,但在实际电路中却是不可实现的。因此,实际所设计的双模前置小数分频器的分频比,有时候与实际期望得到的分频比存在一个微小的偏差;当分频器长时间工作,就会导致累计误差。这样的设计在理论上是可行的,但在实际的电路设计中,却由于硬件电路的微小延时,在选择M分频和M+1分频时钟输出的切换点上,就可能存在竞争冒险而产生毛刺,这是时钟信号所不能够容忍的。采用63次9-10分频,2次9分频就可以得到占空比及抖动有很大提高的时钟。脉冲删除小数分频利用脉冲删除电路,有规律地删除时钟源中的一些脉冲,从而实现平均意义上的小数分频。利用脉冲删除电路,就不会出现上述竞争冒险和毛刺的问题,而且可以很容易地用硬件实现任意小数分频。令式(1)中的分子M×N1+(M+1)×N2=P,分母N1+N2=Q,则其中,P、Q均为整数。从式(3)可以分析得到,当时钟源每输入P个脉冲,利用脉冲删除电路从这P个脉冲中按照一定的规律删除(P-Q)个脉冲,输出Q个脉冲,便实现了平均意义上的X分频.这个电路主要由脉冲删除电路和控制删除逻辑电路两个部分组成,见图2。其中,控制删除逻辑电路是根据P和Q的值,对时钟源输入脉冲数进行计数控制,按照一定的规律发出脉冲删除控制信号。脉冲删除电路就是一个简单的或门,脉冲删除控制信号delete为高电平时,表示从时钟源clk中删除一个脉冲。但脉冲删除控制信号delete必须由时钟源clk的上升沿触发产生,这是由于硬件电路具有微小延时的原因。脉冲删除具体设计思路如下:删除(P-Q)个脉冲,设置一个计数器,令其初始值为0;在时钟源clk的每一个上升沿,计数器加上Q,若计数器里面的值小于P,则发出删除一个脉冲的信号,将delete置为高电平;若其值大于P,则将计数器的值减去P,并且将delete置为低电平,不发出删除脉冲的信号。当分频系数X满足1X2时,不会出现连续扣除两个脉冲的现象;而当X2时,则一定会出现连续扣除两个脉冲的现象。可以先对时钟源进行M分频,将M分频得到的时钟再用上述扣除脉冲的方法进行X/M分频,从而可得到X分频的时钟。