分频器是FPGA设计中使用频率非常高的基本设计之一,尽管在目前大部分设计中,广泛使用芯片厂家集成的锁相环资源,如altera 的PLL,Xilinx的DLL.来进行时钟的分频,倍频以及相移。但是对于时钟要求不高的基本设计,通过语言进行时钟的分频相移仍然非常流行,首先这种方法可以节省芯片内部的锁相环资源,再者,消耗不多的逻辑单元就可以达到对时钟操作的目的。另一方面,通过语言设计进行时钟分频,可以看出设计者对设计语言的理解程度。
本文将介绍三种分频方式,这三种分频方式包括:基本2分频法、脉冲计数法、相位偏移法,通过这三种方式将能够实现绝大部分的分频需求,也能够大大节约FPGA芯片的锁相环资源。
2 信号分频的分类
一般地,通常的信号分频方式分类包括占空比为50%的分类和占空比不为50%的分类,由于在用verilog HDL语言对FPGA编程的过程中无法同时在一个进程中对信号的上升沿和下降沿同时进行监测,所以在技术的实现方式上还存在偶次分频和奇次分频的差异。在本文中,将从基本的2分频讲到占空比不为50%的奇次分频的具体实现的策略,以及部分规律的总结。
3 各种分频策略以及其适用的范围
3.1 基本2分频法
我们采用一个always进程对clk时钟信号进行监测,每当clk上升沿或下降沿时我们取反一次out(输出信号)的取值。这样我们就能够实现对clk的2分频。
本方法可以进行迭代,我们可以取out1做中间变量对clk进行2分频,然后再对out1进行同样的2分频,这样就可以得到我们需要的4分频。
我们可以得到结论,,我们通过对clk的2分频的n次迭代,我们就可以得到2^n次分频。
3.2 脉冲计数法
利用2分频我们能够得到一些我们需要的偶次分频,但是没法实现所有的偶次分频,比如6分频、30分频等。我们在实现这一类分频的时候我们需要采用上升沿(下降沿)计数的方式对clk进行分频。
我们在编程时需要定义一个寄存器类型的变量count进行计数,如果我们需要进行2n次分频,那么我们就在count计数到n时把输出信号out取反并且把count清零并重新计数。比如6分频的具体代码实现如下:
3.3 相位偏移法
由于在FPGA的编程实现中,无法同时在一个进程内对上升沿和下降沿进行监测,,所以在占空比为50%的奇次分频的实现上需要不同的解决方案。通常采用两个相位上相差半个时钟周期的2n次分频的中间信号变量相或得到,这就是利用相位偏移法实现的分频策略。
经过总结我们能够得到以下的规律:
我们把半个时钟周期当做一个单位长度,那么2n+1次分频的信号里就有4n+2个单位长度,而我们需要把4n+2分为两个2n+1,那么我们就需要两个相位上相差一个单位长度的,并且占空比为2n/(4n+2)的2n+1次分频信号相或来得到,而该信号可以由上述的脉冲计数法得到。
利用上文的规律,以占空比为50%的5分频为例,我们需要两个占空比为(2*2)/(4*2+2)的5分频信号进行合成,其中这两个信号可以利用脉冲计数法得到,并且保持相位相差半个时5钟周期,我们会发现这两个信号相或的结果就是我们需要的占空比为40%的5分频。具体实现如下:
在实现奇数次分频的基础上,我们可以继续实现n次分频的占空比为x/2n的信号,与脉冲计数法不同的是,这里的x可以是1到2n-1的任意整数。
我们把两个偏移信号命名为sgn1和sgn2,两个信号由于偏移会有一部分重叠的长度,设该长度为y,则通过与运算能够得到占空比为y/2n的信号,如果通过或运算则能得到占空比为(2n-y)/2n的信号。
4 结束语
利用基本2分频法、脉冲计数法、相位偏移法,就基本足够目前工程上所需要的各种分频的实现,并且每种方法的适用范围各有不同,相位偏移法适用范围最广,同时也最消耗内部资源,相对的基本2分频法适用范围最窄,也是最省资源。合理利用这些分频策略将可以为我们的工程中为我们解决实际问题提供不少的帮助。
参考文献
[1]高培军.基于FPGA的多种形式分频的设计与实现 可编程技术专题 2004年第六期:30-31
[2]潘松 黄继业 潘明 《EDA技术实用教程》(第四版) 科学出版社 2010年
[3]林海波.基于CPLD/FPGA的半整数分频器的设计 国外电子元器件 2003年第九期:68-70