MMCME4_ADV与PLL4_ADV原语

MMCM与PLL

​ UltraScale器件中时钟管理模块(CMT)包含mixed-mode clock manager (MMCM) 和phase-locked loops (PLLs) 。PLL主要用来生成I/O时钟,也包含一部分MMCM的功能。

​ 其中MMCM输出时钟相位调整语VCO频率相关。

MMCME4_ADV原语

​ MMCM原语包含MMCME3_BASE和MMCME3_ADV,在UltraScale+ 器件中MMCME4替代MMCME3。UltraScale+ 器件MMCM原语包含MMCME4_BASE和MMCME4_ADV。

​ MMCME4_BASE实现基本MMCM功能。MMCME4_ADV除了能实现MMCME4_BASE功能外,还可以实现动态可重配等功能。

计算输出时钟频率

​ 时钟输出频率和VCO输出频率计算公式如下,其中M值通过CLKFBOUT_MULT_F设置,D值通过DIVLK_DIVIDE设置,O的值为通过CLKOUT_DIVIDE.设置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aj9gQWyP-1673524866829)(./pic/1.png)]

​ 下图代码中CLKFBOUT_MULT_F设置成8,DIVCLK_DIVIDE设置成1,CLKOUT0_DIVIDE_F设置成4,输入时钟频率CLKIN1_PERIOD等于10,为100Mhz。通过公式计算CLKOUT0输出为100*8/4=200Mhz。

MMCME4_ADV #(
      .BANDWIDTH("OPTIMIZED"),        // Jitter programming
      .CLKFBOUT_MULT_F(8),          // Multiply value for all CLKOUT
      .CLKFBOUT_PHASE(0.0),           // Phase offset in degrees of CLKFB
      .CLKFBOUT_USE_FINE_PS("FALSE"), // Fine phase shift enable (TRUE/FALSE)
      .CLKIN1_PERIOD(10),            // Input clock period in ns to ps resolution (i.e., 33.333 is 30 MHz).
      .CLKIN2_PERIOD(0.0),            // Input clock period in ns to ps resolution (i.e., 33.333 is 30 MHz).
      .CLKOUT0_DIVIDE_F(4),         // Divide amount for CLKOUT0
      .CLKOUT0_DUTY_CYCLE(0.5),       // Duty cycle for CLKOUT0
      .CLKOUT0_PHASE(0.0),            // Phase offset for CLKOUT0
      .CLKOUT0_USE_FINE_PS("FALSE"),  // Fine phase shift enable (TRUE/FALSE)
      .CLKOUT1_DIVIDE(1),             // Divide amount for CLKOUT (1-128)
      .CLKOUT1_DUTY_CYCLE(0.5),       // Duty cycle for CLKOUT outputs (0.001-0.999).
      .CLKOUT1_PHASE(0.0),            // Phase offset for CLKOUT outputs (-360.000-360.000).
      .CLKOUT1_USE_FINE_PS("FALSE"),  // Fine phase shift enable (TRUE/FALSE)
      .CLKOUT2_DIVIDE(1),             // Divide amount for CLKOUT (1-128)
      .CLKOUT2_DUTY_CYCLE(0.5),       // Duty cycle for CLKOUT outputs (0.001-0.999).
      .CLKOUT2_PHASE(0.0),            // Phase offset for CLKOUT outputs (-360.000-360.000).
      .CLKOUT2_USE_FINE_PS("FALSE"),  // Fine phase shift enable (TRUE/FALSE)
      .CLKOUT3_DIVIDE(1),             // Divide amount for CLKOUT (1-128)
      .CLKOUT3_DUTY_CYCLE(0.5),       // Duty cycle for CLKOUT outputs (0.001-0.999).
      .CLKOUT3_PHASE(0.0),            // Phase offset for CLKOUT outputs (-360.000-360.000).
      .CLKOUT3_USE_FINE_PS("FALSE"),  // Fine phase shift enable (TRUE/FALSE)
      .CLKOUT4_CASCADE("FALSE"),      // Divide amount for CLKOUT (1-128)
      .CLKOUT4_DIVIDE(1),             // Divide amount for CLKOUT (1-128)
      .CLKOUT4_DUTY_CYCLE(0.5),       // Duty cycle for CLKOUT outputs (0.001-0.999).
      .CLKOUT4_PHASE(0.0),            // Phase offset for CLKOUT outputs (-360.000-360.000).
      .CLKOUT4_USE_FINE_PS("FALSE"),  // Fine phase shift enable (TRUE/FALSE)
      .CLKOUT5_DIVIDE(8),             // Divide amount for CLKOUT (1-128)
      .CLKOUT5_DUTY_CYCLE(0.5),       // Duty cycle for CLKOUT outputs (0.001-0.999).
      .CLKOUT5_PHASE(0.0),            // Phase offset for CLKOUT outputs (-360.000-360.000).
      .CLKOUT5_USE_FINE_PS("FALSE"),  // Fine phase shift enable (TRUE/FALSE)
      .CLKOUT6_DIVIDE(1),             // Divide amount for CLKOUT (1-128)
      .CLKOUT6_DUTY_CYCLE(0.5),       // Duty cycle for CLKOUT outputs (0.001-0.999).
      .CLKOUT6_PHASE(0.0),            // Phase offset for CLKOUT outputs (-360.000-360.000).
      .CLKOUT6_USE_FINE_PS("FALSE"),  // Fine phase shift enable (TRUE/FALSE)
      .COMPENSATION("AUTO"),          // Clock input compensation
      .DIVCLK_DIVIDE(1),              // Master division value
      .IS_CLKFBIN_INVERTED(1'b0),     // Optional inversion for CLKFBIN
      .IS_CLKIN1_INVERTED(1'b0),      // Optional inversion for CLKIN1
      .IS_CLKIN2_INVERTED(1'b0),      // Optional inversion for CLKIN2
      .IS_CLKINSEL_INVERTED(1'b0),    // Optional inversion for CLKINSEL
      .IS_PSEN_INVERTED(1'b0),        // Optional inversion for PSEN
      .IS_PSINCDEC_INVERTED(1'b0),    // Optional inversion for PSINCDEC
      .IS_PWRDWN_INVERTED(1'b0),      // Optional inversion for PWRDWN
      .IS_RST_INVERTED(1'b0),         // Optional inversion for RST
      .REF_JITTER1(0.0),              // Reference input jitter in UI (0.000-0.999).
      .REF_JITTER2(0.0),              // Reference input jitter in UI (0.000-0.999).
      .SS_EN("FALSE"),                // Enables spread spectrum
      .SS_MODE("CENTER_HIGH"),        // Spread spectrum frequency deviation and the spread type
      .SS_MOD_PERIOD(10000),          // Spread spectrum modulation period (ns)
      .STARTUP_WAIT("FALSE")          // Delays DONE until MMCM is locked
   )
   MMCME4_ADV_inst (
      .CDDCDONE(),         // 1-bit output: Clock dynamic divide done
      .CLKFBOUT(clk_fb),         // 1-bit output: Feedback clock
      .CLKFBOUTB(),       // 1-bit output: Inverted CLKFBOUT
      .CLKFBSTOPPED(), // 1-bit output: Feedback clock stopped
      .CLKINSTOPPED(), // 1-bit output: Input clock stopped
      .CLKOUT0(clkout0),           // 1-bit output: CLKOUT0
      .CLKOUT0B(),         // 1-bit output: Inverted CLKOUT0
      .CLKOUT1(clkout1),           // 1-bit output: CLKOUT1
      .CLKOUT1B(),         // 1-bit output: Inverted CLKOUT1
      .CLKOUT2(clkout2),           // 1-bit output: CLKOUT2
      .CLKOUT2B(),         // 1-bit output: Inverted CLKOUT2
      .CLKOUT3(clkout3),           // 1-bit output: CLKOUT3
      .CLKOUT3B(),         // 1-bit output: Inverted CLKOUT3
      .CLKOUT4(clkout4),           // 1-bit output: CLKOUT4
      .CLKOUT5(clkout5),           // 1-bit output: CLKOUT5
      .CLKOUT6(clkout6),           // 1-bit output: CLKOUT6
      .DO(),                     // 16-bit output: DRP data output
      .DRDY(),                 // 1-bit output: DRP ready
      .LOCKED(lock),             // 1-bit output: LOCK
      .PSDONE(),             // 1-bit output: Phase shift done
      .CDDCREQ(1'b0),           // 1-bit input: Request to dynamic divide clock
      .CLKFBIN(clk_fb_g),           // 1-bit input: Feedback clock
      .CLKIN1(clk_in),             // 1-bit input: Primary clock
      .CLKIN2(1'b0),             // 1-bit input: Secondary clock
      .CLKINSEL(1'b1),         // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2
      .DADDR(7'b0),               // 7-bit input: DRP address
      .DCLK(1'b0),                 // 1-bit input: DRP clock
      .DEN(1'b0),                   // 1-bit input: DRP enable
      .DI(16'b0),                     // 16-bit input: DRP data input
      .DWE(1'b0),                   // 1-bit input: DRP write enable
      .PSCLK(1'b0),               // 1-bit input: Phase shift clock
      .PSEN(1'b0),                 // 1-bit input: Phase shift enable
      .PSINCDEC(1'b0),         // 1-bit input: Phase shift increment/decrement
      .PWRDWN(1'b0),             // 1-bit input: Power-down
      .RST(rst)                    // 1-bit input: Reset
   );

使用全局时钟网络

​ 如下图所示,CLKOUT0输出要经过全局时钟网络BUFG,CLKFBOUT通过BUFG反馈到CLKFBIN。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpasQe6W-1673524866830)(./pic/2.png)]

代码如下:

BUFG u_clkout0
   (
   .O (clk_out0_g),
   .I (clkout0)  
   ); 
 BUFG u_clk_fb
   (
   .O (clk_fb_g),
   .I (clk_fb)  
   ); 

PLL4_ADV

​ UltraScale+ 器件包含PLL4_BASE和PLL4_ADV。

​ PLL4_ADV原语输出时钟频率计算方式与MMCME4_ADV一样。输入时钟周期为5ns,频率200Mhz,CLKFBOUT_MULT_F设置成4,DIVCLK_DIVIDE设置成1,CLKOUT0_DIVIDE_F设置成4,CLKOUT0输出依然为200Mhz。

 PLLE4_ADV #(
      .CLKFBOUT_MULT(4),          // Multiply value for all CLKOUT
      .CLKFBOUT_PHASE(0.0),       // Phase offset in degrees of CLKFB
      .CLKIN_PERIOD(5),         // Input clock period in ns to ps resolution (i.e., 33.333 is 30 MHz).
      .CLKOUT0_DIVIDE(4),         // Divide amount for CLKOUT0
      .CLKOUT0_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT0
      .CLKOUT0_PHASE(0.0),        // Phase offset for CLKOUT0
      .CLKOUT1_DIVIDE(1),         // Divide amount for CLKOUT1
      .CLKOUT1_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT1
      .CLKOUT1_PHASE(0.0),        // Phase offset for CLKOUT1
      .CLKOUTPHY_MODE("VCO_2X"),  // Frequency of the CLKOUTPHY
      .COMPENSATION("AUTO"),      // Clock input compensation
      .DIVCLK_DIVIDE(1),          // Master division value
      .IS_CLKFBIN_INVERTED(1'b0), // Optional inversion for CLKFBIN
      .IS_CLKIN_INVERTED(1'b0),   // Optional inversion for CLKIN
      .IS_PWRDWN_INVERTED(1'b0),  // Optional inversion for PWRDWN
      .IS_RST_INVERTED(1'b0),     // Optional inversion for RST
      .REF_JITTER(0.0),           // Reference input jitter in UI
      .STARTUP_WAIT("FALSE")      // Delays DONE until PLL is locked
   )
   PLLE4_ADV_inst (
      .CLKFBOUT(clk_fb),       // 1-bit output: Feedback clock
      .CLKOUT0(clk0),         // 1-bit output: General Clock output
      .CLKOUT0B(),       // 1-bit output: Inverted CLKOUT0
      .CLKOUT1(clk1),         // 1-bit output: General Clock output
      .CLKOUT1B(),       // 1-bit output: Inverted CLKOUT1
      .CLKOUTPHY(),     // 1-bit output: Bitslice clock
      .DO(),                   // 16-bit output: DRP data output
      .DRDY(),               // 1-bit output: DRP ready
      .LOCKED(lock),           // 1-bit output: LOCK
      .CLKFBIN(clk_fb_g),         // 1-bit input: Feedback clock
      .CLKIN(clk_in),             // 1-bit input: Input clock
      .CLKOUTPHYEN(1'b1), // 1-bit input: CLKOUTPHY enable
      .DADDR(7'b0),             // 7-bit input: DRP address
      .DCLK(1'b0),               // 1-bit input: DRP clock
      .DEN(1'b0),                 // 1-bit input: DRP enable
      .DI(16'b0),                   // 16-bit input: DRP data input
      .DWE(1'b0),                 // 1-bit input: DRP write enable
      .PWRDWN(1'b0),           // 1-bit input: Power-down
      .RST(rst)                  // 1-bit input: Reset
   );

使用方法

OSERDESE3 时钟

当MMCME4_ADV输出时钟作为OSERDESE3输入时钟是,MMCME4_ADV输出时钟通过BUFGCE和BUFGCE_DIV后,进入OSERDESE3。通过BUFGCE和BUFGCE_DIV来减少CLK与CLKDIV之间时钟偏差。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iuHT6PTI-1673524866831)(./pic/3.png)]

<think>好的,用户想了解如何在Vivado中使用MMCME2_ADV原语,并希望有示例说明。首先,我需要回忆一下MMCME2_ADV的基本信息。它是Xilinx FPGA中用于时钟管理的重要模块,属于混合模式时钟管理器,用于频率合成、相位调整和抖动过滤等。用户可能需要生成特定频率的时钟,或者调整相位关系,所以需要知道如何配置参数和例化该原语。 接下来,我应该考虑用户可能的背景。可能是一位FPGA工程师,正在处理时钟设计,遇到了需要手动例化MMCM的情况,而不仅仅依赖Vivado的自动生成。用户可能需要具体的代码示例和参数解释,以确保正确配置。 需要分步骤讲解使用方法。首先,原语的基本功能,然后是参数配置,如输入时钟频率、输出时钟需求、反馈模式等。接着是端口说明,如CLKIN1、CLKOUT0等。然后给出一个示例,说明如何根据需求计算参数,并编写Verilog代码。可能还要提醒用户注意时钟约束和Vivado的时钟向导工具,作为辅助手段。 需要检查是否有常见的错误点,比如反馈模式的选择(内部或外部),分频系数的计算,以及动态重配置的接口使用。此外,确保提到的参数名称和语法正确,比如CLKFBOUT_MULT_F、CLKOUT0_DIVIDE_F等,这些是MMCME2_ADV的关键参数。 用户可能还需要知道如何验证配置,比如通过仿真或硬件测试,但问题主要集中在使用方法上,所以可能不需要深入验证部分。但可以提及需要添加时钟约束,如create_clock,以确保时序分析正确。 最后,整理结构,先介绍原语的作用,然后详细参数配置,示例代码,并注意事项。确保用中文,术语准确,步骤清晰。避免使用Markdown格式,保持自然的口语化表达,但转换为书面说明。</think>在Vivado中使用MMCME2_ADV原语的步骤如下(以生成100MHz输入转200MHz输出为例): 1. **原语功能说明** MMCME2_ADV是Xilinx 7系列FPGA的时钟管理模块,支持: - 6路独立输出时钟 - 动态相位调整 - 频率合成(1.6MHz至800MHz输出) - 输入抖动滤波 2. **关键参数配置** ```verilog MMCME2_ADV #( .BANDWIDTH("OPTIMIZED"), // 抖动滤波模式 .CLKIN1_PERIOD(10.0), // 输入时钟周期10ns(100MHz) .CLKFBOUT_MULT_F(10.0), // 反馈乘法系数 .DIVCLK_DIVIDE(1), // 输入分频系数 .CLKOUT0_DIVIDE_F(5.0), // 输出分频系数 .CLKOUT0_PHASE(0.0) // 相位偏移 ) ``` *频率计算公式*: $$ f_{out} = \frac{f_{in} \times CLKFBOUT\_MULT\_F}{DIVCLK\_DIVIDE \times CLKOUT0\_DIVIDE\_F} $$ 本例中:$200MHz = \frac{100MHz \times 10}{1 \times 5}$ 3. **端口连接示例** ```verilog MMCME2_ADV mmcm_inst ( // 基础时钟端口 .CLKIN1(clk_100m), // 输入时钟 .CLKFBIN(clk_fb), // 反馈时钟 .CLKFBOUT(clk_fb), // 反馈输出 .CLKOUT0(clk_200m), // 主输出时钟 // 控制信号 .PWRDWN(1'b0), // 常使能 .RST(reset), // 复位信号 // 动态重配置端口(可选) .DADDR(7'h0), .DI(16'h0), .DWE(1'b0), .DEN(1'b0), .DCLK(1'b0) ); ``` 4. **注意事项** - 必须添加时钟约束: ```tcl create_clock -period 10.000 [get_ports clk_100m] ``` - 反馈模式选择: - *内部反馈*:CLKFBIN连接CLKFBOUT - *外部反馈*:通过FPGA引脚连接 - 推荐使用Clock Wizard生成初始配置,再手动优化参数 5. **典型应用场景** - 生成视频像素时钟(如148.5MHz) - 高速SerDes参考时钟 - 多时钟域系统的时钟生成 建议配合Vivado的时钟网络分析工具(Clock Interaction Report)验证时序裕量。实际开发中可通过DRP(Dynamic Reconfiguration Port)接口实现运行时频率调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬码农二毛哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值