动态配置PLL:IOPLL Reconfig

        PLL(锁相环)是FPGA中常见的 IP CORE ,使用之初认为IP核进行配置后无法进行重配置,但在了解了 IOPLL Reconofig IP CORE 过后了解到原来 PLL IP CORE 也是能够进行动态重配置的

        在了解 IOPLL Reconfig IP CORE 之前首先要了解 PLL 的工作原理

 

        上图分别是 fPLL (小数分频)和 IOPLL(整数分频) 的内部结构图,M、N、C,分别代表的是 乘法单元、前分频器、输出分频,个人理解为 OUT_CLK[x] = IN_CLK * M / N / Cx;

        描述完PLL的一个内部结构,下面就介绍一下 IOPLL Reconofig IP CORE 的使用

首先,需要调用 IOPLL IP CORE ,具体调用不做过多介绍,主要需要注意的地方如下:

        两种使能分别为 使能锁相环动态重配置 、允许访问动态移相端口 ,具体区别在哪里下文会进行介绍

        调用完 IOPLL IP CORE 后继续调用 IOPLL Reconofig IP CORE ,并以如下这种方式进行连接

接下来是对 PLL 重配置的详细介绍:

首先有两种动态配置方法:
1.通过初始化mif文件进行流式重配置
2.重新配置PLL设置:M、N、C重配置

配置具体操作如下:

1.写地址和数据,发送重配置命令
2.最多重复8次(内部FIFO存储会满)
3.设置初始地址9'd0,并写入任意数据
4.等待waitrequest拉低
写入配置包括:
1.计数器重配置
2.带宽重配置
3.动态相位移动配置

MIF配置操作如下

1.写地址9'b000010000,并写入用于配置PLL的mif文件的基地址,并启动IP的流操作
2.等待waitrequest拉低

另外读操作如下:

1.IP配置启动读功能,读地址
2.等待waitrequest拉低,有效数据读出
3.只可读计数器和带宽重设置,重新读至少需要间隔三拍

注:不论写还是读,在写或者读期间,未使用的地址总线和数据总线都必须为0

在进行计数器配置时,总线意义如下:

 在进行相位偏移配置时,总线意义如下:

在进行带宽配置时,用以配置环路滤波设置和电荷泵设置:

具体对应的高、中、低 带宽如下:

 至于高、中、低带宽代表着什么,相信在配置 PLL IP CORE 时一定见到过改配置:

 其实各类带宽分别代表着抖动的不同:

低带宽:锁相环具有更好的抖动抑制,但锁定时间较慢。
高带宽:锁相环具有更快的锁定时间,但跟踪更多的抖动。
中带宽:锁相环提供锁定时间和抖动抑制之间的平衡。

此外还可以通过IOPLL的动态相依特性修改PLL输出时钟的相位,以VCO(电压振荡器)周期的1/8位增量来调整。

同样有两种相位配置方法:
1.直接访问IOPLL IP核中的动态相位转移端口(支持上行、下行,一次操作中支持7次相移)此处注意
2.通过PLL Reconfig IP核(可通过mif文件或重新配置PLL进行设置,只支持写)上述重配置基包含此类相位配置方法

方法一就是在配置PLL时选择允许访问动态移相端口,此时生成的 PLL IP CORE 如下:

 各端口含义如下:

1.Phase_en:启动相位切换时钟
2.Updn:0(下行),1(上行)
3.Cntsel[4:0]:选择输出通道
4.Num_phase_shift[2:0]:偏移次数,最多7次,每次偏移1/8
5.Phase_done:操作完成

另附使用的小建议:

每次配置结束过后应当复位,复位不会修改已经配置的计数器和过滤器,但会撤销任何已执行的移相操作。目的是保持输入输出时钟稳定的相位关系。

以上即为 PLL IP CORE 重配置的操作方法。

### PyCharm 打开文件显示不全的解决方案 当遇到PyCharm打开文件显示不全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure里的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值