[Linux Kernel慢慢學]了解Linux CCF (Common Clock Framework)中的那些基本元件

Posted by John on 2021-01-03
Words 2k and Reading Time 7 Minutes
Viewed Times

前言

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相關的元件大致有:

  1. 晶振、震盪器 (Oscillator, Crystal): 用於產生固定頻率的電子訊號
  2. 鎖相迴路 (Phase Locked Loop, PLL): 用於產生穩定的倍頻
  3. 除頻器 (Divider): 用於頻率的除頻
  4. 多工器 (Multiplexer): 用於選擇頻率來源
  5. 門控 (Clock Gate, CG): 用於Clock Enable / Disable
  6. 設備 (Consumer): 使用該時鐘的設備

下面依序介紹各個元件扮演的角色,以及簡介他們背後的原理是怎麼運作的。

Oscillator

系統需要的Clock Source由晶振所產生,但晶振只能產生固定的頻率,並且基於工藝和成本的因素沒辦法產生很高的頻率

如果此時系統需要使用不同的頻率該怎麼辦? 這時候就可以透過PLL和Divider就出場了

PLL

PLL用來產生倍頻的頻率,使得單一頻率源的晶振可以有不同倍率的頻率供給不同的consumer

但他是怎麼做到的呢? PLL的組成大致可分成三個部分:

  • Phase Detector (PD): 相位檢測器
  • Low-pass Filter (LPF): 低通濾波器
  • Voltage-Controlled Oscillator (VCO): 壓控振蕩器,可用電壓調整輸出頻率的一個元件

運作流程大致可以解析如下:

  1. PD會比對參考訊號和輸出訊號的相位差異,將相位差異轉成電壓訊號輸出
    • 參考訊號$可以想成外部clock source的頻率輸入
    • 輸出訊號則是VCO產生的頻率
  2. 電壓訊號經過低通濾波器(LRF)轉換成VCO的控制電壓
  3. 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的文章了:)

References


>