一般来说,开发板的时钟是由板上的晶振产生的,频率大部分是固定的,但是我们在应用中有时候需要其他频率的时钟信号。为了解决这个问题,FPGA内部会留有专门的设置电路——时钟管理单元(硬件资源),利用已有的时钟信号来产生其他的时钟信号。
比如晶振50MHz,我们需要125MHz的时钟信号,这时候就需要用锁相环来配置。
常用的时钟管理单元 clocking wizard 有 PLL 和 MMCM 两种锁相环 。PLL是模拟电路,精度高,稳定,价格较贵,MMCM是数字电路,价格便宜。
Vivado中有clocking wizard的IP核可以直接调用,在这里我们直接设置好 input clock frequency , outputput clock frequency (phase ) , locked 三个信号即可。(一个IP核可以根据一个输入时钟信号输出多个不同的时钟信号)。locked信号是输出时钟信号达到稳定的标志。
配置锁相环:
注意:1.内部模块中不需要用到的端口可以直接不接。
2.例化模板直接在下图找。
代码:
module PLL_MMCM(//学会配置锁相环,clk,reset,locked_PLL,locked_MMCM,clk_ctrl_pll,clk_ctrl_mmcm_1,clk_ctrl_mmcm_2);input clk ;input reset ;output locked_PLL ;output locked_MMCM ;output clk_ctrl_pll ;output clk_ctrl_mmcm_1 ;output clk_ctrl_mmcm_2 ;PLL PLL(.clk_out1(clk_ctrl_pll),.reset(reset), // input reset.locked(locked_PLL), // output locked.clk_in1(clk)); MMCM MMCM(// Clock out ports.clk_out1(clk_ctrl_mmcm_1),// output clk_out1.clk_out2(clk_ctrl_mmcm_2),// output clk_out2// Status and control signals.reset(reset), // input reset.locked(locked_MMCM), // output locked// Clock in ports.clk_in1(clk)); endmodule
`timescale 1ns / 1nsmodule PLL_MMCM_tb();reg clk ;reg reset ;wire locked_PLL ;wire locked_MMCM ;wire clk_ctrl_pll ;wire clk_ctrl_mmcm_1 ;wire clk_ctrl_mmcm_2 ;PLL_MMCM PLL_MMCM(//clk,reset,locked_PLL,locked_MMCM,clk_ctrl_pll,clk_ctrl_mmcm_1,clk_ctrl_mmcm_2);initial clk = 1 ;always #10 clk = ! clk ;initial begin reset = 1 ;#201 ;reset = 0 ;#200000 ;$stop ;endendmodule
结果:
PLL较快达到输出稳定(locked先高电平)
设置的90相位差有效。