|
前言:
目前的fpga功能越来越强大,在FPGA内部对时钟的处理使用比较普遍。其时钟处理内容根据不同的应用场合与不同的设计需求包含倍频或者分频.下面是比较常用的FPGA内部实现时钟处理的一些基本思想及经验.这里主要以Altera的FPGA为例说明,对Xilinx的FPGA说明相对较少,需要的可以参见Xilinx的相关文档.
1
倍频
时钟的倍频:
在FPGA内部实现倍频一般采用外部时钟输入根据项目不同的需要可以倍频到不同的时钟频率(低时钟速率到高速时钟频率).
例如外部晶振输入27M,在fpga内部倍频至54M,或者81M,而不同的FPGA厂家实现的机制不尽相同.在Xilinx 的FPGA内部实现时直接调用DCM(数字时钟处理模块)可以实现,在ISE界面下可以直接实现.而Altera的FPGA内部实现倍频则需要内部的PLL,方法与步骤参考图1与图2.客观一点来讲,PLL的性能相对DCM有一定的优势,因为PLL是模拟锁相环,而Xilinx的DCM采用的DLL为数字锁相环。两者的性能比较有兴趣的可参考相关文档。
注:下面的Megawizard使用流程同样适合其他的Altera的Mega-core。这里可以根据用户需求生成相应的Mega-core,例如RAM,FIFO等。
图1.启动MegaWizard流程示意图
图2启动MegaWizard界面示意图
图2启动MegaWizard后参数设置示意图
2
分频
一些时钟要求比较高的设计场合需要使用FPGA内部的PLL实现,其实现原理与产生倍频的步骤与方法一致.这里不再赘述.另外简单或者要求不高的分频电路不需要特定器件与内部的PLL,只需用语言描述即可。
但一般设计如果分频为2的整数倍相对简单,仅仅需要一个简单的计数器就可实现,但有些场合需要用到奇数分频或者小数分频时相对比较复杂.下面仅仅列出奇数分频与偶数分频的实现原理与方法.
2.1
偶数分频
偶数分频是最简单的,很容易实现占空比为1:1的电路,这里不再赘述.
2.2
奇数分频
奇数分频相对复杂但也不是件难事,有2种方法实现占空比为1:1的奇数分频,第一种采用了异步时钟的方法,并不太好,不推荐使用.第二种方法来源于实际的设计经验,可应用于实际的系统之中。
2.2.1
方法一
生成N分频,先生成N/2的时钟,之后再2分频,使得占空比调整成为1:1.
以7分频为例,先生成3.5分频时钟,再2分频即可。生成3.5分频。首先进行模4的计数,产生clk_en 信号,再用clk_en信号做时钟,做一个2分频输出,即clk_out,就是最后的输出,在将此输出与输入时钟相异或,反馈作为模4计数器的时钟。因为牵涉到别的一些问题,具体程序这里略去.
图1.
方法一产生的奇数分频
2.2.2
方法二
来源于设计经验。先做一个模7的计数器。再做一个信号a,在模1计数器的控制下,前3个周期为高,后4个周期为低。在用时钟下降沿将a信号延迟一拍得到b.a或b的运算就得到7分频且占空比为1:1的电路。具体程序略去.
图2.
方法二生成的奇数分频
2.2.3
小数分频
无法做到1:1的占空比。例如用77M分频得到16M时钟生成原理如下:
对于77M时钟,一个sts-12帧有9720拍。对于16M时钟,一个sts-12帧有32*8*8拍。即77M下每计数1215,16M下计数256。1215/256=4.76考虑到数字处理只能是整数,则需在每m个5拍扣一拍,每n个4拍扣一拍。列方程为:
m+n=256
5m+4n=1215
解得:
m=191,n=65
具体程序略去.
如果程序中,仅使用一种沿(或全部是上升沿、或全部时下降沿),此时对占空比是没有要求的,但如果上下沿都有使用,则对占空比可能有要求。
3
同一分频时钟多个输出的情况处理
在得到分频时钟之后,有一种情况是将该时钟输出给过多个芯片,这时还需要注意一个布局布线的问题,在程序中,将该分频时钟复制多个,如果在synplify综合,可以使用/synthesis syn_keep=1/约束,保证这些信号不被综合器优化掉,之后在每一个信号输出之前打一个触发器,这样,保证了每一个时钟都是经过了IOB上的触发器,保证了时钟信号的质量。具体程序略去.
4
xilinx、Altera器件对差分时钟输入的不同处理
当时钟频率很高时,常采用差分时钟对的输入形式.Xilinx、Altera对差分时钟输入的处理是不同的。Altera仅仅需要一个Pin就可以实现,但必须在管脚约束时指定管脚的电平类型。Xilinx需要两个时钟输入端。具体使用细节可以参照Xilinx的相关文档。
4.1
Xilinx
需要在程序中显性的表示出有2个时钟输入端,在程序内部将这两个差分成对的时钟送入一个IBUFGDS(在ISE 的language assistant中有模板)。
4.2
Altera
从程序中,与一般的单时钟输入完全相同,看不出时钟是否是差分输入,仅在约束文件中,指定管脚的电平类型时,选择lvds,而不是一般的lvttl.由于工程师的习惯,可以通过两种途径实现,一种是直接修改xx.qsf文件,一种是在GUI界面下直接对Pin 属性进行约束.两者的效果一致.
|