一、PLL IP核简介与实验任务
1.1 PLLIP核简介
PLL即锁相环,是一种时钟反馈电路,其有着强大的性能,可以对FPGA的时钟信号进行任意的分频,倍频,相位调整,占空比调整等。
1.2 实验任务
本节实验的任务是使用开发板输出 4 个不同频率或相位的时钟,四个时钟分别为一个倍频时钟(100MHz),一个倍频后相位偏移 180 度的时钟(100MHz),一个与系统时钟相同的时钟(50MHz)和一个分频时钟(25MHz),并在 Vivado 中进行仿真以验证结果,最后生成比特流文件并下载到开发板上,使用示波器来测量时钟的频率是否正确。
二、程序设计
2.1 PLL IP核的配置
在vivado中新建一个工程,在软件左侧找到IP Catalog,这里存在许多IP核。如下图所示:
在搜索栏输入clock,找到如下图所示的IP核:
双击打开,开始配置 IP 核的时钟参数了,因为开发板上的晶振频率为 50MHz,所以将主时钟的时钟频率设置为 50。第一个“Clocking Options”选项卡的参数配置如下所示:
然后根据实验任务,完成第二页“Output Clocks”的配置,如下图所示:
其他三页保持默认就行,点击OK。
2.2 模块的设计
模块框图如下图所示:
绘制波形图:
RTL代码如下:
module ip_pll(
input sys_clk,
input sys_rst_n,
output clk_100m,
output clk_100m_180deg,
output clk_50m,
output clk_25m
);
wire locked;
wire rst_n;
assign rst_n = sys_rst_n & locked;
clk_wiz_0 u_clk_wiz_0
(
// Clock out ports
.clk_out1(clk_100m), // output clk_out1
.clk_out2(clk_100m_180deg), // output clk_out2
.clk_out3(clk_50m), // output clk_out3
.clk_out4(clk_25m), // output clk_out4
// Status and control signals
.reset(~sys_rst_n), // input reset
.locked(locked), // output locked
// Clock in ports
.clk_in1(sys_clk));
endmodule
2.3 通过Vivado 自带仿真器仿真
Vivado 设计套件内部集成了仿真器 Vivado Simulator,能够在设计流程的不同阶段运行设计的功能仿真和时序仿真,结果可以在 Vivado IDE 集成的波形查看器中显示。
仿真文件代码如下:
`timescale 1ns/1ns
module tb_ip_pll();
reg sys_clk;
reg sys_rst_n;
parameter CLK_PERIOD = 20;
wire clk_100m;
wire clk_100m_180deg;
wire clk_50m;
wire clk_25m;
initial begin
sys_rst_n <= 1'b0;
sys_clk <= 1'b0;
#200 sys_rst_n <= 1'b1;
end
always #(CLK_PERIOD/2) sys_clk = ~sys_clk;
ip_pll u_ip_pll (
.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
将RTL文件和仿真文件添加至工程中后,点击Run Simulation,如下图所示:
仿真结果如下图:
2.3 Modelism联合仿真
首先生成 Modelsim 编译仿真库,然后将Vivado与Modelsim关联,关联好后就可以联合仿真了。
打开本次实验的工程(此时一定要打开需要仿真的工程),然后点击 Tools 下的 Settings(设置)选项,在设置窗口中选择 Simulation(仿真器)来指定该工程使用什么仿真器进行仿真,如下所示:
然后重新点击Run Simulation,如下图所示:
仿真结果如下图所示: