芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 813|回复: 1

如何使用AXI4接口对PLL/MMCM输出时钟的频率和相位进行动态重配置

[复制链接]

该用户从未签到

71

主题

100

帖子

1534

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1534
发表于 2024-9-2 14:09:49 | 显示全部楼层 |阅读模式
xilinx的7系列FPGA中,提供有高性能的时钟管理单元(CMT),每个CMT中都包含有一个PLL和MMCM。PLL和MMCM是实际存在的硬件电路,用以对输入时钟的负面变化,如抖动、频率变化、相位偏移、占空比失真等进行处理。用户可以通过配置clocking wizard核来控制PLL/MMCM电路,以使其基于输入时钟产生在频率、相位、占空比等方面符合要求的新时钟。clocking wizard核的配置方式有两种,一种是最直观的GUI界面配置,另一种则是本帖要讲的动态重配置


PLL/MMCM的动态重配置需要在GUI界面中勾选Dynamic Reconfig选项,然而该选项只能对时钟频率进行配置,用户如果想要配置相位和占空比,还需要勾选Phase Duty Cycle Config或者Dynamic Phase Shift。勾选Dynamic Phase Shift的情况下,IP核会多出四个引脚,功能如下:
引脚 功能
psclk 用于相移控制信号的驱动时钟
psen 控制相位偏移的使能信号,一个psen高脉冲,输出相位偏移1/56个VCO周期
psincdec 用于相位正负偏移的信号,1表示正向偏移,0表示负向偏移
psdone 相位偏移完成标志信号

使用该方式配置PLL相位相较复杂,用户需要提供参考时钟以及对应脉冲信号,因此,这里更推荐Phase Duty Cycle Config的方式。 MMCM配置.png
勾选了Dynamic Reconfig和Phase Duty Cycle Config之后,便可以通过对应的接口配置相关寄存器,接口通常选用AXI4-Lite。配置频率、相位、占空比的相关寄存器如下:
寄存器名 寄存器地址 功能
Software Reset Register (SRR)C_BASEADDR+0X00写入0x0000_000A可复位PLL/MMCM
Status Register (SR)C_BASEADDR+0X04 Locked信号,Bit[0] = locked,值为1时代表输出时钟稳定
Clock Configuration Register 0C_BASEADDR+0X200反馈时钟分、倍频控制,value = 系数*1000
Bit[25:16] = CLKFBOUT_FRAC Multiply(仅MMCM才有,VCO的1/8小数倍频系数)
Bit[15:8] = CLKFBOUT_MULT(VCO整数倍频系数)
Bit[7:0] = DIVCLK_DIVIDE(VCO分频系数)
Clock Configuration Register 1C_BASEADDR+0X204反馈时钟相位控制,value = 相位*1000
Bit[31:0] = CLKFBOUT_PHASE
Clock Configuration Register 2C_BASEADDR+0X208 CLKOUT0分频系数,value = 分频系数*1000
Bit[7:0] = CLKOUT0_DIVIDE
Bit[17:8] = CLKOUT0_FRAC Divide(仅MMCM才有,CLKOUT0的1/8小数倍频系数)
Clock Configuration Register 3C_BASEADDR+0X20CCLKOUT0相位配置,value = 相位*1000
Bit[31:0] = CLKOUT0_PHASE
Clock Configuration Register 4C_BASEADDR+0X210CLKOUT0占空比配置,value = 占空比*1000
Bit[31:0] = CLKOUT0_DUTY
Clock Configuration Register 5C_BASEADDR+0X214 CLKOUT1分频系数,不支持小数分频,value = 分频系数*1000
Bit[7:0] = CLKOUT1_DIVIDE
......
......
......
Clock Configuration Register 23C_BASEADDR+0X25CBit[0] = LOAD, 置 1 加载配置寄存器的值到内部寄存器,并在下一周期置0
Bit[1] = SADDR, 写 0 将默认 GUI 中的参数加载到动态配置中;
                        写 1 将配置寄存器参数加载到动态配置中

基于该表,用户在初始化Clk_Wiz后,只需要计算好所需的频率、相位、占空比对应的设置值,使用Xil_Out32函数配置对应寄存器即可。配置完成后再向Clock Configuration Register 23中写入0x3即可完成配置的加载,随后等待新时钟的生成。
示例代码如下

[C#] 纯文本查看 复制代码
//输入时钟50M,输出30M、相移180°和25M、相移0°时钟
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR,0xA);//reset MMCM
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR + 0x200,0x1F41301);//VCO = 50*19.5/1=975 MHz
//32.5分频,180°,占空比50%
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR + 0x208,0x1F420);//CLKOUT0 DIVIDE,Bit[17:8] = CLKOUT0_FRAC,Bit[7:0] = CLKOUT0_DIVIDE
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR + 0x20C,0x2BF20);//CLKOUT0 phase,value = phase*1000
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR + 0x210,0xC350);//CLKOUT0 duty,value = duty*1000
//39分频,0°,占空比50%
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR + 0x214,0x27);//CLKOUT1 DIVIDE,Bit[17:8] = CLKOUT1_FRAC,Bit[7:0] = CLKOUT1_DIVIDE
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR + 0x218,0x00);//CLKOUT1 phase,value = phase*1000
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR + 0x21C,0xC350);//CLKOUT1 duty,value = duty*1000

//更新配置
Xil_Out32(XPAR_CLK_WIZ_0_BASEADDR + 0x25C,0x03);//updata configuration




回复

使用道具 举报

该用户从未签到

71

主题

100

帖子

1534

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1534
 楼主| 发表于 2024-9-2 14:11:17 | 显示全部楼层
本帖内容已补全
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

GMT+8, 2024-12-4 02:54 , Processed in 0.084387 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表