MMCM DRP动态配置方法

 

Xilinx XAPP888 MMCM and PLL Dynamic Reconfiguration, Application Note

https://fpga.eetrend.com/files-eetrend-xilinx/download/201307/4239-8635-xapp8887seriesdynamicrecon.pdf 

 

额外知识点

BUFG与ODDR
例程使用

BUFG BUFG_IN    (.O (clkin_bufgout),    .I (CLKIN_ibuf));
ODDR ODDR_CLK0 (.Q(CLK0OUT), .C(clk0_bufgout), .CE(1'b1), .D1(1'b1), .D2(1'b0), .R(RST), .S(1'b0));
BUFG ODDR

1.BUFG —— 全局时钟缓冲器(Global Clock Buffer)

它可以将输入的时钟信号分发到 FPGA 内部的全局时钟网络;
保证时钟在整个 FPGA 内部的 低延迟、高驱动、低偏斜(Skew)。
通常用于处理 MMCM/PLL 输出、IO时钟输入等所有需要“全局同步”的时钟源。
如果直接使用未经 BUFG 缓冲的时钟:
可能无法驱动逻辑,因为普通信号线无法到达全局资源;
时钟偏斜不可控,极易产生 Setup/Hold 失败。

2. ODDR —— 输出双沿寄存器(Output DDR Flip-Flop)

ODDR ODDR_CLK0 (
    .Q(CLK0OUT),           // 输出时钟,连接到 IOB 或约束的引脚上
    .C(clk0_bufgout),      // 时钟输入
    .CE(1'b1),             // 始终使能
    .D1(1'b1),             // 上升沿输出高
    .D2(1'b0),             // 下降沿输出低
    .R(RST),               // 复位
    .S(1'b0)               // 不使用同步置位
);
ODDR

作用说明:

ODDR 的主要作用是将 FPGA 内部的时钟信号输出到 IO 引脚上;

它通过在上升沿输出高电平,下降沿输出低电平,形成一个完整的时钟周期,得到标准的方波输出;

常用于:

输出时钟到外部器件(如传感器、ADC/DAC、摄像头模块);

提供外部同步时钟,用于多个芯片之间的时序对齐。

⚠️ 使用注意事项:

ODDR 的输出 Q 必须直接约束到 IO 引脚(使用约束文件 .xdc 或 .ucf)。
如果不经过 ODDR 直接输出 clk 到引脚,可能无法综合通过,因为 Vivado 不允许直接将 BUFG 驱动外部。
ODDR 只能用于输出,不能作为普通逻辑使用。

3.Verilog 语法分析:移位寄存器

always @ (posedge clkin_bufgout or posedge SSTEP)
    if (SSTEP) sstep_int <=  8'h80;
    else sstep_int <= {1'b0, sstep_int[7:1]};
sstep_int

语句块实现了一个 右移位寄存器,取sstep_int[0]可以将长脉冲变为滞后7个时钟周期的单脉冲信号。

 

一、MMCM 源语介绍

1、调用源语

image

 

https://blog.csdn.net/weixin_62432906/article/details/144068333

 

 

要配置mmcme2_adv原语的参数,需要了解以下几个关键参数:

CLKIN1_PERIOD:输入时钟的周期。根据输入时钟的频率,可以计算出周期。例如,如果输入时钟频率为100MHz,则CLKIN1_PERIOD为10ns。

CLKFBOUT_MULT_F:反馈时钟倍频因子。它决定了反馈时钟的频率相对于输入时钟的倍数。例如,如果CLKFBOUT_MULT_F设置为10,则反馈时钟的频率是输入时钟频率的10倍。

CLKFBOUT_PHASE:反馈时钟的相位偏移。它决定了反馈时钟相对于输入时钟的相位差。可以通过设置不同的相位值来实现时钟相位调整。

DIVCLK_DIVIDE:分频因子。它决定了输出时钟频率相对于反馈时钟的倍数。例如,如果DIVCLK_DIVIDE设置为2,则输出时钟频率是反馈时钟频率的一半。

CLKOUT0_DIVIDE_F:输出时钟0的分频因子。它决定了输出时钟0的频率相对于反馈时钟的倍数。

CLKOUT0_PHASE:输出时钟0的相位偏移。它决定了输出时钟0相对于反馈时钟的相位差

其他输出时钟的分频因子和相位偏移参数,如CLKOUT1_DIVIDE_F、CLKOUT1_PHASE等。

1.

image

2.

image

 https://blog.csdn.net/lzr232/article/details/145611723

 

 

 

Xilinx FPGA DRP动态可重配置时钟+手动分频实现0~40.96Mhz共400阶时钟

https://blog.csdn.net/m0_62302696/article/details/149296961?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-149296961-blog-144068333.235%5Ev43%5Epc_blog_bottom_relevance_base8&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-2-149296961-blog-144068333.235%5Ev43%5Epc_blog_bottom_relevance_base8&utm_relevant_index=3

 

利用DRP动态调整MMCME2时钟频率

https://blog.csdn.net/Cheng9730/article/details/127079040

 

MMCM结构

MMCM的结构见UG472的Figure 3-2。

image

 

时钟方面:CLKIN1为输入的Primary时钟,CLKIN2为输入的Secondary时钟,CLKOUT0~6为输出时钟,CLKFB为反馈时钟。

频率方面:D为输入时钟的分频器,O0~O6为输出时钟的分频器(O0支持小数分频),M为反馈时钟的分频器(支持小数分频)。

时钟频率按照下式计算:


CLKOUT0 = CLKIN1/2 × M / D / O0

MMCM输出频率的动态调整

从IP Integrator中添加时钟IP核时,可选择通过AXI4-Lite接口或DRP接口进行动态配置。对于K7系列FPGA,使用AXI4-Lite接口进行配置时,消耗的资源见PG065的Table 4-1。

image

 上述资源消耗较多,采用DRP接口可节省LUT资源。DRP接口见PG065的Table 2-1。

image

 通过DRP端口可访问的寄存器及寄存器位域的定义见XAPP888手册Table 1~Table 15。

image

 

通过上述寄存器可修改MMCM结构中输入时钟分频、输出时钟分频和反馈时钟分频的值,从而实现对输出时钟频率的调整。

MMCM动态配置期间或配置完成后必须进行复位,因此时钟频率的切换并不是一个连续的过程,见XAPP888。

image

 

参考设计

参考设计概述

XAPP888包含了一个利用DRP端口进行重配置的参考设计,其连接关系见XAPP888的Figure 3。

image

 

 其中,MMCM_DRP为官方提供的用于时钟动态配置的控制模块;MMCME2_ADV为MMCM时钟的原语。MMCM_DRP的结构图见XAPP888的Figure 2。

image

 

MMCM_DRP模块包含一组用户接口(S*)和一组MMCM的控制接口(D*)。利用状态机在用户信号的控制下,从内部的ROM中读出配置相关的寄存器数据,并通过MMCM控制接口写入MMCM。

MMCM_DRP模块的端口
MMCM_DRP模块的端口见XAPP888的Table 17。

image

 

其中,绿色部分为用户接口信号,需要用户进行控制。SADDR的作用是在预先保存的几种MMCM配置之间进行选择,MMCM_DRP模块默认包含两个MMCM配置(state 1和state 2);其余信号的作用见表中描述即可。

MMCM_DRP模块的参数
MMCM_DRP模块的参数包含2部分。

第1部分为用于对锁定信号LOCKED(来自MMCM)的使用方式进行设置(XAPP888手册中没写,实际使用中区别应该不大);

// Register the LOCKED signal with teh MMCME3_ADV input clock.
// The LOCKED_IN (LOCKED from the MMCME3_ADV) is fed into a register and then
// passed the LOCKED_OUT when REGISTER_LOCKED is set to "Reg" or when set to
// "NoReg" LOCKED_IN is just passed on to LOCKED_OUT without being registered.
parameter REGISTER_LOCKED       = "Reg",
// Use the registered LOCKED signal from the MMCME3 also for the DRP state machine.
parameter USE_REG_LOCKED        = "No",
// Possible/allowed combinations of above two parameters:
// | REGISTER_LOCKED | USE_REG_LOCKED |                                            |
// |-----------------|----------------|--------------------------------------------|
// |      "NoReg"    |     "No"       | LOCKED is just passed through mmcme3_drp   |
// |                 |                | and is used as is with the state machine   |
// |      "NoReg"    |     "Yes"      | NOT ALLOWED                                |
// |       "Reg"     |     "No"       | LOCKED is registered but the unregistered  |
// |                 |                | version is used for the state machine.     |
// |       "Reg"     |     "Yes"      | LOCKED is registered and the registered    |
// |                 |                | version is also used by the state machine. |
第1部分为用于对锁定信号LOCKED

第2部分用于对预先保存的几种MMCM配置进行设置,与MMCM原语的参数设置类似;其中,MMCM_DRP模块默认包含两种MMCM配置,分别以S1_和S2_作为前缀。

反馈时钟相关参数:

// These parameters have an effect on the feedback path. A change on
// these parameters will effect all of the clock outputs.
//
// The parameters are composed of:
//    _MULT: This can be from 2 to 64. It has an effect on the VCO
//          frequency which consequently, effects all of the clock
//          outputs.
//    _PHASE: This is the phase multiplied by 1000. For example if
//          a phase of 24.567 deg was desired the input value would be
//          24567. The range for the phase is from -360000 to 360000.
//    _FRAC: This can be from 0 to 875. This represents the fractional
//          divide multiplied by 1000.
//          M = _MULT + _FRAC / 1000
//          e.g. M=8.125
//               _MULT = 8
//               _FRAC = 125
//    _FRAC_EN: This indicates fractional divide has been enabled. If 1
//          then the fractional divide algorithm will be used to calculate
//          register settings. If 0 then default calculation to be used.
parameter S1_CLKFBOUT_MULT          = 5,
parameter S1_CLKFBOUT_PHASE         = 0,
parameter S1_CLKFBOUT_FRAC          = 125,
parameter S1_CLKFBOUT_FRAC_EN       = 1,
反馈时钟相关参数:

带宽参数:

// The bandwidth parameter effects the phase error and the jitter filter
// capability of the MMCM. For more information on this parameter see the
// Device user guide.
// Possible values are: "LOW", "LOW_SS", "HIGH" and "OPTIMIZED"
parameter S1_BANDWIDTH              = "LOW",
带宽参数:

输入时钟分频参数:

// The divclk parameter allows the input clock to be divided before it
// reaches the phase and frequency comparator. This can be set between
// 1 and 128.
parameter S1_DIVCLK_DIVIDE          = 1,
输入时钟分频参数:

输出时钟相关参数:

// The following parameters describe the configuration that each clock
// output should have once the reconfiguration for state one has
// completed.
//
// The parameters are composed of:
//    _DIVIDE: This can be from 1 to 128
//    _PHASE: This is the phase multiplied by 1000. For example if
//          a phase of 24.567 deg was desired the input value would be
//          24567. The range for the phase is from -360000 to 360000.
//    _DUTY: This is the duty cycle multiplied by 100,000.  For example if
//          a duty cycle of .24567 was desired the input would be
//          24567.
//
parameter S1_CLKOUT0_DIVIDE         = 1,
parameter S1_CLKOUT0_PHASE          = 0,
parameter S1_CLKOUT0_DUTY           = 50000,
parameter S1_CLKOUT0_FRAC          = 125,
parameter S1_CLKOUT0_FRAC_EN       = 1,
//
parameter S1_CLKOUT1_DIVIDE         = 1,
parameter S1_CLKOUT1_PHASE          = 0,
parameter S1_CLKOUT1_DUTY           = 50000,
//
parameter S1_CLKOUT2_DIVIDE         = 1,
parameter S1_CLKOUT2_PHASE          = 0,
parameter S1_CLKOUT2_DUTY           = 50000,
//
parameter S1_CLKOUT3_DIVIDE         = 1,
parameter S1_CLKOUT3_PHASE          = 0,
parameter S1_CLKOUT3_DUTY           = 50000,
//
parameter S1_CLKOUT4_DIVIDE         = 1,
parameter S1_CLKOUT4_PHASE          = 0,
parameter S1_CLKOUT4_DUTY           = 50000,
//
parameter S1_CLKOUT5_DIVIDE         = 1,
parameter S1_CLKOUT5_PHASE          = 0,
parameter S1_CLKOUT5_DUTY           = 50000,
//
parameter S1_CLKOUT6_DIVIDE         = 1,
parameter S1_CLKOUT6_PHASE          = 0,
parameter S1_CLKOUT6_DUTY           = 50000,
输出时钟相关参数:

MMCM_DRP的状态机

MMCM_DRP模块状态机的状态和跳转条件定义见XAPP888的Table 16。

image

 

上电或复位后先后经历RESTART和WAIT_LOCK状态,待MMCM锁定后进入WAIT_SEN状态等待用户输入的动态配置命令(即SEN=1);命令有效时,则通过MMCM控制接口访问MMCM的寄存器进行动态配置,写入完成后进入WAIT_LOCK状态,待MMCM锁定后回到WAIT_SEN状态。

MMCM_DRP访问MMCM寄存器的操作流程为:

1.使能MMCM的复位信号;
2.设置要读出DADDR,并使能DEN信号,持续1个时钟周期;
3.等待MMCM反馈的DRDY信号有效;
4.令DI = DO & MASK,将寄存器对应bit置0(MASK为ROM中存储的值);
5.令DI = DO | BITSET,将寄存器对应bit置1(BITSET为ROM中存储的值);
6.使能DEN和DWE信号,持续1个时钟周期;
7.等待MMCM的DRDY信号有效;
8.若所有寄存器全部修改完成,则释放MMCM的复位信号,并等待MMCM锁定;若寄存器未全部修改完成,则返回2.继续修改。

posted on 2025-09-16 16:06  taylorrrrrrrrrr  阅读(257)  评论(0)    收藏  举报