PLL 的英文全称是 Phase Locked Loop,即锁相环,是一种反馈控制电路。PLL 对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程占空比的功能
Xilinx 7 系列器件中的时钟资源包含了时钟管理单元 CMT
, 每个 CMT 由一个 MMCM 和一个 PLL 组成。时钟管理单元 CMT 的总体框图如下图所示:
图片来自《领航者ZYNQ之FPGA开发指南》
MMCM/PLL 的参考时钟输入都是来自 IBUFG(CC),即具有时钟能力的 IO 输入,输出可以驱动全局时钟 BUFG 和行时钟 BUFH等
MMCM总体框图:
图片来自《领航者ZYNQ之FPGA开发指南》
PLL总体框图:
图片来自《领航者ZYNQ之FPGA开发指南》
MMCM 的功能是 PLL 的超集,其具有比 PLL 更强大的相移功能。MMCM 主要用于驱动器件逻辑(CLB、DSP、RAM 等)的时钟
。PLL 主要用于为内存接口生成所需的时钟信号
,但也具有与器件逻辑的连接,因此如果需要额外的功能,它们可以用作额外的时钟资源
实验将 Clocking Wizard IP 核产生的 4 个时钟 100MHz、100MHz_180deg 、50MHz、25MHz,连接到开发板的 J3 扩展口 IO 上,分别是第 29、31、33、35 号脚
实验各端口信号的管脚分配如下:
图片来自《领航者ZYNQ之FPGA开发指南》
如图操作,新建工程:
如下图,直接点击Next:
输入工程名字和工程路径,点击Next:
选择创建RTL工程,如图所示:
如下图,直接点击Next:
直接点击Next:
添加芯片型号,如图所示:
工程创建完成:
添加IP核,操作如下图:
搜索clock,找到IP核,如图所示:
双击打开IP核,修改晶振频率为50MHz,如图所示:
依次勾选4个时钟,并进行如图所示设置:
只用到了锁定指示 locked 信号,其名称保持默认即可:
如下图,所有参数保持默认:
直接点击OK即可:
点击OK:
点击Generate:
点击OK:
点击OK:
IP 核自动生成的只读的 verilog 例化模板文件,双击打开,如图所示:
创建工程顶层文件,操作如图所示:
创建文件,输入文件名:
如下图,创建完成:
弹出如下界面,点击OK:
弹出如下确认界面,点击Yes:
双击打开,输入代码如下:
module ip_clk_wiz(
input sys_clk , //系统时钟
input sys_rst_n , //系统复位,低电平有效
//输出时钟
output clk_100m , //100Mhz 时钟频率
output clk_100m_180deg, //100Mhz 时钟频率,相位偏移 180 度
output clk_50m , //50Mhz 时钟频率
output clk_25m //25Mhz 时钟频率
);
wire locked;
//MMCM/PLL IP 核的例化
clk_wiz_0 clk_wiz_0
(
// Clock out ports
.clk_out_100m (clk_100m ), // output clk_out1_100m
.clk_out_100m_180 (clk_100m_180deg ), // output clk_out2_100m_180
.clk_out_50m (clk_50m ), // output clk_out3_50m
.clk_out_25m (clk_25m ), // output clk_out4_25m
// Status and control signals
.reset (~sys_rst_n ), // input reset
.locked (locked ), // output locked
// Clock in ports
.clk_in1 (sys_clk) // input clk_in1
);
endmodule
如图所示:
对设计进行分析,操作如图所示:
分析后的设计,Vivado自动生成顶层原理图,如图所示:
对设计进行综合,操作如图所示:
综合完成后,弹出窗口如下,直接关闭:
创建约束文件,操作如图所示:
创建文件,输入文件名:
点击完成:
双击打开,输入约束代码:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
set_property -dict {PACKAGE_PIN B19 IOSTANDARD LVCMOS33} [get_ports clk_100m]
set_property -dict {PACKAGE_PIN C20 IOSTANDARD LVCMOS33} [get_ports clk_100m_180deg]
set_property -dict {PACKAGE_PIN P19 IOSTANDARD LVCMOS33} [get_ports clk_50m]
set_property -dict {PACKAGE_PIN N18 IOSTANDARD LVCMOS33} [get_ports clk_25m]
如图所示:
点击 Flow Navigator 窗口中的 Run Implementation,如图所示:
点击OK:
实现完成后,弹出如下界面,关闭即可:
创建TestBench,操作如图所示:
创建文件,输入文件名:
点击完成:
点击OK:
点击Yes:
双击打开,输入TestBench(激励)代码:
`timescale 1ns / 1ps
module tb_ip_clk_wiz ();
reg sys_clk;
reg sys_rst_n;
wire clk_100m;
wire clk_100m_180deg;
wire clk_50m;
wire clk_25m;
always #10 sys_clk = ~sys_clk;
initial begin
sys_clk = 1'b0;
sys_rst_n = 1'b0;
#200
sys_rst_n = 1'b1;
end
ip_clk_wiz u_ip_clk_wiz(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.clk_100m (clk_100m ),
.clk_100m_180deg (clk_100m_180deg ),
.clk_50m (clk_50m ),
.clk_25m (clk_25m )
);
endmodule
如图所示:
开始进行仿真,操作如下:
选择HDL仿真对象:
保存仿真文件:
点击Yes:
点击Restart,波形窗口中的当前仿真时刻点回归到0ns:
开始仿真:
仿真波形:
由于疫情,一直无法去实验室,故ZYNQ开发板不在身边,该步骤内容待更新
致谢领航者ZYNQ开发板,开启FPGA学习之路!
希望本文对大家有帮助,上文若有不妥之处,欢迎指正
分享决定高度,学习拉开差距