我必须使用VHDL语言从100MHz基本时钟(占空比0.5)生成78MHz时钟(占空比0.5或0.7)(因此比率为200/156)。 我知道我可以使用DCM,PLL或类似的,但此时(不幸的是)我不能。
因此我想使用(不包括任何DCM或PLL)一个简单的分频器,但在这种情况下我也知道频率只能用整数除(最小2,因为我会使用计数器来做到这一点) - 在我的情况下,我必须将基准时钟除以1,2820512820512820512820512820513 ......)。
所以我不知道如何在不使用任何DCM或其他东西的情况下实现...我想将100MHz时钟划分为更小的频率(如50MHz,25MHz等)并添加它们(50 + 25 + 3用于例如),但这是正确的方法(逻辑上我不这么认为)?
答案 0 :(得分:5)
这是一个通用的分数M / D时钟分频器设计,可以解决您的问题。几年前我写这篇文章供我自己使用。您可能希望使用std_logic而不是bit,具体取决于您要定位的设备。
基本思想是使用累加器跟踪分数时钟相位。这与您实现直接数字合成器(DDS)的方式非常相似,但只需要担心时钟。
享受! =)
如果不清楚如何使用它,那么你用于乘数39和除数50的参数为100 * 39/100 = 78
,因此所需的操作数宽度为6(因为{{1} })。请注意,由于这是输入时钟速率的一半以上,因此没有同步逻辑可以产生输出时钟信号,因此该模块仅以该速率有效的输出将是时钟使能。
另请注意,任何可能的除数值的最坏情况是任何一个周期的占空比为33%/ 66%。你对乘数和除数的特定选择可能会更好(我需要做一些数学判断),但你不能比在最坏的情况下一般使用任何算法更好。使用理性分裂。您可以使用真实的硬件PLL或DLL清除该模块的输出,以滤除相位噪声并使占空比达到目标范围。
2**6 = 64
答案 1 :(得分:1)
完全脱离墙的想法,有些技术特定,所以可能不适合你的目标,而且非常可怕......
很明显,如果没有(a)PLL,(b)DLL,(c)更高频率的时钟或(d)5ns p-p抖动,你就不能这样做。
你需要更多的时钟边缘,但是(假设)你没有更多的时钟边缘,你必须自己生成。 一种技术特定的(Xilinx)方式是将时钟输出,然后通过多个引脚返回,每个引脚都有不同的IBUFDELAY设置。实际设置可能通过实验校准(甚至在上电时),并且会随温度漂移而自然。
另一种方式可能是连续延迟时钟的LUT链,其逻辑用于检测n'延迟超过半周期。 (或整个周期) 然后点击n / 2大约是90度晚,n / 4是45度晚等。 (你不能确保这些时间的一致性。但是,布局规划和锁定这个核心将有所帮助。)
无论哪种方式,一旦你有100MHz时钟的多个相位,你可以将它们应用到上面描述的DDS(分数分频器)。性能不太可能稳定,但应该优于当前最好的5ns ......
(是的,我知道这等于滚动你自己的(和劣等的)DLL。这算作作弊吗?)
对于较低复杂度的方法,您可以尝试使用Peter Alfke的延迟/ XOR技巧,从100MHz时钟中获得200MHz。它的M / S比率没有任何保证,但它确实给你4个边缘玩......