黑金ax7020开发板原理图学习分享第四部分 时钟倍频时钟倍频分频-爱代码爱编程
1. 实验原理
PLL,锁相环。将参考信号FREF与可调反馈信号FO(多路)进行相位比较,由负反馈环路进行控制调节,当比较结果处于稳态,即输出频率和相位与误差检测器输入频率和相位匹配时,PLL被锁定。
PLL是FPGA中的重要资源,一个复杂的FPGA程序往往需要多个不同频率与相位的时钟信号,所以一个FPGA芯片中PLL数量是衡量FPGA芯片能力的重要指标。
AX7020开发板通过使用PLL输出一个方波到开发板拓展口J11的PIN3脚,进行PLL学习实验。
图1.1 PLL工作流程图
2. 工程创建
程序功能:将开发板上晶振提供的50MHz频率时钟倍频至200MHz、100MHz,分频到25MHz。
2.1 新建工程,调用PLL IP核。
新建pll_test工程,点击Project Manager界面下的IP Catalog。
在IP Catalog界面选择FPGA Features and Design\clocking下面的Clocking Wizard,双击打开配置页面。
组件默认名称为clk_wiz_0,可以不用改。在第一个界面Clocking Options里,选择PLL资源,输入时钟频率50MHz(由开发板上晶振提供)。
在Output Clocks界面选择clk1~4,4个时钟输出,频率分别为200MHz,100MHz,50MHz,25MHz。这里也可以设置时钟相位。
在弹出的对话框中点击Generate按钮生成PLL IP设计文件。
这时一个clk_wiz_0.xci的IP会自动添加到项目中,双击可修改IP配置。
选择IP资源页双击clk_wiz_0.veo这里有IP实例化模板,复制粘贴到自己程序中即可对IP进行实例化。
2.2 顶层设计文件编写
`timescale 1ns / 1p
//
module pll_test(
input sys_clk, //板上晶振提供的50M钟
input rst_n, //复位按键输入,低有效
output clk_out //PLL锁相环输出引脚,输出至J8的3脚
);
//注意,括号内,结尾
wire locked; //输出锁定,为高时PLL IP锁相环初始化完成
/PLL IP call
clk_wiz_0 clk_wiz_0_inst // IP 实例化
(// Clock in ports
.clk_in1(sys_clk), // 输入 50Mhz
// Clock out ports
.clk_out1(), // 输出200Mhz
.clk_out2(), // 输出 100Mhz
.clk_out3(), // 输出 50Mhz
.clk_out4(clk_out), // 输出 25Mhz
// Status and control signals
.reset(~rst_n), // PLL复位高有效(~rst_n)
.locked(locked)); //输出锁定,为高时PLL IP锁相环初始化完成
2.3 管脚约束文件编写
############## clock and reset define##################
create_clock -period 20 [get_ports sys_clk] //50MHz系统时钟取得
set_property IOSTANDARD LVCMOS33 [get_ports {sys_clk}] //时钟引脚3.3V
set_property PACKAGE_PIN U18 [get_ports {sys_clk}] //时钟引脚取自FPGA U18 脚
set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}] //复位引脚工作电压3.3V,取自FPGA N15脚
set_property PACKAGE_PIN N15 [get_ports {rst_n}]
############## pll output define J11 PIN3##################
set_property IOSTANDARD LVCMOS33 [get_ports clk_out] //时钟输出至F17脚,该引脚工作电压3.3V
set_property PACKAGE_PIN F17 [get_ports clk_out]
2.4 仿真文件编写
`timescale 1ns / 1ps
//
// Module Name: vtf_led_test
//
module vtf_pll_test;
// Inputs
reg sys_clk;
reg rst_n;
// Outputs
wire clk_out;
// 实例化PLL单元
pll_test uut (
.sys_clk(sys_clk),
.rst_n(rst_n),
.clk_out(clk_out)
);
initial begin
// 初始化输入
sys_clk = 0;
rst_n = 0;
// 100ns后复位至高直至仿真完毕
#100;
rst_n = 1;
// Add stimulus here
#20000;
// $stop;
end
always #10 sys_clk = ~ sys_clk; //5ns一个周期,产生50MHz时钟源
endmodule
2.5 仿真波形
输出25MHz时钟,时钟周期增至源时钟的两倍。F=1/T,时钟周期与频率之间的关系。
图2.1 仿真波形图
工程文件获取
链接:https://pan.baidu.com/s/1RYfZmh1-l0yB5MkI1h8r7A
提取码:s5uw