tag 标签: 乘除因子

相关博文
  • 热度 16
    2013-1-4 18:30
    1840 次阅读|
    4 个评论
    PLL 那些事之乘除因子 王敏志 概述          PLL 的基本概念可以在 ALTERA 的官方网站上找到详细的说明,这里引用一下里面的 PLL 框图用以更好的说明 PLL 的乘除因子。 图 1 : PLL 框图 一个问题引出的 PLL 乘除因子的故事          在研究基于 FPGA 的 TDC 的时候,为了产生一个相位与系统时钟尽量不相关的低速时钟来模拟 hit ,所以需要使用 PLL 来产生。如图 2 所示显示的是使用 PLL 产生一个 31.280547MHz 时钟,是由输入的 250MHz 时钟除以 1023 再乘以 128 得到。 图 2 :乘因子 128 ,除因子 1023          注意图 2 包含的两个细节,第一个是此时 PLL 只有一个输出信号;第二是此时器件选择的是 Cyclone 3 系列。这里的故事就是跟这两个细节有关系,即改变这两个条件里任何一个都有可能导致上述时钟无法产生。图 3 显示的是改变第一个条件造成的后果。即如果我需要增加一个 PLL 的输出的时候上述时钟无法产生,实际上QuartusII自动得到一个 31.25MHz 的时钟,即实际的乘除因子分别是1和8。 图 3 :增加 PLL 的输出数量使乘除因子设置受限     乘除因子的真相 F REF = F IN / N F VCO = F REF × M = F IN × M/N F OUT = F VCO / C = (F REF × M) / C = (F IN × M) / (N × C) 其实我们在讲乘除因子的时候必须搞清楚 PLL 的几个 counter ,即 M 、 N 以及 C 计数器。首先我们可以确定的是 Megawizard 里“ Clock multiplication factor ”就等于 M 计数器的值,而“ Clock division factor ”等于 N 计数器的值乘以 C 计数器的值,这些可以从上述公式里找到答案。 在进行 PLL 例化设置的时候, Megawizard 一般不提供, ALTERA 也不建议客户去设置 M 、 N 以及 C 计数器,而是通过设置乘除因子来设置 PLL ,编译器会自动设置这些计数器的值。只有高级应用,即高级用户可以通过特殊方式来设置 M 、 N 以及 C 计数器来配置 PLL 。另外,应用 ECO 工具手动修改 FPGA 设计的时候也可以修改这些计数器以及其他参数。   故事问题的答案     上面那个故事给出两个条件,即不能多于 1 个 PLL 输出和更改器件选择。那么到底为什么呢?     首先介绍为什么不能多于 1 个 PLL 输出。其实也不是不能多于一个 PLL 输出,而是因为第一个时钟设置的乘除因子限制了获取其他时钟的配置参数。为什么这么说呢?因为 PLL 所有输出都是通过 F VCO 除以 Ci( 对应 PLL 输出端口的 C 计数器的 Value) 计数器产生的,上述例子中 F VCO =250x128/31 约等于 1032.258MHz 。而为了得到第一个时钟, M 和 N 已经确定为 128 和 31 了,那么第二个时钟也必须依据这个 M 和 N 值来产生,所以后面的时钟频率不能随意产生了,而是有所限制。故图 3 中的 c1 在设置为 25MHz 的无法在 c0 上得到 31.280547MHz 这个特定时钟了。换句话说为了在 c0 上得到 31.280547MHz 这个特定时钟,这个 PLL 的剩下的输出端口的时钟频率就限制为 (250x128/31*Ci) 其中 Ci 的值为 1 到 512 。          其次是为什么不能更改器件呢?其实也不是不能更改器件,而是当时 31.280547 这个频率限定了 F VCO 的值,即 1032.258MHz 。并且当时的情况是先在 CIII 的开发板上做实验,后面移植到了实际产品,而产品使用的器件是 ArriaGX 系列。查手册发现这两个器件的 PLL 的 F VCO 范围还不一样。如图 4 和图 5 所示。 图 4 : Cyclone 3 中 PLL 的 F VCO 范围 图 5 : ArriaGX 中 PLL 的 F VCO 范围          由图 5 可知,当换成 ArriaGX 以后显然无法再得到所需特定频率的时钟了。