郜继红,荀延龙,卢旭盛
(1.内蒙古工业大学 电力学院,内蒙古 呼和浩特 010051;2.内蒙古工业大学 信息学院,内蒙古 呼和浩特 010051)
FPGA是数字系统主流控制器之一,成为目前硬件设计的研究重点[1]。工程人员在数字系统的设计过程中,总会遇到各种各样数值的分频要求,比如偶数分频、奇数分频、半整数分频、小数分频等等,通常一些数字系统设计中,系统不仅对信号频率有要求严格,而且对占空比也有严格的要求。整数分频器的实现比较简单,可以采用标准的计数器或可编程逻辑器件得以设计实现。但0.5倍整数分频和等占空比的奇数分频实现起来就比较困难 ,小数分频和分数分频就更加困难难[2]。计数器构成的分频器,大多只能实现整数分频,或者只能实现半整数分频和奇数分频。而实现小数分频的多数是专用分频器,针对这一问题,本人首先设计了各种数值的分频器,然后增加一个控制模块,用拨码开关选择分频类型,即由拨码的二进制数确定是偶数分频、奇数分频、小数分频还是分数分频。各种数值分频器由控制模块决定其分频的工作状态,最后综合起来成为通用分频器。根据分频器分频原理,摸索出了一种简单的设计方法,设计了任意数值分频器。
偶数分频最易于实现,可以利用计数器实现[3-4]。假设要设计M=2N的偶数分频,当计数值计数到0到K-1时(K用于调节占空比),输出的电平为1,计数器的计数值K到2N-1时,输出的状态为0。计数器计数到2N-1时计数器复位为0。如此循环下去,便可实现占空比为K/2N偶数分频,这里M和K都是可调整的预置数,K调整占空比,M调节分频系数。图1中M取值是6实现的是6分频。即输出时钟频率是输入时钟频率的1/6。从图1的仿真结果可以看出k=3=m/2,输出时钟占空比为50%。
图1 CLKIN的6分频仿真结果Fig.1 Simulation results of 6 frequency divider
想要实现非50%占空比的奇数分频,比如实现占空比为20%(1/5)、40%(2/5)、60%(3/5)、80%(4/5)的分频器,我们可以采用类似于偶数分频的方案就可以实现。但如果要实现占空比为50%的奇数分频,就不能用偶数分频中所采用的方案了。占空比50%奇数分频实现起来会比较麻烦一点,这是因为计数值为奇数,前半个和后半个周期所包含的不是整数个输入时钟脉冲clkin的周期。实现的方法很多,这里介绍一种占用资源少的方法。例如对时钟脉冲CLKIN进行5分频,前半个周期包含2.5个clkin周期,后半个周期包含2.5个clkin周期。需要定义两个计数器,CNT1和CNT2,分别对输入时钟的上升沿和下降沿进行计数,当计数值为0~((n/2)-1)时,输出时钟信号进行翻转,同时给计数器一个时钟复位信号,下一个时钟的上升沿到来时,计数器重新开始计数,如此循环即可。计数器CNT1和CNT2计数方法完全一样,只是翻转边沿不同。然后把这两个计数值输入一个组合逻辑作或运算,CLKOUT=CNT1+CNT2。图2是CLKIN的5分频。
图2 CLKIN的50%占空比的5分频仿真Fig.2 Simulation results of 5 frequency divider for duty Ratio 50%
推广为一般方法:欲实现占空比为50%的2N+1分频器,则需要对分频时钟上升和下降沿分别进行1/(2N+1)分频,然后将两个分频所得的时钟信号作或运算便可得到占空比为50%的2N+1分频器[4]。
实现小数分频器的方法很多,但其原理都基本一样,即通过可变分频和多次平均的方法得到[5-6]。本设计采用双模前置小数分频的方法设计。假设要进行m、n分频(m、n都是整数,且n<10),因为只有一位小数,所以总共要进行 10次分频,总的规律是进行n次m+1分频,10-n次m分频。假设要进行 k.mn分频(k、m、n都是整数且 m、n<10),由于小数是 2位,所以总共要进行100次分频,分频的规律是进行mn次k+1分频,100-mn次K分频。也就是说不管是几位小数总要进行两种系数的分频,两种分频究竟如何交叉进行,可以根据一定的规律计算出来,下面以2.7分频为例进行讲解。由上面的分析知道2.7分频要进行7次3分频,3次2分频。总分频值为:(7×3+3×2)/(7+3)=2.7,将小数部分 7 按倍累加,假设累加的值为A,如果A<10则进行2分频,A<10的话下一次则加上7,此后,如果A≥10则进行3分频,3分频过后再将累加值减去3后与10比较以决定下一次分频是7分频还是2分频,计算过程见表1。图3是2.7小数分频仿真波形。小数分频器部分VHDL核心代码如下:
表1 2.7分频计算序列计算值Tab.1 The value of 2.7 dividing calculation sequence
图3 2.7小数分频仿真波形Fig.3 Simulation waveform of 2.7 frequency divider
表2 分频规律Tab.2 The law of frequency divider
表2 分频规律Tab.2 The law of frequency divider
分频次数 累加值 分频系数1 7 2 2 14 3 3 11 2 4 18 3 5 15 3 6 12 2 7 19 3 8 16 3 9 13 2 10 10 2 11 17 3 12 14 3 13 11 2
图4 33/13分频器仿真波形Fig.4 Simulation waveform of 33/13 frequency divider
将上述各模块整合在一起,需要增加一个控制模块,这样就构成了多数值分频器。顶层原理图见图5。
图5 任意分频器原理图Fig.5 Schematic diagram of any frequency divider
当B=00时,实现整数分频,当B=01时实现占空比50箛的奇数分频,B=10时实现小数分频,B=11时实现分数分频。其中M、K控制整数分频的分频系数以及占空比。小数分频时M、N分别调整整数部分和小数部分。分数分频时K调整整数部分,M,N调整分母和分子值,虽然预置端口较多,但可调整性很好。
文中给出了基于FPGA的多数值分频器的设计方法,设计采用自顶而下的设计方法,进行功能模块的划分,该分频器可以实现偶数、奇数、小数、分数的分频,有良好的可移值性,本设计选用EP2C5Q208C型FPGA芯片实现,从综合配置后的配置报告可以看出,本分频器占用FPGA资源很小。仿真结果和硬件测试结果验证了这个设计的有效性。对相关人员有一定的参考价值。
[1]张静亚.FPGA系统设计中资源分配的分析和研究[J].信息化研究,2009,35(3):37-39.
[2]王广义,赵卫华,赵艳秋.一种小数分频器的设计及性能研究[J].自动化技术与应用,2007,26(9):101-102.
[3]潘松,黄继业.EDA技术实用教程[M].3版.北京:科学出版社,2006.
[4]刘爱荣,王振成,陈扬,等.EDA技术CPLD/FPGA开发应用简明教程[M].2版.北京:清华大学出版社,2013.
[5]李炯.一种基于FPGA的任意分频器设计与实现[J].现代电子技术,2012,25(24):185-186
[6]黄守麟.基于FPGA的超高精度任意小数分频器的设计[J].计算机工程与应用,2008,(33s):485-487.
[7]周鹏,和卫星,匡敏驰,等.FPGA在PC-104系统I/O设备扩展中的应用[J].工业仪表与自动化装置,2013(2):50-53,72.
[8]程光伟,刘大伟.基于FPGA的异步FIFO的研究和设计[J].工业仪表与自动化装置,2013(2):67-69,75.