高云 FPGA 与 PLL 锁相环基础
在数字电路设计中,时钟信号就像系统的心跳,它决定了各个模块的工作节奏。而 PLL(Phase Locked Loop,锁相环)则是这个心跳的精确调节器。高云 FPGA 内置的 PLL IP 核能够将输入时钟进行倍频、分频和相位调整,输出多个稳定的时钟信号。
我第一次接触高云 FPGA 的 PLL 是在一个需要多时钟域的项目中。当时系统需要同时处理视频数据和传感器数据,视频处理需要 100MHz 的时钟,而传感器接口只需要 10MHz。如果使用外部晶振提供多个时钟源,不仅成本高,还会增加 PCB 设计的复杂度。这时候 PLL 的优势就体现出来了——只需一个 50MHz 的外部晶振,就能通过 PLL 生成所有需要的时钟。
高云 FPGA 的 PLL IP 核主要有以下特点:
- 宽频率范围:支持 3MHz 到 500MHz 的输入时钟
- 多路输出:最多可输出 5 路独立时钟
- 精确控制:每路时钟可单独设置分频/倍频系数、占空比和相位偏移
- 低抖动:输出时钟抖动小于 100ps,满足高速接口需求
创建 PLL IP 核的完整流程
工程准备与环境配置
首先需要确保安装了高云 FPGA 开发环境(Gowin EDA)。我推荐使用 V1.9.9 或更高版本,因为新版本对 IP 核的支持更完善。创建工程时,芯片型号选择要与实际硬件一致,比如常见的 GW5A-LV25UG324C2。
在工程创建完成后,通过菜单栏 Tools -> IP Core Generator 打开 IP 核配置界面。这里有个小技巧:建议先在工程目录下新建一个 ipcore 文件夹,专门存放 IP 核相关文件,这样项目结构会更清晰。
PLL 参数详细配置
搜索并选择 rPLL(高云的硬核 PLL),会弹出配置界面。关键参数设置如下:
General 选项卡:
- Module Name:实例名称,默认是
rpll,建议根据功能重命名,比如video_pll,方便后续约束管理。 - Input Clock:选择你的外部晶振引脚,确认频率是否匹配。
接下来进入 Clock Configuration 页面,这是最核心的部分。
- 输入时钟设置:确认输入频率,例如 50MHz。注意检查 VCO 频率是否在允许范围内,通常高云 PLL 的 VCO 范围在 600MHz 到 1200MHz 之间,超出范围会报错。
- 反馈分频与倍频:假设我们需要 100MHz 输出,输入 50MHz。可以设置倍频系数为 2,分频系数为 1。公式通常是
Fout = Fin * (M/N),具体参考手册中的计算表。 - 输出时钟:勾选需要输出的通道。对于刚才提到的视频和传感器需求,我们可以开启两个输出通道。Channel A 设为 100MHz,Channel B 设为 10MHz。
Output Clocks 选项卡:
- Frequency:直接填入目标频率,IP 核会自动计算最佳参数,或者手动指定 Divider/Multiplier。
- Duty Cycle:占空比,一般保持 50%,特殊时序要求时可微调。
- Phase Shift:相位偏移,如果涉及跨时钟域同步,可能需要调整相位来对齐数据。
配置完成后点击 Generate,IP 核文件会自动生成到工程目录。记得在 Verilog 代码中例化这个 IP,并连接好复位信号。复位信号非常重要,PLL 上电后需要一定时间锁定,通常建议用全局复位信号拉低至少 10us 以上,直到 Lock 信号变高再释放复位。
注意事项与常见问题
在实际使用中,有几个坑值得注意:
- 时钟约束:生成的时钟必须添加正确的 SDC 约束,否则静态时序分析(STA)可能会报错。使用 Gowin 的 Timing Analyzer 检查路径延迟。
- 电源噪声:PLL 对电源敏感,尽量靠近 FPGA 供电区域走线,避免数字噪声干扰。
- 多时钟域处理:不同频率的时钟域之间传输数据时,务必使用 FIFO 或握手协议,不要直接跨时钟打拍,否则亚稳态会导致系统崩溃。
搞定这些配置后,你的多时钟系统就有了坚实的基础。剩下的就是编写逻辑验证了。

