clock gen sdk 代码笔记

本文详细介绍了Xilinx时钟配置的过程与原理,通过具体的寄存器配置示例,展示了如何实现特定频率的时钟输出。包括了核心寄存器0x200和0x208的功能说明及计算公式。

int ClockConfig(void)
{
u32 DIVCLK_DIVIDE = 10;
u32 CLKFBOUT_MULT = 53;
u32 CLKFBOUT_FRAC = 625;
u32 CLKOUT0_DIVIDE=11;
u32 CLKOUT0_FRAC=875;

u32 clock_config_reg_0;
u32 clock_config_reg_2;
u32 lock;
u32 timeout;

clock_config_reg_0 = ((u32)1<<26) | (CLKFBOUT_FRAC<<16) | (CLKFBOUT_MULT<<8) | DIVCLK_DIVIDE;
clock_config_reg_2 = ((u32)1<<18) | (CLKOUT0_FRAC<<8) | CLKOUT0_DIVIDE;

Xil_Out32(XPAR_CLK_WIZ_1_BASEADDR+0x200, clock_config_reg_0);
Xil_Out32(XPAR_CLK_WIZ_1_BASEADDR+0x208, clock_config_reg_2);
//fclk*CLKFBOUT_MULT.CLKFBOUT_FRAC/DIVCLK_DIVIDE/CLKOUT0_DIVIDE.CLKOUT0_FRAC=100

//fs=44.1k mclk=90.3168M
//clk0=100*53.625/5/11.875=90.316
usleep(1000);

lock = Xil_In32(XPAR_CLK_WIZ_1_BASEADDR+0x4) & 0x1;
if(lock) //check for lock
{
//Video Clock Generator not locked
Xil_Out32(XPAR_CLK_WIZ_1_BASEADDR+0x25C, 0x7);
usleep(1000);
Xil_Out32(XPAR_CLK_WIZ_1_BASEADDR+0x25C, 0x2);
timeout = 100000;

do
{
lock = Xil_In32(XPAR_CLK_WIZ_1_BASEADDR+0x4) & 0x1;
--timeout;
if(!timeout)
{
print("ERR:: Video Clock Generator failed lock\r\n");
return(XST_FAILURE);
}
}
while(!lock);
}
print("Video Clock Generator locked\r\n");

return(XST_SUCCESS);

}

VideoClockGen_WriteReg 可以更换为 xil_Out32();
VideoClockGen_ReadReg可以更换为xil_In32();
 一共4个寄存器

0x200
【7:0】八位分频值应用于所有输出时钟。
【15:8】乘法的整数部分
【25:16】乘法的小数部分
【26】对于分数乘法,该位应设置为1,将该位设置为0将使用默认配置。

CLKFBOUT分数除法的值可以为0到875,代表乘积乘以1000。

0x208 

位[7:0] = CLKOUT0_DIVIDE    整数
整数部分clkout0除数
例如,对于2.250,该值为2 = 0x2
位[17:8] = CLKOUT0_FRAC除数(3)   小数
clkout0的分数部分划分值
例如,对于2.250,该值为250 = 0xFA
位[18] = CLKOUT0_FRAC_EN(3)    使能
对于分数除法,该位应设置为1   

 

 

计算方式 clko=mclk*(0x200寄存器)【25:8】/【7:0】/(208寄存器)【17:0】

转载于:https://www.cnblogs.com/yssrf-possible/p/7743430.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值