前言
MMCM是Xilinx FPGA中用于时钟频率合成、相位调整和时钟管理的IP核。有些参数是用于配置和管理Xilinx FPGA中的MMCM(Mixed-Mode Clock Manager)时钟管理模块的参数。
比如有如下参数
parameter CLKIN_PERIOD_MMCM = 10000,parameter CLKFBOUT_MULT_MMCM = 10,parameter DIVCLK_DIVIDE_MMCM = 1,parameter CLKOUT0_DIVIDE_MMCM = 3,parameter CLKOUT1_DIVIDE_MMCM = 37,parameter CLKOUT2_DIVIDE_MMCM = 40,parameter CLKOUT3_DIVIDE_MMCM = 3,parameter CLKOUT4_DIVIDE_MMCM = 3,parameter CLKOUT6_DIVIDE_MMCM = 6,parameter CLKOUTPHY_MODE = "VCO_2X",parameter C_FAMILY = "virtexuplusHBM",
参数定义
以下是每个参数的含义及其应用方式:
CLKIN_PERIOD_MMCM: 这个参数定义了输入时钟的周期,单位是皮秒(ps)。例如,如果输入时钟频率为100 MHz,则其周期为10,000 ps。
CLKFBOUT_MULT_MMCM: 这是反馈时钟乘数,用于确定MMCM内部反馈路径的频率。反馈时钟是MMCM输出时钟经过分频后反馈到输入端的时钟。
DIVCLK_DIVIDE_MMCM: 这个参数定义了输入时钟分频器的分频因子。输入时钟通过这个分频器后,将用于控制MMCM内部的时钟频率。
CLKOUT0_DIVIDE_MMCM: 这是输出时钟0的分频因子。根据这个参数,MMCM将调整CLKOUT0的频率。
CLKOUT1_DIVIDE_MMCM: 这是输出时钟1的分频因子。与CLKOUT0类似,这个参数决定了CLKOUT1的频率。
CLKOUT2_DIVIDE_MMCM: 这是输出时钟2的分频因子。每个CLKOUTx_DIVIDE参数允许对每个输出时钟进行独立的频率控制。
CLKOUT3_DIVIDE_MMCM: 这是输出时钟3的分频因子。
CLKOUT4_DIVIDE_MMCM: 这是输出时钟4的分频因子。
CLKOUT6_DIVIDE_MMCM: 这是输出时钟6的分频因子。注意,没有CLKOUT5_DIVIDE参数,因为通常每个MMCM最多有6个输出。
CLKOUTPHY_MODE: 这个参数定义了时钟输出的模式。"VCO_2X"模式意味着时钟输出频率是VCO(压控振荡器)频率的两倍。
C_FAMILY: 这个参数定义了目标FPGA系列。"virtexuplusHBM"表示这是针对Virtex UltraPlus系列的HBM(高带宽存储器)版本。
应用方式
在Xilinx FPGA设计中,这些参数通常在MMCM的配置文件或约束文件中设置。例如,在Vivado设计套件中,你可以在MMCM的配置界面中设置这些参数,或者在xdc约束文件中指定它们。
配置文件示例
create_clock -period 10000 -name clk_in [get_ports {clk_in_pin}]set_property -dict { \{CLKIN_PERIOD {10000}} \{CLKFBOUT_MULT {10}} \{DIVCLK_DIVIDE {1}} \{CLKOUT0_DIVIDE {3}} \{CLKOUT1_DIVIDE {37}} \{CLKOUT2_DIVIDE {40}} \{CLKOUT3_DIVIDE {3}} \{CLKOUT4_DIVIDE {3}} \{CLKOUT6_DIVIDE {6}} \{CLKOUTPHY_MODE {VCO_2X}} \{C_FAMILY {virtexuplusHBM}} \
} [get_cells inst_name_of_mmcm]
约束文件(XDC)示例
set_property -dict [list \CONFIG.CLKIN_PERIOD_MMCM {10000} \CONFIG.CLKFBOUT_MULT_MMCM {10} \CONFIG.DIVCLK_DIVIDE_MMCM {1} \CONFIG.CLKOUT0_DIVIDE_MMCM {3} \CONFIG.CLKOUT1_DIVIDE_MMCM {37} \CONFIG.CLKOUT2_DIVIDE_MMCM {40} \CONFIG.CLKOUT3_DIVIDE_MMCM {3} \CONFIG.CLKOUT4_DIVIDE_MMCM {3} \CONFIG.CLKOUT6_DIVIDE_MMCM {6} \CONFIG.CLKOUTPHY_MODE {VCO_2X} \CONFIG.C_FAMILY {virtexuplusHBM} \
] [get_ips your_mmcm_instance_name]
在这些示例中,你需要将inst_name_of_mmcm
替换为MMCM实例的实际名称,your_mmcm_instance_name
替换为约束文件中MMCM实例的名称。
通过正确设置这些参数,你可以精确控制FPGA设计中的时钟频率、相位和时钟树结构,以满足特定应用的时序和性能要求。
时钟计算
要计算所有CLKOUT
的时钟频率,我们需要从输入时钟频率出发,并应用每个CLKOUT
特定的分频因子。以下是如何根据提供的参数计算每个CLKOUT
的频率:
已知参数:
- 输入时钟周期
CLKIN_PERIOD_MMCM
= 10000 ps(10 ns) - 输入时钟频率 = 1 /
CLKIN_PERIOD_MMCM
= 1 / 10 ns = 100 MHz - 反馈时钟乘数
CLKFBOUT_MULT_MMCM
= 10
计算步骤:
-
计算反馈时钟频率 (
CLKFBOUT
): \text{CLKFBOUT} = \text{输入时钟频率} \times \text{CLKFBOUT_MULT_MMCM} CLKFBOUT=100 MHz×10=1000 MHzCLKFBOUT=100 MHz×10=1000 MHz -
计算每个
CLKOUT
的频率: 对于每个CLKOUT
,我们使用相应的分频因子CLKOUTx_DIVIDE_MMCM
来计算频率。
计算每个CLKOUT
的频率:
-
CLKOUT0: \text{CLKOUT0} = \frac{\text{CLKFBOUT}}{\text{CLKOUT0_DIVIDE_MMCM}} CLKOUT0=1000 MHz3≈333.33 MHzCLKOUT0=31000 MHz≈333.33 MHz
-
CLKOUT1: \text{CLKOUT1} = \frac{\text{CLKFBOUT}}{\text{CLKOUT1_DIVIDE_MMCM}} CLKOUT1=1000 MHz37≈27.03 MHzCLKOUT1=371000 MHz≈27.03 MHz
-
CLKOUT2: \text{CLKOUT2} = \frac{\text{CLKFBOUT}}{\text{CLKOUT2_DIVIDE_MMCM}} CLKOUT2=1000 MHz40=25 MHzCLKOUT2=401000 MHz=25 MHz
-
CLKOUT3: \text{CLKOUT3} = \frac{\text{CLKFBOUT}}{\text{CLKOUT3_DIVIDE_MMCM}} CLKOUT3=1000 MHz3≈333.33 MHzCLKOUT3=31000 MHz≈333.33 MHz
-
CLKOUT4: \text{CLKOUT4} = \frac{\text{CLKFBOUT}}{\text{CLKOUT4_DIVIDE_MMCM}} CLKOUT4=1000 MHz3≈333.33 MHzCLKOUT4=31000 MHz≈333.33 MHz
-
CLKOUT6: \text{CLKOUT6} = \frac{\text{CLKFBOUT}}{\text{CLKOUT6_DIVIDE_MMCM}} CLKOUT6=1000 MHz6≈166.67 MHzCLKOUT6=61000 MHz≈166.67 MHz
注意事项:
- 上述计算假设了输入时钟频率为100 MHz,如果输入时钟频率不同,需要相应地调整计算。
- 分频因子是MMCM参数中定义的,确保这些参数值与设计要求一致。
- 计算结果是基于理想条件的,实际频率可能受到FPGA内部时钟树和布线延迟的影响