時(shí)鐘芯片:可編程的頻率合成器
? ? ? ? 整合的時(shí)鐘電路,是硬件技術(shù)進(jìn)步的一個(gè)標(biāo)志。
電腦中的不同設(shè)備對(duì)時(shí)鐘頻率的要求是不一樣的,如果你從廢物箱中找來(lái)一塊286主板,可以看到有好幾顆晶振排列在一起。
電腦中的CPU,AGP插槽、PCI插槽、硬盤接口、USB端口和PS/2端口等在通信速度上有很大差異,所以需要提供不同的時(shí)鐘頻率,譬如PCI要求33MHz、USB為48MHz等(圖6)。
可是,一只石英振蕩器只能提供一種頻率,所以主板制造商通常將這些原本散布在主機(jī)板上各處的振蕩電路整合成一顆“頻率合成器(Frequency Synthesizer)”芯片,對(duì)晶體振蕩器產(chǎn)生的脈沖信號(hào)進(jìn)行分頻(或倍頻),以便為不同運(yùn)行速度的芯片(或設(shè)備)提供所需要的時(shí)鐘頻率。
圖1: i875P主板上各種設(shè)備的速度
普通分頻器為整數(shù)分頻器,其輸出頻率與輸入頻率之間為整數(shù)倍的關(guān)系,只能分段調(diào)節(jié)頻率,不能滿足精密調(diào)節(jié)的要求。
頻率合成器是“分?jǐn)?shù)分頻器”,可對(duì)輸出頻率進(jìn)行精細(xì)調(diào)節(jié)。研發(fā)工程師可自由地設(shè)計(jì)電路中的各種頻率,不再受限于石英震蕩晶體的固定頻率規(guī)格。
目前電腦中的時(shí)鐘芯片一般都具有“分?jǐn)?shù)分頻”能力,可以根據(jù)需要將調(diào)節(jié)步長(zhǎng)設(shè)計(jì)到1%,甚至0.1%。
為了指導(dǎo)和規(guī)范頻率合成器的設(shè)計(jì)和應(yīng)用,Intel制定了頻率合成器設(shè)計(jì)指南,如CK97、CK40X等,適用于最新Pentium 4處理器的規(guī)范是CK410。
頻率調(diào)節(jié)原理
頻率合成器是一個(gè)具有頻率負(fù)反饋的時(shí)鐘信號(hào)系統(tǒng)(圖7),其中使用了兩個(gè)分頻器,Mdiv用于降低基準(zhǔn)頻率,Ndiv則用于對(duì)VCO進(jìn)行分頻。
晶體振蕩器(OSC)產(chǎn)生的頻率fi經(jīng)M分頻器后得到參考頻率fref,它與反饋頻率ffd分別送入鑒頻器(Frequency Detector,F(xiàn)D)的兩個(gè)反向輸入端,
鑒頻器輸出一個(gè)反映兩者之商的直流電壓,并經(jīng)低通濾波器(Low Pass Filter,LPF)濾除交流分量后,提供給壓控振蕩器(Voltage Controlled Oscillator,VCO)輸出頻率信號(hào)fout。
圖2: 頻率合成原理圖
頻率合成器的輸出頻率fout與輸入頻率fin之間的關(guān)系可以用公式fout=fin×(N+k/M)來(lái)表示,其中N、M和K均為整數(shù),K可取0~M間的任意整數(shù)。
非整數(shù)值N+k/M通常寫作N.F,這里的圓點(diǎn)代表小數(shù)點(diǎn),N表示頻率的整數(shù)部分,而F=k/M則表示頻率的小數(shù)部分。
在輸入頻率fin、N和M均不改變的條件下,只要修改k值即可得到所需要頻率值fout。
在頻率合成器芯片中,有專門的SMBus接口電路,這是芯片的寄存器與外部聯(lián)絡(luò)的途徑,有了它,就能夠通過(guò)BIOS或軟件對(duì)寄存器進(jìn)行改寫。
頻率寄存器中的每一位數(shù)據(jù)有兩種可能,“0”或“1”,那么當(dāng)這幾位按不同狀態(tài)進(jìn)行組合時(shí)就可得到多種外頻輸出。
頻率合成器的頻率調(diào)節(jié)精度與頻率寄存器的位數(shù)有關(guān),譬如,如果頻率寄存器為5位,則調(diào)節(jié)步長(zhǎng)為1MHz。為數(shù)越多,調(diào)節(jié)精度越高。
在實(shí)用的頻率合成器中,Mdiv和Ndiv兩個(gè)分頻器均為可編程的,只要用戶設(shè)定相應(yīng)的fout數(shù)值,BIOS便能自動(dòng)給出N、M和K的值,并通過(guò)SMBus總線寫入相應(yīng)的寄存器中。
時(shí)鐘分頻原理
如果cpu是計(jì)算機(jī)的大腦,電流是計(jì)算機(jī)的血液,那么時(shí)鐘則是計(jì)算機(jī)的心臟,時(shí)鐘頻率決定了處理器運(yùn)算的快慢,它的每一次“跳動(dòng)”都驅(qū)動(dòng)著處理器不停的執(zhí)行命令。不同的是,人的各個(gè)部位心率是一樣的,但計(jì)算機(jī)卻有多個(gè)頻率,而且每個(gè)部位可能有不同的頻率,比如“大腦”有一個(gè)頻率,“手“有一個(gè)頻率,“腳”使用的是另外一個(gè)頻率,這樣就產(chǎn)生了兩個(gè)問(wèn)題:怎么產(chǎn)生這些不同的頻率?處理器怎么與自己不同頻率的外設(shè)實(shí)現(xiàn)交互?
怎么產(chǎn)生這些不同的頻率?
為了獲取穩(wěn)定的時(shí)鐘,我們一般使用外部晶振來(lái)提供,晶振是由石英和震蕩電路組成的,石英能夠提供穩(wěn)定的頻率。一般一個(gè)計(jì)算機(jī)系統(tǒng)最少需要一個(gè)晶振,有些特殊的外設(shè)也會(huì)有自己特有的晶振,比如網(wǎng)卡,顯卡等,但是對(duì)于大多數(shù)連接cup的外設(shè)來(lái)說(shuō)是沒(méi)有自己的晶振的,那么就需要cpu給他們提供時(shí)鐘,然而不同的外設(shè)需要的時(shí)鐘不一樣,cpu是怎么給這些外設(shè)提供不同的時(shí)鐘呢?
ARM處理器主要給外設(shè)提供了兩種連接總線,AHB總線(Advanced high Performance Bus)和APB總線,這兩種總線的時(shí)鐘在沒(méi)有初始化之前是一樣的,頻率等于外部晶振提供的頻率,在初始化以后,它們就可以為外設(shè)提供不同的時(shí)鐘了。
AHP和APB總線的內(nèi)容將放到后面章節(jié)作為補(bǔ)充知識(shí)了解,因?yàn)樗麄儗?duì)我們分析uboot的啟動(dòng)過(guò)程關(guān)系不大。由于這兩種總線初始化以后,時(shí)鐘是不一樣的,所以連接的外設(shè)也不一樣,如下圖,一些工作頻率較高的外設(shè)掛接在AHB總線上,比如內(nèi)存,nandflash,LCD控制器等,而工作頻率比較低的外設(shè)則掛接在APB總線上,比如UART串口,Watchdog,GPIO,USB等(注意:這里使用掛接,是因?yàn)檫@些設(shè)備是可以拔除的,而不影響其他外設(shè)的工作)。
我們這里先不管這些外設(shè)是怎么和總線連接的,但是先了解一點(diǎn):連接在同一個(gè)總線上的外設(shè),獲取到的時(shí)鐘是一樣的。當(dāng)AHB和APB上的時(shí)鐘都不能滿足外設(shè)需求的時(shí)候,就需要PWM timer來(lái)幫忙了。
上面這張圖是s3c2440的時(shí)鐘生成圖,看上去挺復(fù)雜的,其實(shí)并不是那么回事,對(duì)于uboot的啟動(dòng)來(lái)說(shuō),只要了解圖中紅色框框的部分就可以了,但是如果要編寫UBS驅(qū)動(dòng)或者攝像頭驅(qū)動(dòng),則會(huì)涉及到圖中灰綠色的部分。因?yàn)槲覀冎灰治鰑boot啟動(dòng)過(guò)程中涉及到的東西,所以對(duì)USB和cam部分就不細(xì)講了。
圖中紅色框表示的是主時(shí)鐘的產(chǎn)生過(guò)程,灰綠色的框表示USB時(shí)鐘的產(chǎn)生過(guò)程,紅色線條表示輸出HCLK,綠色線條表示PCLK,黃色線條表示FCLK。
uboot啟動(dòng)的時(shí)候,需要設(shè)置時(shí)鐘分頻,分頻的目的就是產(chǎn)生三種時(shí)鐘:PCLK、FCLK和HCLK,PCLK供APB總線使用,HCLK供AHB總線使用,F(xiàn)CLK則供cpu使用,而且從datasheet的電氣參數(shù)那一章可以查到FCLK,HCLK和PCLK的最大值分別是400MHz,100MHz和50MHz。下面就依照?qǐng)D中的步驟來(lái)分析,這三種時(shí)鐘是怎么產(chǎn)生的。下圖是對(duì)上面這張圖的簡(jiǎn)概:
1.時(shí)鐘源
為了減少外界環(huán)境對(duì)開發(fā)板的電磁干擾,降低制作成本,通常開發(fā)板的外部晶振時(shí)鐘頻率都是很低的。從圖中第一個(gè)紅框可以看出,cpu可以連接兩種外部時(shí)鐘源,一種是振蕩時(shí)鐘源,一種是時(shí)鐘信號(hào),前者就是石英晶體振蕩電路,后者是其他振蕩器產(chǎn)生的時(shí)鐘信號(hào),比如信號(hào)發(fā)生器產(chǎn)生的時(shí)鐘信號(hào),雖然兩者都是特定頻率的正弦波形,但是在cpu的接線方式上是有不同的。
從這張表中可以看出,s3c2440可以連接兩個(gè)時(shí)鐘源,一個(gè)是主時(shí)鐘源,一個(gè)是USB時(shí)鐘源,如果主時(shí)鐘源需要接晶振源,則OM3需要為0,也就是要接地(這里暫時(shí)不討論ubs時(shí)鐘),同理,如果UBS時(shí)鐘源需要接晶振源,則OM2要接地。從電路圖中可以看到,OM2和OM3都接地,而且XTIpll引腳和XTOpll引腳接的是外部12M晶振,所以這里開發(fā)板的時(shí)鐘源是12M的外部晶振。(USB的時(shí)鐘源這里不討論)
需要注意的是,晶振提供的時(shí)鐘,只有在上電以后才開始起振的,而外部提供的信號(hào)時(shí)鐘是板子沒(méi)有上電的時(shí)候就已經(jīng)在振蕩了,所以對(duì)晶振時(shí)鐘源需要作一個(gè)特殊的處理——變頻鎖定。
2.變頻鎖定
開發(fā)板剛上電的時(shí)候,晶振OSC開始提供晶振時(shí)鐘,由于系統(tǒng)剛剛上電,電壓信號(hào)等都還不穩(wěn)定,這時(shí)復(fù)位信號(hào)(nRESET)拉低,那么外部晶振則直接作為系統(tǒng)時(shí)鐘FCLK,這時(shí)的FCLK是不規(guī)則的,為了讓cpu使用規(guī)則的時(shí)鐘頻率,需要將clock disable一小段時(shí)間,這個(gè)時(shí)間就是圖中的Lock Time,在這段時(shí)間里面,電壓會(huì)慢慢穩(wěn)定,時(shí)鐘頻率也會(huì)調(diào)整到一個(gè)新的穩(wěn)定狀態(tài)(VCO is adapted to new clock frequency),而且這段時(shí)間里面,F(xiàn)CLK是為0的,也就是說(shuō)cpu是不會(huì)運(yùn)行的,當(dāng)這個(gè)Lock Time結(jié)束以后,F(xiàn)CLK就會(huì)獲得一個(gè)新的頻率(FCLK is new frequency)。注意這個(gè)時(shí)候的FCLK頻率就是晶振提供的頻率,他們的大小是一樣的,當(dāng)經(jīng)過(guò)倍頻以后,這個(gè)值將數(shù)倍的變化。
下面是變頻鎖定時(shí)間的設(shè)定寄存器:0~15位是設(shè)置主時(shí)鐘源鎖定時(shí)間的,后15位是設(shè)置USB鎖頻時(shí)間的,這里不考慮,值得注意的是對(duì)應(yīng)的鎖頻時(shí)間可以從datasheet的電氣數(shù)據(jù)表中查到(PLL Lock Time)。
3.倍頻設(shè)置(鎖相環(huán))
當(dāng)cpu能夠獲取到穩(wěn)定的時(shí)鐘時(shí),就需要對(duì)時(shí)鐘進(jìn)行倍頻了,現(xiàn)在知道外部晶振輸入的時(shí)鐘時(shí)12M,那怎樣把這個(gè)時(shí)鐘提高到100MHz,甚至是400MHz呢?這就涉及到了時(shí)鐘生成圖的第二個(gè)紅框框了(注意框框上面的S,P,M字樣),這個(gè)叫鎖相環(huán)(PLL),主頻的倍頻操作是由MPLL來(lái)設(shè)置的,而USB的倍頻操作是由UPLL來(lái)設(shè)置的,UPLL暫時(shí)不討論。所以要讓外部時(shí)鐘經(jīng)過(guò)變化,擴(kuò)大到400M,就需要對(duì)MPLLCON寄存器進(jìn)行設(shè)置。
從上圖可以看出,不管是MLLCON或者UPLLCON,都由三個(gè)部分組成,主分頻、預(yù)分頻、后分頻控制位,這些分頻數(shù)值決定了12M進(jìn)去的頻率,將會(huì)輸出多大頻率,下面這張表是手冊(cè)的推薦設(shè)置:比如我們要將12M是時(shí)鐘頻率倍頻成405M,則需要MDIV=0x7f,PDIV=0x2,SDIV=1,注意49M和96M是給USB的UPPLCON設(shè)置的。
當(dāng)然也可以不參考這個(gè)表格,使用計(jì)算公式
4.設(shè)置比例(分頻器)
設(shè)置完P(guān)LL寄存器以后,當(dāng)穩(wěn)定的時(shí)鐘通過(guò)鎖相環(huán)則會(huì)輸出更大倍數(shù)的頻率,而這個(gè)更大倍數(shù)的頻率則是FCLK,現(xiàn)在這個(gè)值則是400MHz,而不是12MHz了,現(xiàn)在我們得到了想要的FCLK,那怎么得到PCLK和HCLK呢?下面就涉及到分頻器的設(shè)置。
怎么設(shè)置HDIVN和PCIVN的數(shù)值,主要查找下面的表:
比如我們要將HCLK設(shè)置為100,PCLK設(shè)置為50, 那么HCLK=FCLK/4,PCLK=FCLK/8,查表可知為1:4:8,所以HDIVN=0x2,PDIVN=0x1, dvin_UPLL是UBS的時(shí)鐘,這里不討論。
但是根據(jù)datasheet說(shuō)明,當(dāng)HDIV設(shè)置為非0的時(shí)候,cpu總線模式要進(jìn)行改變,默認(rèn)情況下FCLK=HCLK,cpu工作在fast bus mode快速總線模式下,HDIV設(shè)置為非0后,F(xiàn)CLK和HCLK不再相等,要將cpu改為異步總線模式,需要使用對(duì)應(yīng)的代碼進(jìn)行設(shè)置。
所以上面三步的代碼可總結(jié)如下:
?。踦lain] view plain copy#define S3C2410_MPLL_200MHZ ((0x5c《《12)|(0x04《《4)|(0x00))
#define S3C2440_MPLL_200MHZ ((0x5c《《12)|(0x01《《4)|(0x02))
/*
* 對(duì)于MPLLCON寄存器,[19:12]為MDIV,[9:4]為PDIV,[1:0]為SDIV
* 有如下計(jì)算公式:
* 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
* 對(duì)于本開發(fā)板,F(xiàn)in = 12MHz
* 設(shè)置CLKDIVN,令分頻比為:FCLK:HCLK:PCLK=1:2:4,
* FCLK=200MHz,HCLK=100MHz,PCLK=50MHz
*/
void clock_init(void)
{
// LOCKTIME = 0x00ffffff; // 使用默認(rèn)值即可
CLKDIVN = 0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1
/* 如果HDIVN非0,CPU的總線模式應(yīng)該從“fast bus mode”變?yōu)椤癮synchronous bus mode” */
__asm__(
“mrc p15, 0, r1, c1, c0, 0 ” /* 讀出控制寄存器 */
“orr r1, r1, #0xc0000000 ” /* 設(shè)置為“asynchronous bus mode” */
“mcr p15, 0, r1, c1, c0, 0 ” /* 寫入控制寄存器 */
?。?
/* 判斷是S3C2410還是S3C2440 */
if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))
{
MPLLCON = S3C2410_MPLL_200MHZ; /* 現(xiàn)在,F(xiàn)CLK=200MHz,HCLK=100MHz,PCLK=50MHz */
}
else
{
MPLLCON = S3C2440_MPLL_200MHZ; /* 現(xiàn)在,F(xiàn)CLK=200MHz,HCLK=100MHz,PCLK=50MHz */
}
}
對(duì)于USB和CAM的時(shí)鐘設(shè)置都是相似的,這里就不累述了
補(bǔ)充:
前面介紹了鎖相環(huán)寄存器的設(shè)置,這里對(duì)鎖相環(huán)的工作原理作一個(gè)簡(jiǎn)述。一個(gè)12MHz的時(shí)鐘經(jīng)過(guò)鎖相環(huán)以后,產(chǎn)生了400MHz的FCLK時(shí)鐘,它是怎么辦到的呢?
鎖相環(huán)的作用比較多,不僅可以倍頻,還可以合成頻率,音頻解碼等,實(shí)現(xiàn)原理有所不同,下圖是S3c2440的鎖相環(huán)實(shí)現(xiàn)原理圖:
(1)當(dāng)外部時(shí)鐘Fin進(jìn)入鎖相環(huán)的時(shí)候,預(yù)分頻器(Divider P)會(huì)將該時(shí)鐘進(jìn)行處理得到Fref信號(hào),這個(gè)信號(hào)是reference參考信號(hào),用于后面分頻的相位參考。
?。?)Fref將第一次進(jìn)入PFD(Phase Frequency Detector)相位鑒定器,它主要完成Fref和Fvco的相位鑒定,當(dāng)輸出和輸入信號(hào)的頻率和相位保持恒定不變的時(shí)候,鎖相環(huán)進(jìn)入相位鎖定的狀態(tài),當(dāng)輸出和輸入信號(hào)的頻率和相位有差異的時(shí)候,則會(huì)發(fā)送信號(hào)給PUMP。
(3)PUMP會(huì)將PFD的控制信號(hào)轉(zhuǎn)換成合適電壓信號(hào)給循環(huán)濾波器
(4)濾波器會(huì)對(duì)從PUMP過(guò)來(lái)的波形進(jìn)行過(guò)濾,然后將信號(hào)送給VCO
?。?)VCO(Voltage Controlled Oscillator),壓控振蕩器,這里是倍頻的關(guān)鍵步驟,壓控振蕩器的振蕩頻率會(huì)隨時(shí)間而變,鎖相環(huán)進(jìn)入“頻率牽引”,自動(dòng)跟蹤捕捉輸入信號(hào)的頻率,然后將輸出進(jìn)行主分頻(Divider M),產(chǎn)生Fvco.
?。?)Fvco會(huì)進(jìn)入PFD與Fref進(jìn)行相位和頻率的差異對(duì)比,如果處在差異,則繼續(xù)進(jìn)入循環(huán),如果沒(méi)有差異,則PFD停止向PUMP發(fā)送信號(hào),鎖相環(huán)進(jìn)入相位鎖定的狀態(tài)。
?。?)當(dāng)鎖相環(huán)進(jìn)入相位鎖定的狀態(tài),VCO的輸出將通過(guò)后分頻器(Divider S)輸出MPLL或者UPLL。
所以要使用鎖相環(huán),就需要設(shè)置XPLLCON的P,M,S;關(guān)于鎖相環(huán)的更具體的原理,請(qǐng)GOOGLE。
至于分頻器的工作原理比較簡(jiǎn)單,主要是改變波形的占空比達(dá)到將高頻變低頻的效果,所以需要設(shè)置HDIVN和PDIVN。
總結(jié):這篇文章分析了怎么設(shè)置時(shí)鐘分頻,讓cpu以及外部設(shè)備工作在更高的頻率上面,主要涉及三個(gè)寄存器的設(shè)置——LOCKTIMRE,MPLLCON,CLOCKDIVN
再回憶一下開發(fā)板啟動(dòng)的過(guò)程,當(dāng)開發(fā)板上電的時(shí)候,啟動(dòng)過(guò)程是:進(jìn)入管理模式——關(guān)看門狗——關(guān)中斷——時(shí)鐘分頻。。.
在設(shè)置時(shí)鐘分頻以前,cpu都是工作在12Mhz頻率的,當(dāng)設(shè)置完時(shí)鐘分頻后,cpu的工作頻率將是400MHZ,這相當(dāng)于完成了一個(gè)蛻變,從一個(gè)普通人變成了超人,多了幾十倍的反應(yīng)速度,更加高效的執(zhí)行后面的代碼。想想如果沒(méi)有對(duì)時(shí)鐘進(jìn)行倍頻處理,仍然讓它運(yùn)行在12MHz,處理同一件任務(wù)多要30多倍的時(shí)間,將是一件多么折磨人的事情。
接下來(lái)將會(huì)繼續(xù)對(duì)時(shí)鐘這個(gè)問(wèn)題進(jìn)行分析,雖然這里分析了怎么設(shè)置時(shí)鐘分頻,但是這只是開始,后面將對(duì)省電模式,快啟動(dòng),慢啟動(dòng),實(shí)時(shí)時(shí)鐘,pwm時(shí)鐘等內(nèi)容進(jìn)行講解。
評(píng)論
查看更多