----------------------------------------------
作者:CrazyBingo
---------------------------------------------
基於Cyclone IV的PLL重配置設計
在實際項目應用中,由於系統的復雜,在某些需求中,需要實現動態時鍾輸入,或者輸出,以實現不同的時序電路,完成特定的功能。
對於多時鍾的輸入,當波動超過了一定范圍,與之對應的PLL將無法重新鎖定時鍾,其輸出時鍾頻率將變為不確定的值;同時過去FPGA內部PLL上電完成配置,只能輸出固定頻率的時鍾,無法在上電后在此改變(而是用多個PLL實現多個時鍾的輸出,也只能局限於幾個頻率)。如此的限制,讓我們在多時鍾設計中不免覺得尷尬。
盡管Stratix II早就有了動態PLL,能在上電后動態配置輸入時鍾、輸出時鍾、相位等,但是其價格的高昂,沒有受太大的關注。直到Cyclone III/IV面世以來,在成本敏感的領域實現高性價比的動態時鍾配置,完成不可能的設計,成為了一種可能。
1. PLL的原理與可重配置PLL
鎖相環(PLL,Phase Lock Loop)主要作用就是把內部/外部時鍾的相位和頻率同步於輸入參考時鍾。PLL一般由模擬電路所實現,其結構如下圖所示。
1.1. PLL可充配組件
PLL 使用幾個分頻計數器和不同的 VCO 相位抽頭來執行頻率合成及相移。在 Cyclone IV 器件的 PLL 中,您可以實時重配置計數器設置及相移 PLL 輸出時鍾。此外,您也可以修改電荷泵和環路濾波器組件,這會對 PLL 帶寬產生動態影響。 您可以使用這些PLL 組件,在幾微妙內來實時更新輸出時鍾頻率、PLL 帶寬和相移,而無需重配置整個 FPGA。
以下PLL可重配置組件:
當然,還有PLL還允許動態相移配置,不過這個配置模塊與PLL沖配置模塊不在一塊兒,因此此處沒有羅列出,這也不是本文主要的研究目標。Cyclone III/IV的可充沛組件參數,如下所示:
1.2. 可重配PLL
如上圖所示,PLL的重配置,是通過一條掃描鏈完成的。所謂掃描鏈,其實是一系列的寄存器,通過寄存器的更新,來完成PLL的重配置。因此,PLL的重配置,要嚴格遵循一定的時序,即不能違背掃描鏈的架構,否則必然導致重配置失敗,甚至失鎖。
有關掃描鏈時序的分析,如下官方手冊的截屏:
在Quartus LPM中定制PLL,並且使能PLL動態特性,允許用戶可以通過相關接口對PLL進行重配置,如下如所示:
用戶可以通過一個Mif文件,來初始化輸出時鍾,相移等參數(事實證明這個mif不存在也不會影響,因為后端用戶設定了參數)。最后生成了如下模塊:
其中包含了PLL的復位,輸入時鍾,輸出時鍾,以及動態配置的信號線。通過configuradta信號,讓PLL動態配置。
1.3. PLL重配模塊
縱然PLL的重配置時序不是那么復雜,但是Altera怕我們出意外,為了設計上的簡單,減少開發周期,Altera提供了PLL重配置模塊。用戶只要更新本模塊的寄存器(Mif)文件,通過configuradta,本模塊會自動完成對可重配PLL的配置。
如上圖所示,紅圈圈部分,即ALTPLL_RECONFIG的用戶接口。用戶可以通過更新ALTPLL_RECONFIG內部的Mif文件,通過其對可重配PLL的自動配置功能,完成PLL的動態配置。
具體電路如下所示。通過write_fraom_rom信號,通過選擇電路。直接讓ALTPLL_RECONFIG自動讀取選擇的外部ROM的數據,完成對ALTPLL_RECONFIG內部Mif文件的更新。在此之后,通過使能信號,在此自動完成PLL的重配置。
2. PLL重配置的實現
2.1. 相關參數的研究
在可重配PLL的定制過程中,可以生成以定制參數的Mif文件,如上圖所示。經過反復的研究,觀察了10M~80M,步進為5M的時鍾輸出的Mif文件,發現了如下規律。其中0-~36為默認,其他有一定的規律,如下圖所示:
序號 |
地址 |
位數 |
參數 |
1 |
36 |
1 |
M counter: Bypass,0表示打開,1表示旁路 |
2 |
37-44 |
8 |
M counter: High Count,縮放因子 |
3 |
45 |
1 |
M counter: Odd Division,1表示奇數分頻 |
4 |
46-53 |
8 |
M counter: Low Count,乘法因子 |
5 |
54 |
1 |
clk0 counter: Bypass,0表示打開,1表示旁路 |
6 |
55-62 |
8 |
clk0 counter: High Count,高脈沖計數 |
7 |
63 |
1 |
clk0 counter: Odd Division,1表示奇數分頻 |
8 |
64-71 |
8 |
clk0 counter: Low Count。低脈沖計數 |
反復的研究Altera 《Implementing PLL Reconfiguration in Cyclone III Devices》手冊,詳細的分析了ALTPLL_RECONFIG的更新時序,最終研究表明,有三種PLL重配置的方法:
(1)不用ALTPLL_RECONFIG,直接編寫時序,更新相關參數(難度較大,無用功太大,不考慮了)
(2)使用ALTPLL_RECONFIG,通過更新Mif文件,完成重配置(還行,Altera推介這樣干)
(3)直接在ALTPLL_RECONFIG中需要改變的參數,然后通過ALTPLL_RECONFIG,全自動更新PLL(前期需要一定的研究,要寫一些時序,不過一旦成功,一勞永逸)
2.2. Mif文件更新方案
如上圖,只要完成了ALTERA_RECONFIG的更新,對PLL的動態配置相當的簡單,具體電路見altera官方手冊截屏:
Altera貌似推介這種方法,因為不容易出錯,不過缺點是,每一個Mif文件,都在在配置PLL的時候,通過修改參數生成,而且需要多少個CLK輸出,就需要定制多少個ROM。當然,在完成任務的前提下,我們已經成功了。
2.3. Param更新方案
對於有完美強迫症的我,通過Mif更新的方法,實在是無法忍受。我們明明能做的更好一點,為什么不在努力一把,再花點功夫,研究的深入一些,直接對需要修改的參數進行更新。
在本節第一部分中的參數研究,得出了需要改變的參數,如下表所示:
N |
CLK |
LFC |
LFR |
VPS |
CPU |
NX |
MH |
ML |
odd |
CH |
CL |
odd |
0 |
10 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
30 |
30 |
0 |
|
1 |
15 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
20 |
20 |
0 |
|
2 |
20 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
15 |
15 |
0 |
|
3 |
25 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
12 |
12 |
0 |
|
4 |
30 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
10 |
10 |
0 |
|
5 |
35 |
0 |
27 |
0 |
1 |
4 |
3 |
1 |
5 |
5 |
0 |
|
6 |
40 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
8 |
7 |
1 |
|
7 |
45 |
0 |
27 |
0 |
1 |
5 |
4 |
1 |
5 |
5 |
0 |
|
8 |
50 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
6 |
6 |
0 |
|
9 |
55 |
0 |
27 |
0 |
1 |
6 |
5 |
1 |
5 |
5 |
0 |
|
A |
60 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
5 |
5 |
0 |
|
B |
65 |
0 |
27 |
0 |
1 |
7 |
6 |
1 |
5 |
5 |
0 |
|
C |
70 |
0 |
27 |
0 |
1 |
4 |
3 |
1 |
3 |
2 |
1 |
|
D |
75 |
0 |
27 |
0 |
1 |
6 |
6 |
0 |
4 |
4 |
0 |
|
E |
80 |
0 |
27 |
0 |
1 |
4 |
4 |
0 |
3 |
2 |
1 |
因此,只要通過一定的時序,將這些參數更新,便可。而且這些參數不是任意的,而是密切跟輸出輸出頻率相關聯的,因此,甚至可以用過其他控制邏輯,發送需要輸出CLK的參數,來完成動態PLL的配置。
配置的LPM如上如所示,唯一的區別就是舍棄了ROM讀取的接口,因為這已經是多余的了。通過上圖中的時序,對counter_type的counter_param進行更新,因此,對照着時序圖自行設計狀態機,對模式寄存器的參數進行更新。具體對應頻率的參數如下所示:
經過21個狀態,按照一定的時序,更新CLK的乘除因子,狀態機如下:
最后10M到35M的PLL動態配置,更新駛入如下所示:
3. PLL動態配置的結論與意義
最后,整體設計如上RTL所示,當然目前實現的只是5M-80M,步進為5M的不同時鍾的選擇,而不是任意時鍾的輸出。目前實現的萬能顯示控制器,在5M-80M間運行正常,性能穩定,多虧了動態PLL的功勞。頂層主要包括了如下幾個模塊:
序號 |
模塊 |
功能 |
1 |
pll_reconfig_top |
PLL重配置頂層模塊 |
2 |
u_pll_parameter |
不同頻率的參數選擇模塊 |
3 |
u_user_reconfig_ctrl |
PLL需要改變的參數更新模塊 |
4 |
u_pll_reconfig |
ALTERA PLL更新模塊 |
5 |
u_ref_pll |
可重配的PLL模塊 |
對於任意的輸出,由於某些頻率下,當分頻參數大了,還需要改變電容泵,環路濾波電容電阻等參數,(比如27M的時候,就需要),此處暫時沒有再深入,因為對本設計失去了意義。
要問意義何在?毋庸置疑!
(1)在數字信號處理領域,輸入CLK改變得時候……
(2)輸出時鍾需要動態改變,比如ULC的時候……
(3)……
自從有了動態PLL,很多蒼白無力的事情,變得更精彩了……
______________________________________
關於 《iBoard 電子學堂》……
《iBoard 電子學堂》是一個綜合型的電子研發開發平台,適合在校學生、一線工程師及電子愛好者等。
交流方式:
官方論壇:www.oshcn.com
官方淘寶店鋪:i-Board.taobao.com
QQ群:
《iBoard 電子學堂 群【A】》:204255896(500人,滿)
《iBoard 電子學堂 群【B】》:165201798(500人超級群,滿)
《iBoard 電子學堂 群【C】》:215053598(200人高級群)
《iBoard 電子學堂 群【D】》:215054675(200人高級群)
《iBoard 電子學堂 群【E】》: 215055211(200人高級群)
《iBoard 電子學堂 群【F】》: 78538605 (200人高級群)
《iBoard 電子學堂 群【G】》: 158560047(500人高級群)