7系列FPGA的MMCM的原语有两种,分别是MMCME2_BASE
和MMCME2_ADV
一、MMCME2_BASE
MMCME2_BASE是基本的混合模式时钟管理器,它提供了基本的时钟管理功能,如分频、倍频和相位调整等
它适用于大多数常见的时钟管理需求,并且相对简单易用
通过配置相应的端口和参数,可以实现输入时钟的相位锁定、频率转换以及占空比调整
入时钟经过PFD(phase-frequency detector),CP(charge pump),LF(loop filter)后产生一定幅度的电压输入到VCO,VCO产生频率与输入电压幅度成比例的高频时钟,再被除以M倍并反馈到PFD。
因此VCO的输出频率是一个稳定的、输入频率M倍的高频时钟,该时钟除以不同的倍数(用户可调)即可输出时钟clkout0 clkout6
另外第0路输出和反馈输出是可以被分数除法,且第0路第3路提供反相180度的输出,VCO的输出还可以精确调整相位
任何使用MMCM电路的,其输入时钟都要VCO,然后再统一分配出去
输出的计算公式
VCO Frequency
= (Input Clock Frequency) * (CLKFBOUT_MULT)/DIVCLK_DIVIDE
所以输出的频率clkout_freq = VCO_freq / DIV
CLKFBIN : Feedback clock pin to the MMCM.
CLKFBOUT :Dedicated MMCM Feedback clock output.
在MMCM中,反馈时钟是指从MMCM的输出时钟信号中重新引导一个时钟信号作为MMCM的输入信号的一种配置方式;
通常MMCM的输出时钟可以通过分频或者倍频操作取得所需的时钟频率,而当需要使用输出时钟信号多为输入时钟信号的一部分时,即需要将输出时钟信号再次输入到MMCM中进行进一步的时钟操作时,就需要使用到反馈时钟;
使用反馈时钟可以在MMCM中实现复杂的时钟操作,比如多级分频、倍频或者相位调整等,通过将输出时钟信号反馈到MMCM的输入端,可以将其作为新的时钟信号进行进一步的时钟控制和操作
1.MMCME2_BASE源程序
// MMCME2_BASE : In order to incorporate this function into the design,
// Verilog : the following instance declaration needs to be placed
// instance : in the body of the design code. The instance name
// declaration : (MMCME2_BASE_inst) and/or the port declarations within the
// code : parenthesis may be changed to properly reference and
// : connect this function to the design. All inputs
// : and outputs must be connected.
// <-----Cut code below this line---->
// MMCME2_BASE: Base Mixed Mode Clock Manager
// Artix-7
// Xilinx HDL Language Template, version 2022.1
MMCME2_BASE #(
.BANDWIDTH("OPTIMIZED"), // 指定抖动的算法 (OPTIMIZED, HIGH, LOW)
.CLKFBOUT_MULT_F(5.0), // 所有时钟的乘数 (2.000-64.000).
.CLKFBOUT_PHASE(0.0), // CLKFB的相位偏移度 (-360.000-360.000).
.CLKIN1_PERIOD(0.0), // 输入时钟的周期 小数点后三位(i.e. 33.333 is 30 MHz).
// CLKOUT0_DIVIDE - CLKOUT6_DIVIDE: Divide amount for each CLKOUT (1-128)
.CLKOUT1_DIVIDE(1),
.CLKOUT2_DIVIDE(1),
.CLKOUT3_DIVIDE(1),
.CLKOUT4_DIVIDE(1),
.CLKOUT5_DIVIDE(1),
.CLKOUT6_DIVIDE(1),
.CLKOUT0_DIVIDE_F(1.0), // Divide amount for CLKOUT0 (1.000-128.000).
// CLKOUT0_DUTY_CYCLE - CLKOUT6_DUTY_CYCLE:占空比(0.01-0.99).
.CLKOUT0_DUTY_CYCLE(0.5),
.CLKOUT1_DUTY_CYCLE(0.5),
.CLKOUT2_DUTY_CYCLE(0.5),
.CLKOUT3_DUTY_CYCLE(0.5),
.CLKOUT4_DUTY_CYCLE(0.5),
.CLKOUT5_DUTY_CYCLE(0.5),
.CLKOUT6_DUTY_CYCLE(0.5),
// CLKOUT0_PHASE - CLKOUT6_PHASE: 输出时钟的偏移(-360.000-360.000).
.CLKOUT0_PHASE(0.0),
.CLKOUT1_PHASE(0.0),
.CLKOUT2_PHASE(0.0),
.CLKOUT3_PHASE(0.0),
.CLKOUT4_PHASE(0.0),
.CLKOUT5_PHASE(0.0),
.CLKOUT6_PHASE(0.0),
.CLKOUT4_CASCADE("FALSE"), // Cascade CLKOUT4 counter with CLKOUT6 (FALSE, TRUE)
.DIVCLK_DIVIDE(1), // 输出时钟相对于输入时钟的分频比(1-106)
.REF_JITTER1(0.0), // Reference input jitter in UI (0.000-0.999).
.STARTUP_WAIT("FALSE") // Delays DONE until MMCM is locked (FALSE, TRUE)
)
MMCME2_BASE_inst (
// Clock Outputs: 1-bit (each)