那么,如果某个应用需要 100 MHz、250 MHz 甚至更高频率的时钟,该怎么实现呢?这时就需要用到 PLL(锁相环)。今天的视频主要讲解:
1. 什么是 PLL;
2. 如何在 Vivado 中使用 PLL IP 核。
接下来,我们会通过仿真展示如何利用 PLL IP 核实现时钟倍频,然后把程序烧录到实际的 AX7020 开发板,并观察输出波形。
Part 1:理解 FPGA 内部的 PLL
PLL 在 FPGA 中是非常重要的资源。因为一个复杂的 FPGA 系统通常需要多个不同频率、不同相位的时钟信号,而这些功能都必须依靠 PLL 来实现。因此,一个 FPGA SoC 中 PLL 的数量,往往可以作为衡量其能力的一个重要指标。
回到 AX7020 开发板

时钟管理单元(Clock Management Tile, CMT)
在 Xilinx 7 系列 FPGA 中,芯片内部设计了专用的全局(Global)和区域(Regional)时钟资源,用来处理各种时钟需求。这些资源被称为时钟管理单元(Clock Management Tile, CMT),它们提供:
时钟频率合成(frequency synthesis)
时钟偏移校正(de-skew)
抖动抑制(jitter removal)
从下面的模块框图中可以看到:
从区域缓冲器(Buffer R)到本地布线的部分,都是时钟缓冲器;
这些缓冲器通过 FPGA 内部的时钟专用引脚相互连接;
PLL 和 MMCM 共用这些缓冲资源。

还记得我刚才提到的 J11 接口的第 3 脚吗?这个引脚实际上就是 Buffer G 或 Buffer H 的输出引脚之一,我们稍后会在实测中看到它的作用。
接下来,我们会先配置 PLL IP 核。通过它,我们可以对参考时钟(在本例中是 50 MHz)进行倍频或分频。随后,我们会在 J11 接口的第 3 脚上探测到对应的输出时钟。
你可以根据应用对频率和相位的需求选择 MMCM 或 PLL。
在我们的案例中,输入时钟就是 50 MHz。
如果你使用 MMCM 来生成不同的时钟频率和相位,MMCM 提供了非常强大的时钟管理功能。下图所示的模块框图中:
D?表示可编程分频计数器(programmable counter divider);
PFD?表示鉴频鉴相器(phase frequency detector);
CP?表示电荷泵(charge pump);
LF?表示环路滤波器(loop filter);
VCO?表示压控振荡器(voltage control oscillator);
最终可以得到 8 路 MMCM 时钟输出,用于频率合成。

MMCM 具备分数倍频/分频功能,可以灵活生成输入时钟与输出时钟之间的分数关系;
而 PLL 更适合用于频率合成,主要用来生成多路整数倍频的时钟信号。
因此,如果你需要精确的分数倍频,推荐使用?MMCM;如果只是做常规倍频或分频,PLL?就足够了。
Part 2:在 Vivado 中调用 PLL IP 核
先创建一个 Vivado 工程,然后从 IP Catalog(IP 库) 中搜索并添加 PLL IP 核,这里IP核的名称是?Clocking Wizard。双击它,就会打开 IP 自定义窗口,进入参数配置环节。

勾选频率合成(frequency synthesis)和相位对齐(phase alignment)。
将抖动优化(jitter optimization)设置为?Balanced(平衡模式)。


进入输出时钟(Output Clocks)标签页,生成四路输出,设定为:
输出1:200 MHz(输入的 4 倍)
输出2:100 MHz(输入的 2 倍)
输出3:25 MHz(输入的 1/2)
输出4:50 MHz(与输入相同,用于验证)

点击 OK 后,会提示选择生成任务数,选择 4 个,然后点击生成。这样,PLL IP 核就会自动加入工程,接下来我们就能在设计中调用它。

Part 3:在 Verilog 中实例化 PLL IP 核
1. Project Manager → Add Sources → Add or Create Design Sources → Next。
2. 点击 Create File,新建一个名为 PLL 的源文件(pll.v)。
3. 新建完成后,点击 Finish 即可,当前阶段暂不添加任何 IOPorts,直接点击 OK。

在这个空模块中,我们需要先定义输入输出:
输入:
系统时钟(sys_clk)
复位信号(rst_n),低电平有效,当 rst_n 引脚变为低电平时,开发板就会进入复位状态。
输出:
四路时钟输出(clk_out_200、clk_out_100、clk_out_25、clk_out_50):分别代表200 MHz、100 MHz、25 MHz、50 MHz
锁定信号(locked):定义一个额外的输出线网(wire),用于表示 PLL 模块是否已完成 “锁相”(locked)




Part 4:约束文件(XDC)配置
1. 打开 Window → 点击 I/O Ports 窗口,展开所有输入输出端口。
2. 分配引脚:
rst_n → N15
sys_clk → U18
clk_out_200 → J11 接口的第 3 脚(对应 FPGA 引脚 F17)
保存为 pll.xdc 文件

然后我们还需要添加时序约束:使用 create_clock 语句创建系统时钟。
create_clock?-period?20?[get_ports?sys_clk]
Part 5:仿真验证
打开 Simulation Settings,将仿真时间设置为 50 ms。

3. 双击打开“pll_test_bench”文件,编写测试代码:
定义输入:sys_clk、rst_n
定义输出:四路时钟clock_out_200、clock_out_100、clock_out_25、clock_out_50


用 always 语句生成 50 MHz 的输入时钟,即让时钟每 10 纳秒翻转一次,得到周期 20ns 的输入时钟,即 50 MHz。

200 MHz
100 MHz
25 MHz
50 MHz(与输入同步)
通过波形周期测量,可验证频率正确性。
Part 6:硬件验证
用示波器探测 J11 接口第 3 脚,就可观察到对应的 200 MHz 输出波形,和仿真结果一致,说明 PLL IP 正确配置,功能正常。

选择 ALINX,不仅能获得性能优异、接口丰富的硬件平台,还能享受到完善的技术支持与学习资源,助力工程师与开发者快速上手、加速项目落地。
1650
