时钟分频原理详解

时钟芯片:可编程的频率合成器 整合的时钟电路,是硬件技术进步的一个标志。
电脑中的不同设备对时钟频率的要求是不一样的,如果你从废物箱中找来一块286主板,可以看到有好几颗晶振排列在一起。
电脑中的cpu,agp插槽、pci插槽、硬盘接口、usb端口和ps/2端口等在通信速度上有很大差异,所以需要提供不同的时钟频率,譬如pci要求33mhz、usb为48mhz等(图6)。
可是,一只石英振荡器只能提供一种频率,所以主板制造商通常将这些原本散布在主机板上各处的振荡电路整合成一颗“频率合成器(frequency synthesizer)”芯片,对晶体振荡器产生的脉冲信号进行分频(或倍频),以便为不同运行速度的芯片(或设备)提供所需要的时钟频率。
图1: i875p主板上各种设备的速度
普通分频器为整数分频器,其输出频率与输入频率之间为整数倍的关系,只能分段调节频率,不能满足精密调节的要求。
频率合成器是“分数分频器”,可对输出频率进行精细调节。研发工程师可自由地设计电路中的各种频率,不再受限于石英震荡晶体的固定频率规格。
目前电脑中的时钟芯片一般都具有“分数分频”能力,可以根据需要将调节步长设计到1%,甚至0.1%。
为了指导和规范频率合成器的设计和应用,intel制定了频率合成器设计指南,如ck97、ck40x等,适用于最新pentium 4处理器的规范是ck410。
频率调节原理 频率合成器是一个具有频率负反馈的时钟信号系统(图7),其中使用了两个分频器,mdiv用于降低基准频率,ndiv则用于对vco进行分频。
晶体振荡器(osc)产生的频率fi经m分频器后得到参考频率fref,它与反馈频率ffd分别送入鉴频器(frequency detector,fd)的两个反向输入端,
鉴频器输出一个反映两者之商的直流电压,并经低通滤波器(low pass filter,lpf)滤除交流分量后,提供给压控振荡器(voltage controlled oscillator,vco)输出频率信号fout。
图2: 频率合成原理图
频率合成器的输出频率fout与输入频率fin之间的关系可以用公式fout=fin×(n+k/m)来表示,其中n、m和k均为整数,k可取0~m间的任意整数。
非整数值n+k/m通常写作n.f,这里的圆点代表小数点,n表示频率的整数部分,而f=k/m则表示频率的小数部分。
在输入频率fin、n和m均不改变的条件下,只要修改k值即可得到所需要频率值fout。
在频率合成器芯片中,有专门的smbus接口电路,这是芯片的寄存器与外部联络的途径,有了它,就能够通过bios或软件对寄存器进行改写。
频率寄存器中的每一位数据有两种可能,“0”或“1”,那么当这几位按不同状态进行组合时就可得到多种外频输出。
频率合成器的频率调节精度与频率寄存器的位数有关,譬如,如果频率寄存器为5位,则调节步长为1mhz。为数越多,调节精度越高。
在实用的频率合成器中,mdiv和ndiv两个分频器均为可编程的,只要用户设定相应的fout数值,bios便能自动给出n、m和k的值,并通过smbus总线写入相应的寄存器中。
时钟分频原理 如果cpu是计算机的大脑,电流是计算机的血液,那么时钟则是计算机的心脏,时钟频率决定了处理器运算的快慢,它的每一次“跳动”都驱动着处理器不停的执行命令。不同的是,人的各个部位心率是一样的,但计算机却有多个频率,而且每个部位可能有不同的频率,比如“大脑”有一个频率,“手“有一个频率,“脚”使用的是另外一个频率,这样就产生了两个问题:怎么产生这些不同的频率?处理器怎么与自己不同频率的外设实现交互?
怎么产生这些不同的频率?
为了获取稳定的时钟,我们一般使用外部晶振来提供,晶振是由石英和震荡电路组成的,石英能够提供稳定的频率。一般一个计算机系统最少需要一个晶振,有些特殊的外设也会有自己特有的晶振,比如网卡,显卡等,但是对于大多数连接cup的外设来说是没有自己的晶振的,那么就需要cpu给他们提供时钟,然而不同的外设需要的时钟不一样,cpu是怎么给这些外设提供不同的时钟呢?
arm处理器主要给外设提供了两种连接总线,ahb总线(advanced high performance bus)和apb总线,这两种总线的时钟在没有初始化之前是一样的,频率等于外部晶振提供的频率,在初始化以后,它们就可以为外设提供不同的时钟了。
ahp和apb总线的内容将放到后面章节作为补充知识了解,因为他们对我们分析uboot的启动过程关系不大。由于这两种总线初始化以后,时钟是不一样的,所以连接的外设也不一样,如下图,一些工作频率较高的外设挂接在ahb总线上,比如内存,nandflash,lcd控制器等,而工作频率比较低的外设则挂接在apb总线上,比如uart串口,watchdog,gpio,usb等(注意:这里使用挂接,是因为这些设备是可以拔除的,而不影响其他外设的工作)。
我们这里先不管这些外设是怎么和总线连接的,但是先了解一点:连接在同一个总线上的外设,获取到的时钟是一样的。当ahb和apb上的时钟都不能满足外设需求的时候,就需要pwm timer来帮忙了。
上面这张图是s3c2440的时钟生成图,看上去挺复杂的,其实并不是那么回事,对于uboot的启动来说,只要了解图中红色框框的部分就可以了,但是如果要编写ubs驱动或者摄像头驱动,则会涉及到图中灰绿色的部分。因为我们只要分析uboot启动过程中涉及到的东西,所以对usb和cam部分就不细讲了。
图中红色框表示的是主时钟的产生过程,灰绿色的框表示usb时钟的产生过程,红色线条表示输出hclk,绿色线条表示pclk,黄色线条表示fclk。
uboot启动的时候,需要设置时钟分频,分频的目的就是产生三种时钟:pclk、fclk和hclk,pclk供apb总线使用,hclk供ahb总线使用,fclk则供cpu使用,而且从datasheet的电气参数那一章可以查到fclk,hclk和pclk的最大值分别是400mhz,100mhz和50mhz。下面就依照图中的步骤来分析,这三种时钟是怎么产生的。下图是对上面这张图的简概:
1.时钟源
为了减少外界环境对开发板的电磁干扰,降低制作成本,通常开发板的外部晶振时钟频率都是很低的。从图中第一个红框可以看出,cpu可以连接两种外部时钟源,一种是振荡时钟源,一种是时钟信号,前者就是石英晶体振荡电路,后者是其他振荡器产生的时钟信号,比如信号发生器产生的时钟信号,虽然两者都是特定频率的正弦波形,但是在cpu的接线方式上是有不同的。
从这张表中可以看出,s3c2440可以连接两个时钟源,一个是主时钟源,一个是usb时钟源,如果主时钟源需要接晶振源,则om3需要为0,也就是要接地(这里暂时不讨论ubs时钟),同理,如果ubs时钟源需要接晶振源,则om2要接地。从电路图中可以看到,om2和om3都接地,而且xtipll引脚和xtopll引脚接的是外部12m晶振,所以这里开发板的时钟源是12m的外部晶振。(usb的时钟源这里不讨论)
需要注意的是,晶振提供的时钟,只有在上电以后才开始起振的,而外部提供的信号时钟是板子没有上电的时候就已经在振荡了,所以对晶振时钟源需要作一个特殊的处理——变频锁定。
2.变频锁定
开发板刚上电的时候,晶振osc开始提供晶振时钟,由于系统刚刚上电,电压信号等都还不稳定,这时复位信号(nreset)拉低,那么外部晶振则直接作为系统时钟fclk,这时的fclk是不规则的,为了让cpu使用规则的时钟频率,需要将clock disable一小段时间,这个时间就是图中的lock time,在这段时间里面,电压会慢慢稳定,时钟频率也会调整到一个新的稳定状态(vco is adapted to new clock frequency),而且这段时间里面,fclk是为0的,也就是说cpu是不会运行的,当这个lock time结束以后,fclk就会获得一个新的频率(fclk is new frequency)。注意这个时候的fclk频率就是晶振提供的频率,他们的大小是一样的,当经过倍频以后,这个值将数倍的变化。
下面是变频锁定时间的设定寄存器:0~15位是设置主时钟源锁定时间的,后15位是设置usb锁频时间的,这里不考虑,值得注意的是对应的锁频时间可以从datasheet的电气数据表中查到(pll lock time)。
3.倍频设置(锁相环)
当cpu能够获取到稳定的时钟时,就需要对时钟进行倍频了,现在知道外部晶振输入的时钟时12m,那怎样把这个时钟提高到100mhz,甚至是400mhz呢?这就涉及到了时钟生成图的第二个红框框了(注意框框上面的s,p,m字样),这个叫锁相环(pll),主频的倍频操作是由mpll来设置的,而usb的倍频操作是由upll来设置的,upll暂时不讨论。所以要让外部时钟经过变化,扩大到400m,就需要对mpllcon寄存器进行设置。
从上图可以看出,不管是mllcon或者upllcon,都由三个部分组成,主分频、预分频、后分频控制位,这些分频数值决定了12m进去的频率,将会输出多大频率,下面这张表是手册的推荐设置:比如我们要将12m是时钟频率倍频成405m,则需要mdiv=0x7f,pdiv=0x2,sdiv=1,注意49m和96m是给usb的upplcon设置的。
当然也可以不参考这个表格,使用计算公式
4.设置比例(分频器)
设置完pll寄存器以后,当稳定的时钟通过锁相环则会输出更大倍数的频率,而这个更大倍数的频率则是fclk,现在这个值则是400mhz,而不是12mhz了,现在我们得到了想要的fclk,那怎么得到pclk和hclk呢?下面就涉及到分频器的设置。
怎么设置hdivn和pcivn的数值,主要查找下面的表:
比如我们要将hclk设置为100,pclk设置为50, 那么hclk=fclk/4,pclk=fclk/8,查表可知为1:4:8,所以hdivn=0x2,pdivn=0x1, dvin_upll是ubs的时钟,这里不讨论。
但是根据datasheet说明,当hdiv设置为非0的时候,cpu总线模式要进行改变,默认情况下fclk=hclk,cpu工作在fast bus mode快速总线模式下,hdiv设置为非0后,fclk和hclk不再相等,要将cpu改为异步总线模式,需要使用对应的代码进行设置。
所以上面三步的代码可总结如下:
[plain] view plain copy#define s3c2410_mpll_200mhz ((0x5c《《12)|(0x04《《4)|(0x00))
#define s3c2440_mpll_200mhz ((0x5c《《12)|(0x01《《4)|(0x02))
/*
* 对于mpllcon寄存器,[19:12]为mdiv,[9:4]为pdiv,[1:0]为sdiv
* 有如下计算公式:
* s3c2410: mpll(fclk) = (m * fin)/(p * 2^s)
* s3c2410: mpll(fclk) = (2 * m * fin)/(p * 2^s)
* 其中: m = mdiv + 8, p = pdiv + 2, s = sdiv
* 对于本开发板,fin = 12mhz
* 设置clkdivn,令分频比为:fclk:hclk:pclk=1:2:4,
* fclk=200mhz,hclk=100mhz,pclk=50mhz
*/
void clock_init(void)
{
// locktime = 0x00ffffff; // 使用默认值即可
clkdivn = 0x03; // fclk:hclk:pclk=1:2:4, hdivn=1,pdivn=1
/* 如果hdivn非0,cpu的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
__asm__(
“mrc p15, 0, r1, c1, c0, 0” /* 读出控制寄存器 */
“orr r1, r1, #0xc0000000” /* 设置为“asynchronous bus mode” */
“mcr p15, 0, r1, c1, c0, 0” /* 写入控制寄存器 */
);
/* 判断是s3c2410还是s3c2440 */
if ((gstatus1 == 0x32410000) || (gstatus1 == 0x32410002))
{
mpllcon = s3c2410_mpll_200mhz; /* 现在,fclk=200mhz,hclk=100mhz,pclk=50mhz */
}
else
{
mpllcon = s3c2440_mpll_200mhz; /* 现在,fclk=200mhz,hclk=100mhz,pclk=50mhz */
}
}
对于usb和cam的时钟设置都是相似的,这里就不累述了
补充:
前面介绍了锁相环寄存器的设置,这里对锁相环的工作原理作一个简述。一个12mhz的时钟经过锁相环以后,产生了400mhz的fclk时钟,它是怎么办到的呢?
锁相环的作用比较多,不仅可以倍频,还可以合成频率,音频解码等,实现原理有所不同,下图是s3c2440的锁相环实现原理图:
(1)当外部时钟fin进入锁相环的时候,预分频器(divider p)会将该时钟进行处理得到fref信号,这个信号是reference参考信号,用于后面分频的相位参考。
(2)fref将第一次进入pfd(phase frequency detector)相位鉴定器,它主要完成fref和fvco的相位鉴定,当输出和输入信号的频率和相位保持恒定不变的时候,锁相环进入相位锁定的状态,当输出和输入信号的频率和相位有差异的时候,则会发送信号给pump。
(3)pump会将pfd的控制信号转换成合适电压信号给循环滤波器
(4)滤波器会对从pump过来的波形进行过滤,然后将信号送给vco
(5)vco(voltage controlled oscillator),压控振荡器,这里是倍频的关键步骤,压控振荡器的振荡频率会随时间而变,锁相环进入“频率牵引”,自动跟踪捕捉输入信号的频率,然后将输出进行主分频(divider m),产生fvco.
(6)fvco会进入pfd与fref进行相位和频率的差异对比,如果处在差异,则继续进入循环,如果没有差异,则pfd停止向pump发送信号,锁相环进入相位锁定的状态。
(7)当锁相环进入相位锁定的状态,vco的输出将通过后分频器(divider s)输出mpll或者upll。
所以要使用锁相环,就需要设置xpllcon的p,m,s;关于锁相环的更具体的原理,请google。
至于分频器的工作原理比较简单,主要是改变波形的占空比达到将高频变低频的效果,所以需要设置hdivn和pdivn。
总结:这篇文章分析了怎么设置时钟分频,让cpu以及外部设备工作在更高的频率上面,主要涉及三个寄存器的设置——locktimre,mpllcon,clockdivn
再回忆一下开发板启动的过程,当开发板上电的时候,启动过程是:进入管理模式——关看门狗——关中断——时钟分频。。.
在设置时钟分频以前,cpu都是工作在12mhz频率的,当设置完时钟分频后,cpu的工作频率将是400mhz,这相当于完成了一个蜕变,从一个普通人变成了超人,多了几十倍的反应速度,更加高效的执行后面的代码。想想如果没有对时钟进行倍频处理,仍然让它运行在12mhz,处理同一件任务多要30多倍的时间,将是一件多么折磨人的事情。
接下来将会继续对时钟这个问题进行分析,虽然这里分析了怎么设置时钟分频,但是这只是开始,后面将对省电模式,快启动,慢启动,实时时钟,pwm时钟等内容进行讲解。

音乐频谱LED显示屏驱动控制程序案例解析
双调光蘑菇灯与维修
监控系统中经常被忽略的故障原因
250VAC离线LED驱动解决方案
救灾现场,应急通信车来干嘛?
时钟分频原理详解
景嘉微获10万片9系GPU芯片大单;三星3nm客户订单大量转向台积电
plc编程入门_如何学习PLC编程
美国加征关税 中国已制定好反击策略
人工智能领域发展经历的三次浪潮分析
网友票选魅族最强5功能 多任务处理排第一
三星Fold评测 不要再让惊艳变成惊吓
iphone8什么时候上市?iphone8最新消息:增强现实体验,可能是iphone8的最大卖点?
数据信息大时代下,分布式存储将成为变局的突破点
物联网应用怎样和工厂与医疗相联系
大疆RoboMaster EP与机甲大师S1有何区别
纳米技术在航空航天工业中的潜力
电机驱动集成的故事
Milk-V Duo开发板免费体验 硬件使用-GPIO
华为最新消息 新增自动驾驶相关专利