Altera可重配置PLL使用手册
图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模块的输入端口
端口名 clock data_in[8:0] 是否必需 是 否 描述 用于加载单独的参数,还在PLL重配置时,用于驱动PLL。该端口必须被连接到一个有效时钟,且最高频率为100MHz。 9位总线,在写参数时,其上的数据作为输入。有的参数并没有用到全部的9位,此时,只有从bit0开始的若干有效数据被使用。当该端口未连接时,其默认值为0。 4位总线,用于选择哪一类的计数器将被更新。 3位总线,对counter_type给定的计数器,用于选择具体哪个参数将被更新。 此参数有效时,由counter_type[3:0]和counter_param[2:0]所指第 6 页 共 52 页
counter_type[3:0] counter_param[2:0] read_param 否 否 否 Altera可重配置PLL使用手册
定位置的参数,将从扫描链(scanchain)中读出并放置到data_out[]总线上。此信号在上升沿被采样。需要注意的是,此信号应该只保持一个时钟周期,以避免参数在相邻时钟周期被重复读取。 busy信号将随着read_param的有效而变为有效,只有当busy信号变为无效时,data_out[]总线上的值才是有效的,而且,只有当busy信号变为无效时,才可以加载下一个参数。 write_param 否 该参数有效时,data_in[]总线上的数据将被写入由counter_type[3:0]和counter_param[2:0] 所指定的在扫描链中的位置。与read_param相似,该信号在上升沿被采样,且只保持一个时钟周期。 busy信号将随着write _param的有效而变为有效,只有当busy信号有效时,data_in[]总线上的数据将被忽略。只有当busy信号变为无效时,才可以开始写入下一个参数。 此信号表明PLL将开始按照扫描链中的设置进行重新配置。设备在时钟clock的上升沿采样此信号。同样地,该信号应该只保持一个时钟周期,以避免在重配置完成后PLL被重复加载。 reconfig被检测到有效时,busy信号会紧跟着变为有效。pll_scanwrite信号也会随着变为有效,以开始从扫描链中加载新的设置到PLL中。在PLL的重配置期间,busy信号保持有效。一旦busy信号无效,参数就可有被重新修改。 Altera推荐将计数器和相位偏移设置好后,再启动reconfig信号,这样仅将scandata写入扫描链一次。 异步复位输入信号,用于初始化状态机使之处于合法状态。在第一次使用前,状态机必须被复位,否则将无法保证状态的合法性。 此输入信号是由altpll示例的scandataout端口所驱动的。scandataout信号是来自扫描链移位寄存器的直接输出。可以使用此信号来读出扫描链中已有的内容。 此输入信号是由altpll示例的scandone端口所驱动的。此信号变高时,表示重配置已经完成。 reconfig 是 reset 是 pll_scandataout 否 pll_scandone 否 表2-3 altpll_reconfig模块的输出端口
端口名 data_out[8:0] 是否必需 否 描述 9位总线,用于用户读回参数数据。在将read_param值设为高有效,并指定counter_type[]和counter_param[]值时,参数将从扫描链中读出到此总线上,然后,当busy信号变为无效时,此总线上的数据为合法值。 此信号有效表明状态机处于忙状态,此时,状态机可能在从扫描链中读一个参数,或向扫描链中写入一个参数,或是在重配置PLL。此信号有效时,状态机将忽略它的输入,并且直到此信号变为无效,状态机才能改变。 此信号用于驱动要重配置的PLL上的scanclk端口 第 7 页 共 52 页
busy 否 pll_scanclk 是 Altera可重配置PLL使用手册
pll_scanread pll_scanwrite pll_scandata 是 是 是 此信号用于驱动要重配置的PLL上的scanread端口 此信号用于驱动要重配置的PLL上的scanwrite端口 此信号用于驱动要重配置的PLL上的scandata端口 通过PLL重配置模块,可以对各个用于PLL配置的计数器进行修改(用counter_type[3..0]和counter_param[2..0]来指明要具体操作的计数器,read_param和write_param信号来控制是从计数器中读出还是向计数器中写入;其中,从指定计数器中读出的值将放到data_out[8..0]总线上,要写入的数据则放到data_in[8..0]总线上)。
第 8 页 共 52 页
Altera可重配置PLL使用手册
3 PLL的重配置的具体实现
通过对PLL重配置模块的可编程端口(章节2.2.3)进行操作来完成重配置工作。 当前的PLL选用的是增强型锁相环(Enhanced PLL),具体使用到了该PLL的C0、C1这两个时钟输出端口,并且,C0输出的时钟频率与输入频率相同,C1输出的时钟频率要求是输入频率的2倍;输入时钟的频率在85MHz和54MHz这两个频率的一定范围内波动(比如,通过晶振提供输入时钟时,由于晶振本身的误差及其受到环境影响,输入信号的频率会有一定的波动)。
在FPGA设计时,PLL会设定一个初始的输入时钟的锁定频率,以及指定带宽(bandwidth)范围(比如,PLL的起始锁定频率设为85MHz。那么,当输入时钟变为54MHz时,因为PLL初始参数是按照85MHz设定的,所以,可能不能很好地锁定54MHz的输入时钟,此时,就需要按照54MHz的合适参数来重新配置PLL,从而使PLL能重新稳定地锁定输入时钟。这些参数存储在PLL重配置模块相关的计数器中,通过对计数器的修改,并最终设置一个时钟周期的重配置信号,来启动并完成PLL的重配置。
3.1 PLL重配置计数器值的确定
一般可以通过PLL对应的.mif(或.hex)等文件(如图2-3所示)来获得重配置模块的计数器值,这些文件可以在用Altera的Qusrtus II软件的MegaWizard Plug-In Manager工具生成PLL时产生。当无法通过.mif(或.hex)等文件来获取这些计数器值时,有些计数器的值可以通过计算来确定取值范围。本文主要介绍通过.mif文件获得重配置模块的计数器值参数的方法,下面通过一个实际的例子来进行说明。 通过MIF文件获取配置参数示例
在该例中,输入时钟在85MHz和54MHz之间切换,要求PLL能在时钟切换后,能够通过重配置来适应新的输入时钟(即重新锁定输入时钟)。
在用Quartus II工具生成PLL时,可以生成这个PLL的扫描链信息的.mif文件。输入时钟在这85MHz和54MHz这两个频率之间切换时,要调整哪些计数器,可以通过比较这两个频率对应的扫描链位图(.mif文件)获得。
图3-1所示,是85MHz的增强型锁相环(EPLL)和54MHz的EPLL,在C0的输出/输入比率为1:1,C1的输出/输入比率为2:1,且其bandwidth选项设为20MHz时,所对应的.mif文件,这些文件给出了85MHz和54MHz时,PLL的扫描链的设置值。
第 9 页 共 52 页
Altera可重配置PLL使用手册
图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的扫描链中不同的计数器设置有以下这些:
第 10 页 共 52 页