PLL实验
开发板上面只有一个200MHz时钟输入,对于其它频率的时钟怎么办?
介绍
其实在很多 FPGA 芯片内部都集成了 PLL ,其他厂商可能不叫 PLL ,但是也有类似的功能模块,通过 PLL 可以倍频分频,产生其他很多时钟。
PLL(phase locked loop) ,即锁相环。
Clock Management Tiles(CMT) 提供了时钟合成 (Clock frequency),
倾斜矫正 ( deskew),过滤抖动 (jitter filtering) 功能。
每个 CMTs 包含一个 MMCM (mixed mode clock manager) 和一个 PLL 。
实验内容
本实验将通过使用PLL, 输出一个方波到开发板上的扩展口(接到一个LED灯)。
实验步骤
主要是使用PLL IP核来产生不同频率的时钟。
- 新建一个 pll_test 的工程,点击 Project Manager 界面下的 IP Catalog 。
- 再在 IP Catalog 界面里选择 FPGA Features and Design Clocking 下面的 Clocking Wizard ,双击打开配置界面。
- 配置时钟,Clocking Options和Output Clocks。
- 生成
- clk_wiz_0.xci 的 IP 会自动添加到我们的 pll_test 项目中 , 用户可以双击它来修改这个 IP 的配置。选择 IP Sources 这页,然后双击打开 clk_wiz_0.veo 文件,这个文件里提供了这个 IP 的 实例化模板 。
`timescale 1ns / 1ps
module pll_test(
input sys_clk_p, //system clock 200Mhz on board
input sys_clk_n, //system clock 200Mhz on board
input rst_n, //reset ,low active
output reg led //led output
);
wire locked;
wire sys_clk ;
reg[31:0] timer_cnt;
clk_wiz_0 clk_wiz_0_inst (
// Clock out ports
.clk_out1(), // output clk_out1
.clk_out2(sys_clk), // output clk_out2
.clk_out3(), // output clk_out3
.clk_out4(), // output clk_out4
// Status and control signals
.reset(~rst_n), // input reset
.locked(locked), // output locked
// Clock in ports
.clk_in1_p(sys_clk_p), // input clk_in1_p
.clk_in1_n(sys_clk_n)); // input clk_in1_n
always@(posedge sys_clk)
begin
if (!locked)
begin
led <= 1'b0 ;
timer_cnt <= 32'd0 ;
end
else if(timer_cnt >= 32'd99_999_999) //1 second counter, 100M-1=99999999
begin
led <= ~led;
timer_cnt <= 32'd0;
end
else
begin
led <= led;
timer_cnt <= timer_cnt + 32'd1;
end
end
endmodule
xdc 管脚约束文件
##################Compress Bitstream############################
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property PACKAGE_PIN AE5 [get_ports sys_clk_p]
set_property PACKAGE_PIN AE14 [get_ports rst_n]
set_property PACKAGE_PIN AE15 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property IOSTANDARD DIFF_SSTL12 [get_ports sys_clk_p]
create_clock -period 5.000 -name sys_clk_p -waveform {0.000 2.500} [get_ports sys_clk_p]
仿真
`timescale 1ns / 1ps
//
// Module Name: vtf_pll_test
//
module vtf_pll_test;
// Inputs
reg sys_clk_p;
reg rst_n ;
wire sys_clk_n;
// Outputs
wire led;
// Instantiate the Unit Under Test (UUT)
pll_test uut (
.sys_clk_p(sys_clk_p),
.sys_clk_n(sys_clk_n),
.rst_n(rst_n),
.led(led)
);
initial
begin
// Initialize Inputs
sys_clk_p = 0;
rst_n = 0;
// Wait for global reset to finish
#1000;
rst_n = 1;
end
//Create clock
always #2.5 sys_clk_p = ~ sys_clk_p;
assign sys_clk_n = ~sys_clk_p ;
endmodule