前言
Linux CCF (Common Clock Framework)是一個用來管理clock的子系統,CCF向使用clk的driver提供操作clock的interface,同時也向clk driver的開發者提供一個管理clock的通用框架。
這篇文章作為了解Linux Clock框架的事前學習,介紹了一個系統的時間相關元件通常由哪幾項元件組成,而他們各自又是什麼東西。
(下面是自己的粗淺學習筆記,如有錯誤還請留言更正)
Introduction of Clock Tree
要了解CCF,就必須先了解一個時間系統由那些元建構成,這裡引用wowotech大大的文章做介紹(wowotech的文章對我在學習Linux之路扮演了很大的啟蒙導師的角色,大推!)
如今,可运行Linux的主流处理器平台,都有非常复杂的clock tree,我们随便拿一个处理器的spec,查看clock相关的章节,一定会有一个非常庞大和复杂的树状图,这个图由clock相关的器件,以及这些器件输出的clock组成。下图是一个示例:
一個系統中clock相關的元件大致有:
- 晶振、震盪器 (Oscillator, Crystal): 用於產生固定頻率的電子訊號
- 鎖相迴路 (Phase Locked Loop, PLL): 用於產生穩定的倍頻
- 除頻器 (Divider): 用於頻率的除頻
- 多工器 (Multiplexer): 用於選擇頻率來源
- 門控 (Clock Gate, CG): 用於Clock Enable / Disable
- 設備 (Consumer): 使用該時鐘的設備
下面依序介紹各個元件扮演的角色,以及簡介他們背後的原理是怎麼運作的。
Oscillator
系統需要的Clock Source由晶振所產生,但晶振只能產生固定的頻率,並且基於工藝和成本的因素沒辦法產生很高的頻率
如果此時系統需要使用不同的頻率該怎麼辦? 這時候就可以透過PLL和Divider就出場了
PLL
PLL用來產生倍頻的頻率,使得單一頻率源的晶振可以有不同倍率的頻率供給不同的consumer
但他是怎麼做到的呢? PLL的組成大致可分成三個部分:
- Phase Detector (PD): 相位檢測器
- Low-pass Filter (LPF): 低通濾波器
- Voltage-Controlled Oscillator (VCO): 壓控振蕩器,可用電壓調整輸出頻率的一個元件
運作流程大致可以解析如下:
- PD會比對參考訊號和輸出訊號的相位差異,將相位差異轉成電壓訊號輸出
- 參考訊號$可以想成外部clock source的頻率輸入
- 輸出訊號則是VCO產生的頻率
- 電壓訊號經過低通濾波器(LRF)轉換成VCO的控制電壓
- VCO根據控制電壓來對調整輸出的頻率,最終達到參考訊號=輸出訊號
- 當輸入的參考訊號和VCO產生的頻率相同時,則我們稱PLL被鎖定
PLL怎麼做到倍頻?
而倍頻這件事要如何達成? 就是動動手腳騙一下PD
在VCO產生的頻率後面接一個分頻器(Divider),使得PD接收到的輸出訊號的值是實際上的1/N倍,如此一來就可以產生N倍的頻率了!
了解上述的簡介後,看一下架構圖會更加清楚(引用自analog devices的圖片)
這麼做有什麼好處?
- 使用PLL搭配低頻的晶振就可以產生高頻的訊號源,降低成本
- 使用PLL可以在不更改硬體的情況下產生不同倍數的高頻,因此可以產生不同倍數的高頻
此外,透過對PLL的了解,我們也知道一個系統能產生的最高頻率並不是晶振的上限,而是取決於VCO的上限
Divider
光有PLL做倍頻還不夠,試想一個情境:
我們的clock source是10MHz,想要產生各式各樣不同的頻率該怎麼辦?
10的倍數,如20Mhz、30Mhz還可以用PLL做出來,但如果我想要26Mhz、3Mhz這種頻率的話呢?
這時候PLL搭配Divider就可以做出各式各樣的頻率,比方說我可以先用/10的Divider得到1Mhz,然後再用PLL去取得我想要的倍頻
Divider是怎麼做的?
而Divider背後是怎麼做的呢? 這就扯到大學學的數位電路學中的正反器(Flip-flop, FF)了
大學學到的電路學大部分都還給教授了QQ 所以這邊又花了點時間複習一下
學東西都要有個脈絡,所以還是從一開始講起,在數位電路中有組合邏輯電路和序向邏輯電路:
- 組合邏輯電路的輸出狀態僅和當下的輸入有關
- 序向邏輯電路因為具有記憶功能,上一個時間的輸出也會影響到下一個時間的輸出
- 序向邏輯電路的基本元件有門閥(Latch)和正反器(Flip-flop)
門閥(Latch)可由兩個NAND或兩個NOR組成,不過當訊號一發生改變的時候輸出也會發生相對應的改變,很難界定出下一個狀態是哪個時間點,所以有了正反器(Flip-flop)
正反器即是,在門閥的電路上,加上時脈訊號(clock)與邏輯閘的設計,使得可以以時脈作為一個個狀態的時間點,然後就有了讓你大學各種記不起來的正反器(RS正反器、D型正反器、JK正反器…)
而基本上會希望正反器在每次時脈為高態的時候只改變一次(即clock=1時只會做一次改變),否則就無法很明確的區分出高態時每次的變化,因此有了邊緣觸發(edge triggering)的正反器,使正反器在時序信號發生變化時才會出發,進而改變輸出訊號,根據改變的時機又分成
- 正緣觸發(positive edge triggering)
- 負緣觸發(negitive edge triggering)
而所有的正反器都可以搭配邊緣觸發變成邊緣觸發正反器。
接下來…沒有接下來了…
沒有要再繼續介紹下去了,我愧對我大學電路學教授,有興趣的可以去看CPLD數位邏輯設計複習
好了,該回頭講除頻器這個玩意兒,它其實就是一個用正反器做出來的計數器,舉一個JK正反器為例子,下面是他的電路圖和真值表(圖片引用自CPLD數位邏輯設計)
當J=1, K=1時該正反器具備toggle功能(下個時間的狀態會與當前相反),如果在這狀態下搭配負緣觸發會發生什麼事情呢?
有沒有發現,$Q_{n}$的頻率變成CLK的1/2了! 這就達到了分頻的效果
- 而如果要得到1/4頻率,要怎麼辦呢? 2個正反器即可,其餘依此類推
Multiplexer
現在多虧了PLL、Divider,我們可以有許多不同頻率的clk source了,那device要使用哪一個來源的頻率就可以透過多工器來進行選擇
多工器也是數位電路學的東西,反正就你給一個控制訊號它可以給你對應的input,細節回去自己K書
Clock Gate
Clock Gate就是一個門閥,用來決定要不要讓訊號進入你的device,如果我的理解沒錯的話
- clear CG: 代表打開CG讓訊號進入
- set CG: 關閉CG門閘,阻止訊號進入
對於register的操作,我永遠搞不懂clean/set到底是要設成1還是清成0…
Consumer
前面的元件都順利設好之後,你的device就能開開心心使用該頻率的clock來運作啦!
到此我們對CCF中相關元件有了初步的認識,然後就可以開開心心的繼續看wowotech的文章了:)