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));
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 的主要作用是将 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[0]可以将长脉冲变为滞后7个时钟周期的单脉冲信号。
一、MMCM 源语介绍
1、调用源语

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.

2.

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。

时钟方面: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。

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

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

通过上述寄存器可修改MMCM结构中输入时钟分频、输出时钟分频和反馈时钟分频的值,从而实现对输出时钟频率的调整。
MMCM动态配置期间或配置完成后必须进行复位,因此时钟频率的切换并不是一个连续的过程,见XAPP888。

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


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

其中,绿色部分为用户接口信号,需要用户进行控制。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. |
第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。

上电或复位后先后经历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) 收藏 举报
浙公网安备 33010602011771号