一、简介
* PLL(Phase-locked loop)即锁相环。是 FPGA 中的重要资源。由于一个复杂的 FPGA
系统往往需要多个不同频率,相位的时钟信号。所以,一个 FPGA 芯片中 PLL 的数量是衡量 FPGA 芯片能力的重要指标。FPGA 的设计中,时钟系统的
FPGA 高速的设计极其重要,一个低抖动, 低延迟的系统时钟会增加 FPGA 设计的成功率。
* 数字锁相环(PLL):主要用于频率综合。使用一个 PLL 可以从一个输入时钟信号生成多个时钟
信号。
* List item
二、PLL IP Core调用
以Vivado软件操作为例
1、新建一个 工程,点击 Project Manager 界面下的 IP Catalog。
2、在IP Catalog中搜索clock,打开下面的 Clocking Wizard,双击打开配置界面。
配置界面
3、 Clocking Wizard 的名字可以修改, 这里我不做修改。在第一个界面 Clocking Options 里, 我们选择 PLL
资源,输入的时钟频率为 50Mhz。
4、 在 Output Clocks 界面里选择时钟输出,这里我选择 clk_out1~clk_out4 四个时钟的输出,频率分别为 100Mhz,
75Mhz, 50Mhz, 25Mhz。这里还可以设置时钟输出的相位,我们不做设置,保留默认相位,点击 OK 完成,(我们可以在左侧预览)
5、在弹出的对话框中点击 Generate 按钮生成 PLL IP 的设计文件。
6、这时一个 clk_wiz_0.xci 的 IP 会自动添加到我们的 项目中, 可以双击它来修改这个 IP 的配置
选择 IP Sources 这页,然后双击打开 clk_wiz_0.veo 文件,这个文件里提供了这个 IP
的实例化模板。我们只需要把框框的中内容拷贝到我们 verilog 程序中,对 IP 进行实例化。
7、下面新建一个顶层文件,并将pll 实例化模板copy进去,做一些修改
代码如下:
`timescale 1ns / 1ps module pll_test( input sys_clk, //system clock 50Mhz on
board input rst_n, //reset ,low active output clk_out_100M, //pll clock output
output clk_out_75M, //pll clock output output clk_out_50M, //pll clock output
output clk_out_25M//pll clock output ); wire locked; /PLL IP call clk_wiz_0
clk_wiz_0_inst (// Clock in ports .clk_in1(sys_clk), // IN 50Mhz // Clock out
ports .clk_out1(clk_out_100M), // OUT 200Mhz .clk_out2(clk_out_75M), // OUT
100Mhz .clk_out3(clk_out_50M), // OUT 50Mhz .clk_out4(clk_out_25M), // OUT 25Mhz
// Status and control signals .reset(~rst_n), // pll reset, high-active .locked(
locked)); // OUT endmodule
仿真文件如下:
`timescale 1ns / 1ps // // Module Name: vtf_led_test // module vtf_pll_test;
// Inputs reg sys_clk; reg rst_n; // Outputs wire clk_out; // Instantiate the
Unit Under Test (UUT) pll_test uut ( .sys_clk(sys_clk), //system clock 50Mhz on
board .rst_n(rst_n), //reset ,low active .clk_out_100M(clk_out_100M), //pll
clock output .clk_out_75M(clk_out_75M), //pll clock output .clk_out_50M(
clk_out_50M), //pll clock output .clk_out_25M(clk_out_25M) //pll clock output );
initial begin// Initialize Inputs sys_clk = 0; rst_n = 0; // Wait 100 ns for
global reset to finish #100; rst_n = 1; // Add stimulus here #20000; // $stop;
end always #10 sys_clk = ~ sys_clk; //5ns一个周期,产生50MHz时钟源 endmodule
仿真
结果:
有问题可以留言私信,看到必回