Xilinx V7系列中的MMCM原语
前言
笔者在学习Xilinx官方开发板Virtex-7 VC709中GTH适配的10G Subsystem Ethernet MAC
过程中,发现example design中有一个在VU13P中没有见过的原语,看了一下用户指南,决定记录一下;
MMCME2_BASE介绍
7系列FPGA的MMCM的原语有两种,分别是MMCME2_BASE
和MMCME2_ADV
MMCME2_BASE是基本的混合模式时钟管理器,它提供了基本的时钟管理功能,如分频、倍频和相位调整等
它适用于大多数常见的时钟管理需求,并且相对简单易用
通过配置相应的端口和参数,可以实现输入时钟的相位锁定、频率转换以及占空比调整
MMCME2_BASE使用
MMCM有2个时钟输入,使用时任选1路即可,输入时钟经过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的输入端,可以将其作为新的时钟信号进行进一步的时钟控制和操作
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) output: User configurable clock outputs
.CLKOUT0(CLKOUT0), // 1-bit output: CLKOUT0
.CLKOUT0B(CLKOUT0B), // 1-bit output: Inverted CLKOUT0
.CLKOUT1(CLKOUT1), // 1-bit output: CLKOUT1
.CLKOUT1B(CLKOUT1B), // 1-bit output: Inverted CLKOUT1
.CLKOUT2(CLKOUT2), // 1-bit output: CLKOUT2
.CLKOUT2B(CLKOUT2B), // 1-bit output: Inverted CLKOUT2
.CLKOUT3(CLKOUT3), // 1-bit output: CLKOUT3
.CLKOUT3B(CLKOUT3B), // 1-bit output: Inverted CLKOUT3
.CLKOUT4(CLKOUT4), // 1-bit output: CLKOUT4
.CLKOUT5(CLKOUT5), // 1-bit output: CLKOUT5
.CLKOUT6(CLKOUT6), // 1-bit output: CLKOUT6
// Feedback Clocks: 1-bit (each) output: Clock feedback ports
.CLKFBOUT(CLKFBOUT), // 1-bit output: Feedback clock
.CLKFBOUTB(CLKFBOUTB), // 1-bit output: Inverted CLKFBOUT
// Status Ports: 1-bit (each) output: MMCM status ports
.LOCKED(LOCKED), // 1-bit output: LOCK
// Clock Inputs: 1-bit (each) input: Clock input
.CLKIN1(CLKIN1), // 1-bit input: Clock
// Control Ports: 1-bit (each) input: MMCM control ports
.PWRDWN(PWRDWN), // 1-bit input: Power-down
.RST(RST), // 1-bit input: Reset
// Feedback Clocks: 1-bit (each) input: Clock feedback ports
.CLKFBIN(CLKFBIN) // 1-bit input: Feedback clock
);
// End of MMCME2_BASE_inst instantiation