1实验目的
了解Compact系列的PLL的使用及配置方法。
2实验原理
2.1 PLL介绍
锁相环作为一种反馈控制电路,其特点是利用外部输入的参考信号来控制环路内部震荡信号的频率和相位。因为锁相环可以实现输出信号频率对输入信号频率的自动跟踪,所以锁相环通常用于闭环跟踪电路。锁相环在工作的过程中,当输出信号的频率与输入信号的频率相等时,输出电压与输入电压保持固定的相位差值,即输出电压与输入电压的相位被锁住,这就是锁相环名称的由来。
锁相环拥有强大的性能,可以对输入到 FPGA 的时钟信号进行任意分频、倍频、相位调整、占空比调整,从而输出一个期望时钟;除此之外,在一些复杂的工程中,哪怕我们不需要修改任何时钟参数,也常常会使用 PLL 来优化时钟抖动,以此得到一个更为稳定的时钟信号。正是因为 PLL 的这些性能都是我们在实际设计中所需要的,并且是通过编写代码无法实现的,所以PLL IP核才会成为程序设计中最常用IP核之一。
PLL IP是紫光同创基于PLL及时钟网络资源设计的IP,通过不同的参数配置,可实现时钟信号的调频、调相、同步、频率综合等功能。
2.2 IP配置
首先点击快捷工具栏的“IP”图标,进入IP例化设置
然后在IP目录处选择PLL,在Instance name处为本次实例化的IP取一个名字,接着点击Customise进入IP配置页面。操作示意图如下:
PLL的使用可选择Basic和Advanced两种模式,Advanced模式下PLL的内部参数配置完全开放,需要自己填写输入分频系数、输出分频系数、占空比、相位、反馈分频系数等才能正确配置。Basic模式下用户无需关心PLL的内部参数配置,只需输入期望的频 率值、相位值、占空比等,IP将自动计算,得到最佳的配置参数。如果没有特殊应用,建议使用Basic模式配置PLL。本次实验我们选择Basic Configuration。
接下来进行基础配置:
在Public Configurations一栏将输入时钟频率设置为50MHZ。
在Clockout0 Configurations选项卡下,勾选使能clkout0,将输出频率设置为25MHZ。
在Clockout1 Configurations选项卡下,勾选使能clkout1,将输出频率设置为100MHZ。
在Clockout2 Configurations选项卡下,勾选使能clkout2,将输出频率设置为100MHZ,并设置相位偏移为180度。
其他选项可以使用默认设置,若有其他需求可以查阅IP手册了解,本实验我们暂介绍IP基本的使用方法:
点击左上角generate生成IP。
3、代码设计
模块接口列表如下所示:
PLL_TEST顶层代码:
module pll_test(
input sys_clk ,
output clkout0 ,
output clkout1 ,
output clkout2 ,
output lock
);
PLL PLL_U0 (
.clkout0 (clkout0 ),// output
.clkout1 (clkout1 ),// output
.clkout2 (clkout2 ),// output
.lock (lock ),// output
.clkin1 (sys_clk ) // input
);
endmodule
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
该模块的功能是例化PLL IP核,功能简单,在此不做说明。
PLL_tb测试代码:
`timescale 1ns / 1ps
module PLL_tb();
reg sys_clk ;
wire clkout0 ;
wire clkout1 ;
wire clkout2 ;
wire lock ;
initial
begin
#2
sys_clk <= 0 ;
end
parameter CLK_FREQ = 50;//Mhz
always # ( 1000/CLK_FREQ/2 ) sys_clk = ~sys_clk ;
pll_test u_pll_test(
.sys_clk (sys_clk ),
.clkout0 (clkout0 ),
.clkout1 (clkout1 ),
.clkout2 (clkout2 ),
.lock (lock )
);
endmodule
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
timescale定义了模块仿真的时间单位和时间精度。时间单位是1纳秒,精度是1皮秒。
initial块负责初始化系统时钟。在仿真启动后的2纳秒,系统时钟sys_clk被设置为0。这是为了在仿真开始时定义一个已知的初始状态。
代码定义了一个时钟频率参数CLK_FREQ为50 MHz,并使用一个always块来翻转系统时钟信号。always块中的逻辑使得sys_clk每10纳秒翻转一次,从而生成一个50 MHz的方波时钟信号。这种时钟信号用于驱动被测试的PLL_TEST模块。
最后,将测试平台的各个信号连接到PLL_TEST模块。这包括将生成的系统时钟sys_clk连接到PLL_TEST的时钟输入端,并将PLL_TEST的输出信号clkout0、clkout1、clkout2和lock使用wire引出观察。
4、PDS与Modelsim联合仿真
PDS支持与Modelsim或QuestaSim等第三方仿真器的联合仿真,而Modelsim是较为常用的仿真器,使用PDS与Modelsim来进行联合仿真。
首先需要编译我们的PDS仿真库文件,具体如下所示:
打开PDS工程后,选择工具栏里的Tools->Comolie Simulation Libraries。
红框1选择存放生成的仿真库的路径,红框2选择Modelsim的启动程序路径,一般在win64pe或者win64或者win32文件夹,具体和Modelsim的版本有关,笔者所用的Modelsim为10.6c。
选择好路径后,点击Compile,然后等待编译结束即可。
当出现以上结果时,表示生成成功,点击Close。接下来选择Project->Project Setting,打开工程设置,准备设置联合仿真。
选择Simulation选项卡,红框1选择刚才编译生成的仿真库的路径,红框2选择Modelsim的启动路径,之后点击OK。
右键仿真的文件,选择Run Behavior Simulation开始行为仿真。
运行后会自动打开Modelsim。并执行仿真,如果没有任何报错,则表示成功。如果出现错误,请检测PDS与Modelsim的配置。
5、实验现象
点击Wave观察PLL输出信号:
使用标尺测量clkout0,发现其一个时钟周期是40ns,也就是25MHZ。符合PLL IP设置。
使用标尺测量clkout1,发现其一个时钟周期是10ns,也就是100MHZ,符合PLL IP设置,同时发现clkout2时钟相位超前clkout1半个时钟周期,也就是180度,也符合PLL IP设置。注意PLL的输出时钟应该在时钟锁定信号lock有效之后才能使用,lock信号拉高之前输出的时钟是不确定的。