
图2-1锁相环(PLL)结构
PLL工作的原理:PLL采用一个相位频率检测器(PFD)把参考输入时钟的上升沿和反馈时钟对齐。当PFD检测到输入时钟和反馈时钟边沿对其时,锁相环就锁定了。压控振荡器(VCO)通过自振输出一个时钟,同时反馈给输入端的频率相位检测器(PFD),PFD根据比较输入时钟和反馈时钟的相位来判断VCO输出的快慢,同时输出上升(Pump-up)或下降(Pump-down)信号,决定VCO是否需要以更高或更低的频率工作。PFD的输出施加在电荷泵(CP)和环路滤波器(LF),产生控制电压设置VCO的频率。如果PFD产生上升信号,然后VCO就会增加。反之,下降信号会降低VCO的频率。 PFD输出这些上升和下降信号给电荷泵(CP)。如果电荷泵收到上升信号,电流注入环路滤波器(ICP增大)。反之,如果收到下降信号,电流就会流出环路滤波器(ICP减小)。 环路滤波器把这些上升和下降信号转换为电压,作为VCO的偏置电压。环路滤波器还消除了电荷泵的干扰,防止电压过冲,这样就会最小化VCO的抖动。环滤波器的电压决定了VCO操作的速度。 2.2 可重配置PLL Altera公司的Stratix II等系列的FPGA提供了可重配置的PLL,从而可以实时地对PLL进行重新配置,使其适应新的工作要求。通过Altera的Quartus II软件可以生成一个可重配置的PLL,如图2-2右边altpll模块所示;另外,生成一个重配置模块,如图2-2左边所示的altpll_reconfig模块,来对此PLL的具体参数进行实时配置。这两个用Quartus II工具生成的模块按照图2-2所示的方式进行连接,然后,图2-2左边所列的输入端口就可以提供给软件编程人员,由软件来实时地对进行重配置。比如,这组端口中时钟采用PCI接口的时钟,其他端口可以让FPGA以寄存器的方式通过PCI接口提供给上层软件编程,从而可以

图2-2 错误!未找到引用源。Stratix II可重配置的PLL
让软件能实时地对PLL进行重配置,以适应不同的PLL应用环境。具体地,被设置成可写寄存器的端口有reconfig、read_param、write_param、data_in[8:0]、counter_type[3:0]、counter_param[2:0]和reset;设置成只读寄存器的端口有:busy和data_out[8:0]。 PLL的可配置信息被组织在一个称为扫描链(scan chain)的结构中,按特定顺序排列。 2.2.1 PLL的扫描链(Scanchain) Stratix II系列FPGA内的增强型锁相环(EPLL,Enhanced PLLs)和快速锁相环(FPLL,Fast PLLs)提供了若干可用于锁相环实时配置的计数器,包括: n 预缩放计数器(n)(Pre-scale counter(n)) n 反馈计数器(m)(Feedback counter(m))和相应的VCO相位间隙选择(VCO phase tap select(Фm)) n 后缩放计数器(C0-C5)(Post-scale counter(C0-C5))和相应的VCO相位间隙选择(VCO phase tap select, Фc0-c5) n 快速地可动态调整电荷泵电流(Icp)和环路滤波器组件(包括环路滤波器电阻R和电容C),以满足PLL频带宽度(通带宽度,bandwidth)的要求。 这些可用于配置的计数器按照特定顺序组织在PLL的扫描链中。增强型锁相环(EPLL,Enhanced PLL)和快速锁相环(FPLL,Fast PLL)的扫描链长度是不同的。对于EPLL,其可配置的计数器总计有174位(bit0-bit173),其扫描链与具体的可配置计数器的关系如表2-1所示。FPLL的扫描链只有75位,因为FPLL的使用与EPLL类似,本文着重针对EPLL的使用进行介绍,有关FPLL的使用请参照附录。
表2-1 EPLL配置扫描链位图


一开始所提到的若干可用于锁相环实时配置的计数器与扫描链中的计数器的具体对应关系如下(用于增强型PLL的):
² 预缩放计数器(n)(Pre-scale counter(n))具体包括表2-1中提到的:n计数器nominal count、n计数器旁路位(n counter odd bit)、n计数器spread count和n spread counter旁路位。
² 反馈计数器(m)(Feedback counter(m))包括表2-1中提到的:m相位移位设置、m计数器nominal count、m计数器旁路位、m计数器spread count和m spread counter旁路位。
² 后缩放计数器(C0-C5)(Post-scale counter(C0-C5))包括表2-1中提到的:C0-C5计数器相位移位设置、C0-C5计数器高脉冲计数、C0-C5计数器旁路位、C0-C5计数器低脉冲计数和C0-C5计数器奇数划分位。即对应每个PLL的时钟输出端(C0-C5)都有一组可用于调整的计数器。
² 电荷泵和环路滤波器的用于调整的计数器包括表2-1中提到的:电荷泵设置[3:0]和环路滤波器设置[11:4]。环路滤波器中有6位([9:4])是用于环路滤波器的电阻(Rlf)设置,剩下的2位([11:10])用于环路滤波器的电容(Clf)设置。 通常所说的M、N计数器指的是M计数器nominal count和N计数器nominal count,或直接指整个反馈计数器(m)和预缩放计数器(n)。. 各个计数器的具体用处,将在下文中结合具体的例子进行详细的说明。 在用Quartus II工具的Tools选项下的“MegaWizard Plug-In Manager”生成可重配置的PLL时,会自动生成一个后缀为.mif文件(或.hex文件)(如图2-3所示的pll54.mif),此文件是一个扫描链的位图文件,包含了当前PLL配置的扫描链信息。可以根据这些信息,调整PLL的扫描链中相应的计数器,来达到调整PLL的目的。

图2-3 在用MegaWizard生成PLL时选择生成.mif文件

图2-4 PLL的重配置时序波形
图2-4给出了EPLL重配置的时序波形。由图可看出,PLL重配置的过程主要是将扫描链信息从最高位(bit173)到最低位(bit0)依次连续地读入可重配置PLL的过程。 2.2.2 PLL的重配置模块 从图2-4可以看出,PLL的配置过程是按位按序连续进行的,因此,直接操作起来比较不方便。为此,Altera提供了PLL的重配置模块,让配置过程变得简单。它让用户可以按照自己的需要,对需要修改的计数器单独进行修改,并且修改顺序是随机的,不用遵照扫描链的固有排列顺序进行。在所有修改完成后,仅需启动一个时钟周期的重配置信号(图2-4中的reconfig),此PLL的重配置模块就会按照图2-4所示的时序自动地对PLL完成重配置。 PLL的可重配置模块可以通过Altera的Quartus II开发工具的MegaWizard plug-in工具生成,与PLL的生成过程类似,在此不再赘述。 2.2.3 PLL重配置模块的端口说明 我们可以通过对altpll_reconfig模块的输入端口进行适当的驱动,来完成PLL的重新配置。下面,先就该模块的输入/输出端口做一个介绍。
表2-2 altpll_reconfig模块的输入端口


表2-3 altpll_reconfig模块的输出端口

通过PLL重配置模块,可以对各个用于PLL配置的计数器进行修改(用counter_type[3..0]和counter_param[2..0]来指明要具体操作的计数器,read_param和write_param信号来控制是从计数器中读出还是向计数器中写入;其中,从指定计数器中读出的值将放到data_out[8..0]总线上,要写入的数据则放到data_in[8..0]总线上)。

图3-1 输入时钟为85MHz和54MHz时的PLL的扫描链位图
图3-1给出的.mif文件是通过Quartus II软件打开的,也可以直接用文本编辑工具直接打开.mif文件,如图3-2所示。 .mif文件所给出的各位的所表示的含义由表2-1说明,当然,在用文本方式打开的mif文件中,也有详细的说明,比如,图3-2所示的PLL的输入时钟为54MHz时的.mif文件中,“Charge Pump Current = 3”,说的就是电荷泵电流计数器的值为3。

图3-2用文本编辑工具打开的.mif文件
通过比较这两个由Altera的Quartus II工具生成的.mif文件,可以发现85MHz和54MHz这两个PLL的扫描链中不同的计数器设置有以下这些:
表3-1 PLL在输入时钟频率在85MHz和54MHz时的不同参数


图3-3 PLL重配置模块要跟与其连接的PLL类型一致
3.然后,还要特别注意PLL重配置模块的扫描链的初始化。PLL重配置模块自身带了一个存储结构来存储扫描链的值,扫描链的值可以由用户逐个逐个的计数器来设定,也可以在用MegaWizard Plug-In Manager工具生成PLL重配置模块时,由用户指定一个用于初始化扫描链的有效文件(比如,在使用MegaWizard Plug-In Manager工具生成PLL时所生成的.mif(或.hex)文件,例如图2-3中的pll54.mif),如图3-4所示。

图3-4 PLL重配置模块的初始化扫描链
如果没有对PLL重配置模块的扫描链进行初始化,那么,在使用该重配置模块进行PLL的第一次重配置时,因为扫描链为空,鉴于174位的扫描链值(对于EPLL来说)都将被读入PLL来进行PLL的重配置,那些没有指定的计数器值将引起错误的配置。 比如,对于一个输入频率为54MHz的输入时钟,当其频率变成100MHz时,PLL将失去锁定,需要进行重新配置。如果,已经将初始值设为有文件pll54.mif获取(如图3-4所示),那么,仅需要修改一下电荷泵电流计数器的值(由值11调整为12),然后,启动一个时钟周期的reconfig信号,就可以完成重配置,并锁定新的输入时钟频率。否则,若为对重配置模块的扫描链进行初始化,那么此时将需要修改所有相关的计数器值(M、N计数器,post-scale计数器等等)后并启动reconfig信号完成重配置后,才能锁定新的时钟。 1. 另外,要注意的是,使用PLL重配置模块时,使用read_param控制信号来读取扫描链中的对应信息时,实际读取的是从当前“PLL重配置模块”保存的扫描链的内容,而不是从PLL中读出的内容。如果PLL重配置模块的扫描链没有进行初始化(例如,如图3-4所示选择了“No, leave it blank”选项),那么用使用read_param控制信号读出的内容将不确定,通过时序仿真来看,读出值是全零(在之前没有用write_param信号写入新的信息时)。
异步复位输入信号reset不会对PLL重配置模块中保存的扫描链信息产生影响,即使复位也不会使PLL重配置模块保存的扫描链信息回到初始设定值,而是不改变扫描链的任何信息。即最后修改的PLL重配置模块扫描链信息(通过write_param控制信号实现的修改),会一直保持到下次使用write_param控制信号实现修改为止。 3.3 PLL重配置操作的实现过程 3.3.1 用于重配置的寄存器 为了让软件人员能够对PLL进行重配置,FPGA应该提供以下可操作的寄存器: 可写寄存器:reconfig、read_param、write_param、data_in、counter_type、counter_param和reset; 只读寄存器:busy、data_out、locked; 这些寄存器(除了locked)的含义与PLL重配置模块提供的端口是一一对应的,本文档在表2-2和表2-3已经做了说明,为了方便起见,下面再次说明一下。
表3-2 用于重配置的寄存器说明


其中,有关counter_type和counter_param具体所指定的计数器,在表3-3和表3-4中做了说明。
表3-3 counter_type[3..0]的设置

表3-4 counter_param[2..0]的设置

3.3.2 软件对PLL重配置过程的实现 下面,仍通过上面提到的输入时钟频率在85MHz与54MHz两者间切换的例子,来具体说明重配置过程是怎样实现的。 若当前的输入时钟的频率是由54MHz变为85MHz,那么当前应该是按照85MHz的扫描链信息进行PLL的重配置。表3-5列出了可以具体配置的计数器,以及相关的PLL重配置模块的端口:
表3-5 PLL的扫描链(计数器)的重配置数据

注:表中,用灰色标出了那些通常会需要改动的计数器值;而其他计数器值,一般在第一次配置以后,不再需要修改。 表中的数字用十进制数给出,每一行对应着一个可以修改的计数器;最左边是计数器的描述;紧跟着的是与该计数器对应的counter_type和counter_param值;之后,分别是输入时钟在85MHz和54MHz时应该写入data_in寄存器的内容。 整个重配置的操作流程如图3-5所示。

图3-5 重配置流程图
如图所示,对于重配置过程,软件人员可以通过对相关寄存器的操作完成: 1) 软件要重新调整分辨率且输入时钟改变时,或者检测到时钟失去锁定时(状态位locked的值为0)需要开始重配置工作。 2) 判断是否是第一次对重配置模块进行操作,若是,则写reset寄存器(写入值1),来完成对重配置模块的复位与初始化,并在一段时间(10ns以上即可)后将reset寄存器清零;若不是第一次重配置,则该步骤为可选,转到步骤3)。 3) 写counter_type[3:0]和counter_param[2:0]以及data_in[8:0]所对应的寄存器,其写入顺序可为任意。 4) 写write_param寄存器,将其值设为‘1’, 随后,FPGA硬件会将该寄存器清零(因为PLL重配置模块要求write_param只能保持一个时钟周期)。 5) 等待busy寄存器变为‘0’(十几个时钟周期以内,一般在1微秒以内),然后重复过程1)和2),直到上面表3-5所列的计数器值全部写入完成为止。 6) 等待busy寄存器变为‘0’,然后将reconfig寄存器的值设为‘1’,随后,FPGA硬件会将该寄存器清零(因为PLL重配置模块要求reconfig只能保持一个时钟周期)。然后,等到busy寄存器再次变为‘0’时,重配置模块中的所有参数已经导入到PLL中,基本完成了重配置过程。 7) 写reset寄存器这一步骤是可选的。 a) 即向reset寄存器写入值1,并在一段时间(10ns以上即可)后写入值0。此步骤在要求保障输出时钟之间的相位关系时使用。它会让PLL重配置模块进行复位,复位后,会使得PLL的输出时钟间的相位关系回复到初始值[1](即FPGA的配置文件.sof或.pof所确定的最初值)。 b) 跳过该步骤。在之前已经设置write_param对有关相位的计数器做了调整的话,则不能在此处设置reset寄存器,否则,所做的相位调整无效。 8) 因为PLL进行了重新调整,输出时钟频率会有变化,需要对与PLL的输出相关的逻辑进行复位。 以表3-5中“电荷泵电流计数器”的参数的修改为例:写入其对应的参数的过程为: a) 向counter_type寄存器中写入值2; b) 向counter_param寄存器中写入值0; c) 向data_in寄存器中写入值11;(当前输入时钟是85MHz时) d) 向write_param寄存器中写入值1; e) 读busy寄存器,等待其值变为‘0’; f) 可以对下一个计数器的参数进行修改了。 其中,表3-5中所列出来的这些计数器的写入顺序可为任意,没有先后之分。 图3-6给出了对PLL重配置模块进行写操作的时序示意图,图3-7给出的是对PLL重配置模块启动并完成重配置的时序示意图。写入重配置参数时,由counter_type[3:0]和counter_param[2:0]指定对应的计数器,在data_in[8:0]寄存器中放上对应的计数器要设置的值,然后设置write_param寄存器,这将把data_in中的值写入扫描链中由counter_type[3:0]和counter_param[2:0]所指定的计数器。在所有改动完成后,再设置reconfig寄存器,启动一个clock周期的reconfig信号,这将使改动后的配置自动加载到PLL中去。随后,等到busy信号变为‘0’,则表示重配置已完成。若参数配置正确,则PLL应该能够重新锁定。

图3-6写PLL重配置模块端口的时序示意图

图3-7 reconfig的时序示意图
在通过软件第一次做重配置时,最好将上面表3-5所例的计数器都写入一遍;在做过一次重配置后,因为PLL重配置模块已经记录了之前的配置数据,在再次进行重配置时,那些没有发生变化的计数器值可以不必再次写入,只对发生变化的计数器(一般只是表3-5中灰色部分标出来的那些计数器会发生变化,比如表3-1所示)进行修改就可以了。 只读寄存器中,busy和locked的值可以直接读取,而data_out寄存器的读取过程与上面的写寄存器过程类似,图3-8给出了从重配置模块中读取配置参数的操作流程。

图3-8读配置参数流程图
如图3-8所示,从重配置模块中读取已经配置好的参数的过程如下: 判断是否是第一次对重配置模块进行操作,若是,则写reset寄存器,来完成对重
1) 配置模块的复位与初始化;若不是,则转到步骤2)。
2) 写counter_type[3:0]和counter_param[2:0]所对应的寄存器,其写入顺序可为任意。
3) 写read_param寄存器,将其值设为‘1’,随后,FPGA硬件会将该寄存器清零(因为PLL重配置模块要求read_param只能保持一个时钟周期)。
4) 等待busy寄存器变为‘0’,此时,data_out寄存器的值变为合法值,可直接读取。 图3-9给出了对PLL重配置模块进行读操作的时序示意图。

图3-9读PLL重配置模块端口的时序示意图
注意:a) 在第一次重配置前,最好置位一下reset信号,保证重配置模块的状态机回到初始状态。 b) write_param和read_param、reconfig信号是时钟上升沿采样,仅保持一个周期,它们对应的寄存器在由软件人员设置为值‘1’后,随之会被硬件清零。 c) 为了了解写入的值是否正确,可以通过读相应的计数器,看读出值是否与写入值一致。 读/写参数时,要在检测到busy信号为低的时候才能读出/写入。
3.3.3 PLL重配置计数器的调整 上文中有提到,PLL重配置模块提供的可调整的计数器是以一个称为扫描链的结构来组织的,如图3-10所示。

图3-10 PLL重配置计数器的扫描链结构
对于增强型锁相环(Enhanced PLL),这些可调整的计数器可大体分为三类:
1) M、N计数器 包括:M计数器nominal count、M计数器旁路位、M spread counter旁路位、N计数器nominal count、N计数器旁路位、N spread counter旁路位、M相位移位设置(Фm)。 其中,一般只用到了M计数器nominal count和N计数器nominal count,本文中将这两个计数器简称M、N,与PLL中的鉴相器PFD相关,主要涉及倍频。 PLL采用“M/(N×后缩放因子)”这样一个缩放因子为PLL输出端提供时钟合成输出。每个PLL有一个预缩放因子(pre-scale counter ,N)和一个乘法因子(M)。输入时钟(fIN)经由预缩放计数器(N)分频后,产生PFD的输入参考时钟(fREF),VCO的频率(FVCO)等于该参考时钟频率(fREF)的M倍,其关系如下所示: fREF = fIN /N FVCO= fREF×M=fIN×(M/N) 压控振荡器VCO的输出再经过降频,作为最终的PLL输出时钟。 2) C5-C0有关的计数器 包括:C5-C0计数器相位移位设置(ФC5-ФC0)、C5-C0计数器旁路位、C5-C0计数器高/低脉冲计数、C5-C0计数器奇数划分位。 其中,C5-C0是PLL的6个时钟输出端,每个输出有一个唯一的后缩放计数器(post-scale counter,G),用于降低高频VCO,产生最终的PLL输出时钟。输出时钟的频率fout与VCO的频率FVCO的关系如下所示: fout= FVCO /G = fIN× (M/(N×G)) 后缩放计数器(本文中用字符G表示)的值由“高脉冲计数和低脉”和“低脉冲计数”两个计数器组成,关系如下: 后缩放计数器值 = 时钟输出高脉冲计数值 + 时钟输出低脉冲计数值 其中,“C5-C0计数器高/低脉冲计数”要根据M、N计数器的值和输入/输出时钟的关系来确定,其连同相应的“奇数划分位”主要与占空比调整有关: “奇数划分位”的含义是将“时钟输出高脉冲计数值”的0.5个单位补偿到“时钟输出低脉冲计数值”。比如,对应的“后缩放计数器值”为3,要求占空比为50% 时,“时钟输出高脉冲计数值”和“时钟输出低脉冲计数值” 应该依次为2和1,占空比=(2 – 0.5)/3 × 100% = 50%。或者,可以通过下面的式子来计算占空比: 占空比 = 时钟输出高脉冲计数 ÷ (时钟输出高脉冲计数值 + 时钟输出低脉冲计数值 + 后缩放计数器的奇数划分位) × 100% 3) 与频带宽度(width)有关的计数器 包括:电荷泵(CP)设置、环路滤波器(LF)电阻与电容设置。 这些是与频带宽度(bandwidth)相关的计数器。一般地,频带宽度设得较大时,PLL能较快地重新锁定时钟;频带宽度较小时,能够较好地过滤输入时钟的抖动。与频带宽度相关的这些计数器,一般使用Quartus II软件在添加PLL时所自动设定的值,这些具体的设定值可以通过查看对应的.mif文件来获取(如图3-2所示)。 事实上,上面所举的例子中,“表3-5 PLL的扫描链(计数器)的重配置数据”已经例出了这里所提到的大多数计数器,只有“C5-C2计数器高/低脉冲计数”和“C5-C2计数器奇数划分位”这些计数器因为没有用到,而没有例出。其实,C5-C0这六个EPLL的时钟输出端中,每个输出端所对应的计数器是一一对应的,可以类似地进行设定。 对于这些计数器,上面的表3-5中已经给出了其对应的counter_type[3:0]和couter_param[2:0]这两个寄存器的值,而表3-5没有给出的一些值(“C5-C2计数器高/低脉冲计数”和“C5-C2计数器奇数划分位”),如表3-6所示:
表3-6 其他可能需要配置的计数器及其对应的counter_type和counter_param

因为,这些计数器相关的旁路位已被设为有效(如表3-5所示,C5-C2和N的旁路位均被设为1),在实际应用这些计数器不会用到,故其值都可以设为0;当然,也可以不做设定。 3.3.3.1 M、N计数器的调整 可重配置的PLL的计数器的调整范围一方面受限于其用于计数的位数(如表2-1所示),另一方面还受到实际应用环境的影响。 实际应用中,M、N等计数器的取值范围受到PLL内的压控振荡器(VCO,参考章节2.1PLL结构与原理)频率的影响。VCO的输出频率有一个范围,在调整参数时要注意参数所决定的VCO频率在这个范围之内。Stratix II FPGA的VCO的频率可调整范围在300MHz~1040MHz之间[3]。 VCO的频率范围计算公式为: fVCO= fIN × (M/N) ; 即VCO的频率跟PLL的输入时钟频率(fIN)、M计数器的值和N计数器的值有关系;若输入时钟的频率变化导致通过上面公式计算的fVCO值超出调整范围时,要适当地调整M和N计数器的值,以使得fVCO能在这个调整范围之内。 对于Enhanced PLL,它的M、N计数器的取值范围为1~511(如表2-1所示,其计数位数为9,则计数范围为(1~29 - 1))。 如果,将N计数器的旁路位设为有效(即设为值1),即不使用预缩放计数器N,这种情况下,在计算时将N 值取成1。 理论上,只要对于给定的输入时钟的频率范围,能存在一组M/N的值使得对这个范围的输入M、N的值都不需要做改变,那么,对于这个输入频率的范围,应该能存在一组较固定的计数器值,使得不需要对这些计数器做任何调整;或只是需要对较少的计数器值做一些调整,就能够让PLL锁定这个范围的所有输入时钟。 这样的一组(M/N)的值可以这样求得: 先通过公式:Min( fIN ) ≤ fIN × (M/N) ≤ Max( fvco ) 求出于每个输入时钟频率fIN对应的(M/N)的取值范围,这组(M/N)就是不同fIN所公有的(M/N)值。 比如,对40MHz~100MHz这个频率范围的输入时钟,通过上面所列的两个公式有: 300 ≤ 40 × (M/N) ≤ 1040 300 ≤ 100 × (M/N) ≤ 1040 得到40MHz~100MHz这个频率范围适用的(M/N)取值范围为: 7.5 ≤(M/N)≤ 10.4 。 又因为M、N都是整数,且。如果PLL的输出时钟频率是输入时钟的2倍,即倍频率等于2,那么(M/N)的取值应该是2的整数倍。这样,对[40,100]这个频率范围的输入时钟,(M/N)的可以取值为8或10。 3.3.3.2 后缩放计数器(post-scale counters,C0-C5)的调整 M、N计数器的调整会导致其相关的其他计数器值需要调整,比如,调整M值时,要调整对应的后缩放计数器(post-scale counters,G)的值,以保持原来的输出时钟与输入时钟的倍频关系。根据上文提到的内容可知: fout = fIN× (M/(N×G)) 其中,fout为输出时钟的频率,fVCO 为VCO的输出频率,G为后缩放计数器的值,M为反馈计数器值,N为预缩放计数器值。 则有 倍频率 = fout/ fIN = M/(N×G) 因此可以得出 G = (M/N)/ 倍频率 事实上,一个后缩放计数器是由“时钟输出高脉冲计数器”和“时钟输出低脉冲计数值”这两个计数器组成的,其关系如下: 后缩放计数器值 = 时钟输出高脉冲计数值 + 时钟输出低脉冲计数值 例如,对上面所确定的适合40MHz~100MHz频率范围的M/N值,对C0输出/输入时钟频率比率为1:1,C1输出/输入时钟频率比率为2:1的情况下,有 C0的后缩放计数器值 =(M/N)/1 = 10 ; C1的后缩放计数器值 =(M/N)/2 =5 ; 当占空比为50%的情况下,反映到具体的计数器值就是: C0计数器高脉冲计数(C0 Counter High cycles Count)= 5 ; C0计数器低脉冲计数(C0 Counter Low cycles Count)= 5 ; C0计数器奇数划分位(Counter odd division bit) = 0 ; C1计数器高脉冲计数(C0 Counter High cycles Count)= 3 ; C1计数器低脉冲计数(C0 Counter Low cycles Count)= 2 ; C1计数器奇数划分位(Counter odd division bit) = 1 其中,“奇数划分位”有效时,表示从高脉冲计数补偿0.5个单位到低脉冲计数,比如,上面C1的高脉冲计数为3、低脉冲计数为2、奇数划分位有效(为1),则表示实际的高脉冲计数是2.5(3-0.5),低脉冲计数也是2.5(2+0.5)。 这几个计数器还与占空比有关: 占空比 = 时钟输出高脉冲计数 ÷ (时钟输出高脉冲计数值 + 时钟输出低脉冲计数值 + 后缩放计数器的奇数划分位) × 100% 后文中,将结合一个具体的例子,对占空比的调整进行详细介绍。 3.3.3.3 与频带宽度(bandwidth)有关计数器的调整 涉及PLL频带宽度(bandwidth)的调整的主要的三个计数器是:电荷泵电流计数器、环路滤波器电容和电阻计数器。可以通过调大bandwidth以更快地重新锁定输入时钟,而调小bandwidth来更好地过滤输入时钟的抖动。 Stratix II FPGA的EPLL的bandwidth范围为130kHz~16.9MHz;FPLL的bandwidth范围为1.16MHz~28MHz[3]。

图3-11 环路滤波器可编程组件
环路滤波器可编程组件的结构如图3-11所示。压控振荡器(VCO)通过自振输出一个时钟,同时反馈给输入端的频率相位检测器(PFD),PFD根据比较输入时钟和反馈时钟的相位来判断VCO输出的快慢,同时输出上升(Pump-up)或下降(Pump-down)信号,决定VCO是否需要以更高或更低的频率工作。PFD的输出施加在电荷泵(CP)和环路滤波器(LF),产生控制电压设置VCO的频率。如果PFD产生上升信号,然后VCO就会增加。反之,下降信号会降低VCO的频率。 PFD输出这些上升和下降信号给电荷泵(CP)。如果电荷泵收到上升信号,电流注入环路滤波器(IUP)。反之,如果收到下降信号,电流就会流出环路滤波器(IDN)。 环路滤波器把这些上升和下降信号转换为电压,作为VCO的偏置电压。环路滤波器还消除了电荷泵的干扰,防止电压过冲,这样就会最小化VCO的抖动。环滤波器的电压决定了VCO操作的速度。 如图3-11所示,环路滤波器的输出电压可以通过调整电阻R和电容Ch来进行改变。根据此电路原理图可知,若调大Ch则输出电压增大;若调大电阻R的阻值,则流经R的电流减小,从而流经Ch的电流增大,输出电压增大。 电荷泵电流计数器、环路滤波器电容和电阻计数器,其调整范围如表3-7、表3-8和表3-9所示。
表3-7 电荷泵电流计数器取值范围

表3-8 环路滤波器电容计数器取值范围

表3-9 环路滤波器电阻计数器取值范围

注:环路滤波器的电阻计数器的可设定值是一组不连续的数,这组数的范围为(16进制):0x0~0xF、0x18~0x1F、0x28~0x2F和0x38。
3.4 输出时钟的相位调整
表3-10 Stratix II PLL相位控制位的定义

每个锁相环对应的输出端(C0-C5)都对应着2bits的相位调整位,这2bits所表示的含义表3-10所示,有2个可调整值,其中,值1(二进制的“01”)表示将相位向后调整一个phase step,每个phase step是VCO周期的八分之一,即将相位向后调整VCO的45度;值3(二进制的“11”)表示将相位向前调整VCO的一个phase step。 相位调整的具体操作可参照下表进行:

要注意的是,将PLL复位(对reset寄存器的值设为1),会导致PLL相位的调整作废;因为,PLL复位时,会将相位关系恢复到由FPGA的编程文件(.sof或.pof文件)所决定的初值[1]。 在实际的相位调整中,可以先将PLL复位,然后,再按照上表进行相位的调整。因为VCO的频率较高(在300MHz~1040MHz之间,跟M、N值和PLL的时钟输入端频率相关),每次相位的调整量较小,比如,VCO频率为800MHz时,其周期为1.25ns,其八分之一就是0.15625ns,要将输入时钟C0的相位向后调整约1ns时,需要调整7次(1/0.15625=6.4)。事实上,在朝一个固定方向进行相位调整时(一直向前调整或一直向后调整),只在第一次需要往counter_type、counter_param和data_in这些寄存器中写入值1或3(对应相位向前或相位向后调整),之后,只要启动若干次reconfig就可以达到调整需要的相位偏移量的要求,不需要重复在写上面这些寄存器(因为之后每次这些寄存器的值都与第一次的一样)。 因为对于每个PLL的输入,其对应的VCO的频率不尽相同,所以,对PLL的输出,其相位的调整步长(phase step)都不尽相同,具体数据可参见附录中的表格“各分辨率下PLL的相位调整步长(phase step)”。 3.5 输出时钟的占空比调整 可编程占空比功能允许你设置PLL时钟输出的占空比。占空比是时钟输出高/低脉冲和整个时钟周期时间的比率,表示为处于高脉冲的时间的比例。Quartus II软件使用输入频率和目的倍增/倍减比率来选择后缩放计数器。占空周期精度由PLL时钟输出选用的后缩放计数器值决定,定义为50%除以后缩放计数器值。例如,如果后缩放计数器的值为3,允许的占空比为50%除以3等于16.67%。因为altpll宏功能不接受非整数值的占空比值,所以,允许的占空比为17%、33%、50%和67%。 由于硬件的限制,你不能实现84%的占空比,因为对于给定的计数器值你不能实现最接近100%的值。然而,你可以选择17%的占空比,反转PLL时钟输出,从而实现84%的占空比。例如,如果G0计数器为10,占空比增量是5%,范围从5%到90%。 在调整占空比时,一般地,建议通过调整“后缩放计数器的值”(post-scale counter value)来实现的。 “后缩放计数器的值”可以通过以下的关系式得到: 后缩放计数器值 = (M / N)/ 倍频率 或者 后缩放计数器值 = 时钟输出高脉冲计数值 + 时钟输出低脉冲计数值 而 占空比 = 时钟输出高脉冲计数 ÷ (时钟输出高脉冲计数值 + 时钟输出低脉冲计数值 + 后缩放计数器的奇数划分位) × 100% 如果已经对PLL进行过重配置(即有将reconfig寄存器的值置为1),并且之后没有再修改过对应的计数器值,那么当前PLL所对应的M、N的值和时钟输出高/低脉冲计数器的值可以通过设置read_param等寄存器读取出来(如图3-8所示)。 以调整C0和C1的占空比为例, 首先,可以先通过read_param等信号读出以下计数器的值: C0计数器高脉冲计数(C0 Counter High cycles Count) C0计数器低脉冲计数(C0 Counter Low cycles Count) C0计数器奇数划分位(Counter odd division bit) C1计数器高脉冲计数(C0 Counter High cycles Count) C1计数器低脉冲计数(C0 Counter Low cycles Count) C1计数器奇数划分位(Counter odd division bit) 读出这几个计数器的值的具体操作为:

其中,data_out[8:0]是从PLL的扫描链内读出来的值,对于每个具体的PLL,其设置值不尽相同。 从上表可看出,对C0来说,其计数器的高脉冲计数、低脉冲计数和奇数划分位依次为5、5、0;由此可以推导出: C0的post-scale count值 = 5 + 5 = 10; C0的占空周期精度 = 50% ÷ 10 = 5% ; C0的当前的占空比 = 5 / (5 + 5 + 0) = 50 % ; 同理,可算出C1的post-scale counte值为5,占空周期精度为10%,当前的占空比为: 3 / (3 + 2 +1) = 50%。 然后,就可以对C0或C1的占空比进行调整了。比如,要将C0的占空比调整为20%,则可以修改其高脉冲计数、低脉冲计数依次为2和8(保持其和等于10,2 + 8 = 10),具体操作为:

最后,启动重配置信号reconfig有效,就可以完成占空比的修改。 3.6 输出时钟的倍频调整 由上文中有关后缩放计数器的介绍可知: 倍频率 = fout/ fIN = M/(N×G) 因此,实现时钟的倍增和倍减可以通过对M、N或“后缩放计数器(G)”的值的调整来实现。一般来说,优先调整“后缩放计数器”的值,因为,M、N的值调整可能会引起PLL失去锁定。例如,在文献[1]中提到了这样一个例子: 输入时钟为350MHz,要求输出频率为700MHz,Quartus II软件能选择多个途径来达到这个频率。比如,Quartus II软件可以选择M=2,N=1,这时VCO频率为700MHz。如果重配置的时候,将M、N的值调整为M=4,N=2(仍为合法值,且保持原来的倍率),重配置后将发现,PLL会失去锁定。 如果单独调整“后缩放计数器”仍不能满足要求,则需要调整相应的M、N值来实现目的,下面通过一个实例来说明。 比如,当前的PLL的输入时钟频率为31.50MHz,M的值为22,N设为旁路,C0的高/低脉冲计数为11(即C0的后缩放计数值=11+11=22)时,此时,C0的倍频应为1(22/22=1)。若要调整C0的倍频为4倍频,因为,此时M/N值不能被4整除,所以需要调整M的值。先要计算M的可调整范围,按章节3.3.3.1的方法,可求得M应在整数区间[10,33]内,这里,选择M的值为24,则C0的后缩放计数=24/4=6,则C0的高/低脉冲计数应设置为值3,C0的奇数划分位设置为值0。同时,为了让C1的输出不改变,应对C1对应的后缩放计数做调整。C1为2倍频,则当前的后缩放计数=24/2=12,则C1高/低脉冲计数应改为值6,C1的奇数划分位的值改为0。 附录 A 快速锁相环的使用简介 正文中,主要针对增强型锁相环的使用(EPLL)做了介绍,快速锁相环(FPLL)的重配置与增强型锁相环的类似,都可以通过在用Quartus II软件建立可重配置PLL时生成的.mif文件,来对要配置的计数器的值进行设定,其重配置过程可以参照EPLL的配置过程进行。下面,仅对FPLL的使用做一个简要介绍。 A.1 快速锁相环的扫描链 快速锁相环(Fast PLL)的扫描链只有75位,其对应的扫描链位图如表A-1所示。FastPLL只有C0-C3这4个时钟输出端。
表A-1 Fast PLL配置扫描链位图


由表中可以看出,快速锁相环(FPLL)相应的可重配置的计数器与增强型锁相环(EPLL)的类似,但还有些不同:
1) FPLL的不包含m计数器spread count及相应的旁路位、n计数器spread count及相应的旁路位;
2) FPLL的后缩放计数器只有4组,即C0-C3(EPLL的是6组,C0-C5);
3) FPLL的M 计数器与EPLL的稍有不同,主要由 “M 计数器高脉冲计数”、“M 计数器低脉冲计数”和“m 计数器奇数划分位”这三部分组成,与后缩放计数器类似。FPLL的“M 计数器高脉冲计数”与“M 计数器低脉冲计数”这两个计数器的和,相当于EPLL的一个计数器“M计数器nominal count”;
4) FPLL的后缩放计数器的对应的高/低脉冲计数计数器的位数较EPLL要少,相应地,其对应计数器的调整范围比EPLL的小。 A.2 快速锁相环的可配置计数器 在重配置时,FPLL的各个可配置计数器与相应的counter_type和counter_param寄存器值的对应关系,可以按照表3-3和表3-4来进行选择。为了方便起见,下表列出了所有的FPLL可重配置计数器及其相应的counter_type和counter_param值。 表A-2 FPLL计数器与counter_param和counter_type对应关系


FPLL的电荷泵电流及其环路滤波器的电阻和电容取值与EPLL的(参照表3-7、表3-8和表3-9)有些差别,FPLL的这些计数器的取值如表A-3~表A-5所示。
表A-3 FPLL的电荷泵电流计数器取值范围

注:由表可见FPLL的电荷泵计数器的调整范围为0~15(二进制的0000~1111).
表A-4 FPLL环路滤波器电阻计数器取值范围

注:由表可见,FPLL环路滤波器电阻计数器的取值范围为:0~15(二进制00_0000~00_1111)、 24~26(二进制01_1000~01_1010) 表A-5 FPLL环路滤波器电容计数器取值范围

注:由表可见,FPLL环路滤波器电容计数器的取值范围为2、3(二进制10、11)















各分辨率下PLL的相位调整步长(phase step)(单像素)


加小助理VX:【13316124179】获取电子书籍讲义、PPT课件、案例源码、学习答疑。暗号1进VX群与大伙共同学习FPGA。