分頻器是一種套用十分廣泛的電路 ,其功能是對較高頻率的信號分頻, 以得到所需要的低頻信號 。實際套用中,所需要的分頻係數可能為整數或小數 。整數分頻的實現比較簡單, 可採用計數器晶片或用可程式邏輯器件設計 。
現代電子系統設計中 ,數字電子系統所占的比例越來越大 ,現代電子系統發展的趨勢是數位化和集成化 。而在數字系統中 ,時鐘是各模組協同工作的根本保障 ,特別是時序數字系統 ,沒有時鐘根本無從工作 。在數字系統設計中 ,經常需要對基準時鐘進行不同倍數的分頻而得到各模組所需的時鐘頻率 ,分頻器是數字系統設計中最常見的基本電路之一 。數字分頻器一般有兩類 : 一類是脈衝波形均勻分布的分頻器 , 即常規分頻器 ; 另一類是脈衝波形不均勻分布的分頻器 。常規分頻器一般只能進行整數倍分頻 ,且分頻倍數須為偶數 。但在某些場合 ,時鐘源與所需的頻率不成偶數倍數關係 ,此時就需要波形不均勻的分頻器 , 這種分頻器除可進行整數倍分頻外 ,還能進行小數倍分頻 ,從而可以得到相對連續的頻率輸出 ,可套用於很多數字系統中 ,如直接數字頻率合成中輸出波形的頻率控制以及步進電機中轉速的控制等 。
小數分頻的基本原理
小數分頻器的實現方法很多, 但其基本原理一樣, 即在若干個分頻周期中採取某種方法使某幾個周期多計或少計 1 個數 , 即吞脈衝或插入脈衝的方法 ,從而在平均意義上獲得 1 個小數分頻比 ,設要進行分頻比為 N 的小數分頻 , N 可表示為N =K +X*10^(-n)式中 , n , K , X 均為正整數 ; n 為0到X 的位數,即 N 有n 位小數 。
另一方面 ,分頻比又可以寫成 :N =M/P式中 : M 為分頻器輸入脈衝數;P 為輸出脈衝數 。M = NP =( K +X*10^(-n)) P令 P =10^n , 則有M =10^n*K +X,以上是小數分頻器的一種實現方法 , 即在進行K 次分頻前, 輸入端設法多輸入 X 個脈衝 。
電路組成及工作原理
整個電路由整數/半整數分頻器、計數( 10 分頻) 器和解碼器 、D 觸發器、輸出選擇器等組成。分頻器完成對輸入信號的整數或半整數分頻功能, 計數和解碼部分完成輸入脈衝的計數和控制信號產生功能 ,觸發器產生控制所需要的信號。n =5 ,即實現小數點後 5位分頻。原理圖和程式的對應關係為 : 5 個預置數( E、F 、G) 從左到右依次記為 pdata0 、pdata1 、pdata2 、pdata3 、pdata4 , 輸出數據選擇器的選擇端記為 equal05 , 分頻係數的整數部分記為 data in。
該電路是在單片機或 CPLD 的其它模組配合下工作的 ,當需要實現某個係數的分頻時,單片機等控制電路向該模組設定參數 ,包括分頻係數的整數部分 、預置數、hight05 、和 equal05 。當分頻係數 N =0 . 5時 , equal05 =1 , 整數分頻係數為 N 。當分頻係數N ≠0 . 5時 ,如果小數部分小於 0 . 5 ,如分頻係數為 N=0 . 23456 ,則控制方法為 equal05 =0 、high05 =0 、datain =N 、pdata0 、pdata1 、pdata2 、pdata3 、pdata4 分別為2 、3 、4 、5 、6 ; 小數部分大於 0 . 5 時 , 則用 1 減去小數部分後的差值作為預置數 , 如分頻係數為 N =0 . 765 67 ,則控制方法為 equal05 =0 、high05 =1 、datain =N 、pdata0 、pdata1 、pdata2 、pdata3 、pdata4 分別為 2 、3 、4 、3 、3 ,即 pdata0 、pdata1 、pdata2 、pdata3 、pdata4 =1 -0 . 765 67 =0 . 234 33。
計數器( 10 分頻)和解碼器就是確定輸入多少個脈衝,在整數/半整數分頻器的輸出中增加或去除半個脈衝。該電路小數的位數可以根據需要任意設定 ,主要取決於CPLD 的硬體資源情況 。
VHDL 語言的實現
原理圖所對應的源程式包括頂層模組和底層模組,頂層模組主要是通過元件語句將各模組進行連線, 而各底層模組則完成相應的功能。底層模組主要有整數/半整數分頻器 、計數和解碼器、D 觸發器等。下面僅介紹頂層模組和分頻 、解碼模組的源程式 ,程式中的庫調用、元件聲明和信號定義等由於篇幅均已刪除。
( 1) 頂層模組
頂層模組包括底層模組之間的連線和輸出信號的選擇 2 部分 ,模組連線用元件語句,輸出的選擇直接用進程描述 。由於某些模組的連線是類同的, 為節省篇幅而又不失其總體框架, 已將類同部分刪除。
ENTITY nbit pset pdivfre2 IS
GENERIC( leng : INTEGER: =7);
PORT( inclk ,EN ,reset : IN STD LOGIC ;
high05 ,equal05 : IN STD LOGIC ;
pdata0 , pdata1 , pdata2 , pdata3 , pdata4 : IN STD
LOGIC VECTOR( 2 DOWNTO 0
data in : IN STD LOGIC VECTOR( leng -1 DOWNTO0);
outclk , test1 , test2 : OUT STD LOGIC—);
END nbit pset pdivfre2 ;
ARCHITECTURE nppdf2 OF nbit pset pdivfre2 ISBEGIN
outclk <= outclk tmp ;
modecontmp<= high05 XOR ( requst0 OR requst1 OR requst2 OR requst3 OR requst4);
ff0d <= requst0 ;ff1 d <=( NOT requst0) AND requst1 ;
ff2d <=( NOT requst0) AND ( NOT requst1) ANDrequst2 ;
ff3d <=( NOT requst0) AND ( NOT requst1) AND( NOT requst2) AND requst3 ;
ff4d <=( NOT requst0) AND ( NOT requst1) AND( NOT requst2) AND ( NOT requst3) AND requst4 ;
U0 : nbit psetp divfre —整數/半整數分頻PORTMAP( inclk =>inclk , EN =>EN , reset =>reset , mode con =>mode con tmp , data in =>data in ,outclk21 = >clk21 tmp , outclkn = >clkn tmp ,clkb =>clkb tmp);
PROCESS ( equal05 , data in , pdata0 , pdata1 , pdata2 , pdata3 , pdata4)—輸出信號的選擇BEGINIF ( equal05 =" 0" ) THEN outclk tmp <=clkn tmp ;
ELSIF ( equal05 = ' 1' ) THEN outclk tmp<=clk21 tmp ;
ELSIF( data in =1 AND pdata0 =0 AND pdata1 =0 AND pdata2 =0 AND pdata3 =0 AND pdata4 =0) THENoutclk tmp <= inclk ;
END IF ;
END PROCESS ;
U1 : difre dec —計數解碼部分的元件連線PORTMAP( EN =>EN , reset =>reset , difre in
=>clkb tmp , clr requst =>clr requst0 , pset data =>pdata0 , requst =>requst0 , cnt co =>cnt0 co);
……U5 : difre decPORTMAP( EN =>cnt3 co , reset =>reset , difrein =>clkb tmp , clr requst =>clr requst4 , pset data=>pdata4 , requst =>requst4 , cnt co =>cnt4 co);
U6 : D ff PORT MAP( D =>ff0 d , reset =>GND ,CLK =>clkb tmp , outq =>ff0 q); —觸發器部分的連線……U15 : D ff PORT MAP( D =>ff4 q , reset =>GND ,CLK =>inclk , outq =>clr requst4);
END nppdf2;
( 2) 計數解碼模組
該模組對輸入脈衝計數, 以決定何時在輸出中插入或去除 1 個脈衝(吞脈衝), 所以該模組由計數( 分頻)、解碼和控制信號產生等 3 部分構成 ,其中解碼部分的源程式用流程圖表示:
BEGIN
PROCESS( difre in , reset , EN)—10 分頻的描述VARIABLE state : INTEGER RANGE 0 TO 1 ;
BEGINIF reset =" 1" THEN count q <=( OTHERS =>' 0' );
ELSIF ( difre in' EVENT AND difre in =" 1" ) THENIF EN =" 1" THENIF( count q =9) THENcount q <=”0000” ;
cnt co <=" 1" ;
ELSE count q <=count q +' 1' ;
cnt co <=" 0" ;
END IF ;
ELSE cnt co <=" 0" ;
count q <=count q ;
END IF ;
END IF ;
END PROCESS ;
—解碼進程( 見右側流程圖)PROCESS ( dec out ,clr requst)
—控制信號( requst) 的產生
BEGIN
IF( clr requst =" 1" ) THEN requst <=" 0" ;
ELSIF( dec out' EVENT AND dec out =" 1" ) THENrequst <=" 1" ;
END IF ;
END PROCESS ;
END dd;
( 3) N 位整數/半整數分頻模組該模組根據單片機或 CPLD 等設定的參數不同,可以選擇整數分頻輸出或半整數分頻輸出 ,取決於分頻係數。
BEGIN
clk <=inclk XOR divide2 ;
coutclk <=outclk tmp ;
PROCESS ( clk , EN)BEGIN
IF ( CLK' EVENT AND CLK =" 1" ) THEN
IF ( EN =" 1" ) THEN
IF ( cnt q =0) THEN
FOR i IN 0 TO leng -1 LOOP
cnt q( i)<=data in( i);
END LOOP ;
outclk tmp <=" 1" ;
ELSE
cnt q <=cnt q -1 ;
outclk tmp <=" 0" ;
END IF ;
END IF ;
END IF ;
END PROCESS ;
PROCESS ( outclk tmp)
BEGIN
IF ( outclk tmp' EVENT AND outclk tmp =" 1" ) THEN divide2 <=NOT divide2 ;
END IF ;
END PROCESS ;
END nppdf ;
幾種小數分頻器的設計方法
小數分頻器的實現方法很多 , 但其基本原理一樣 : 在若干個分頻周期中採取某種方法使某幾個周期少計一個或幾個數 , 即吞脈衝原理 , 從而在整個計數周期的總體平均意義上獲得一個小數分頻比。以下簡要說明三種比較常用的小數分頻電路的原理及設計方法 :
用 BCD 比例乘法器 4527 加法級聯能對基頻進行 10 n /X 倍分頻 , 其中 , n 為 4527 的級聯級數 , X 為對 4527 的置數 ; 積分分頻器是比較常見的小數分頻器 , 其基本原理是將小數分頻比轉換為整數比值 ,再採用計數器對輸入時鐘進行計數 , 根據計數值吞掉一些脈衝 ,從而得到所需的頻率輸出 ; 累加器分頻則是一種基於相位累加器基本原理的一種分頻技術 ,將累加器最高位作為分頻輸出 , 根據送入累加器中不同的累加步長改變分頻倍數。
1 採用 BCD 乘法器 4527 實現
BCD 比例乘法器 4527 接成加法級聯方式 , C LK 端輸入基準時鐘頻率 f in 由晶振電路提供 ,高位置數 K 1 , 低位置數 K 2 , 在 10 個 C LK脈衝內 4527 (1)輸出 K1 個脈衝 , 同時由 IN HO UT禁止低位 4527(2)對 CLK 進行比例分配 , K 1個脈衝直通 4527 (2)送出 。 10 個 C LK 脈衝結束時 , INHO UT 發出脈衝允許 4527 (2)的 CLK 進入 , 則可有一個脈衝插入 。如此下去 , 在 100 個 C LK 脈衝內 ,會有 10 ×K 1 個脈衝直通送出 , 以及 10 個 INHO UT 脈衝 , 這樣輸出端 f out 便有 K 2 個脈衝插入 ,共送出(10K 1 +K 2 )個脈衝 ,即輸出時鐘頻率 :fout = (10K 1 +K 2 )f in /100 (1)
如同上述 , n 級 4527 級聯 , 預置數分別為 K 1 , K 2 ,…… , K n後 ,設 CLK 時鐘端輸入的基準時鐘頻率為fin ,則級聯輸出頻率 :f out =f in (10n - 1 ×K 1 +10n - 2 ×K 2 +… +10 ×K n - 1 +K n )/10n 其中為 n 片 4527 的預置數 ,改變預置數即可方便地改變輸出頻率。
2 積分分頻器
積分分頻器的設計首先需將小數分頻比轉換為整數比值 ,再採用計數器對輸入時鐘進行計數 ,根據計數值對輸入時鐘及插入脈衝進行選擇分配 , 從而得到 需 要的 頻 率輸 出 脈 沖。 設“1010101010”代表 5kH z 信號中的一段信號 , 在同樣長的時間內設法得到另一脈衝串“1010100000”信號 ,若其‘0’ 、 ‘1’ 寬度與 5kH z 信號中的‘0’ 、 ‘1’寬度相同 ,即為輸入時鐘的寬度 ,則可得到 3kHz 的時鐘信號 。這樣 ,多路選擇器可在前三個周期選擇輸入時鐘直接輸出 , 而在後兩個周期選擇輸出‘0’ ,就可以得到脈衝串“ 1010100000” , 從而完成 3 /5 倍的分頻 ,得到 3kH z 的信號。
3 累加器分頻
在 DDS 技術中經常採用相位累加器來進行頻率控制 , 對於頻率不變的輸入基準時鐘 ,可採用對相位累加器置不同的累加步長來得到不同的定址速率 。從中得到啟示 ,也可採用累加器進行小數分頻。累加器由加法器與並行數據暫存器組成 , 頻率控制字經數據轉換模組轉換為累加器的累加步長 , 將並行數據暫存器的高位作為時鐘輸出 。
設輸入時鐘為頻率 fin , 相位累加器的位數為 N , 則輸出頻率的解析度(當送入的頻率控制字 K 為 1 時的輸出頻率)為f out min =f in2N (3)從式(3)可看出 , 在累加器位數足夠高時 , 最小輸出頻率(頻率解析度)可接近零頻 。實際設計過程中 , 可根據分頻倍數的要求來選擇累加器的位數。
若設頻率控制字為 K , 則輸出頻率為f out =K f in2N (4)以上三種小數分頻器各有其特點 ,採用 4527 的分頻電路比較複雜 , 適用於頻率為 10 的冪的輸入 ;積分分頻器首先需把分頻倍數轉換為兩整數之比值 , 故在使用中 ,對分頻倍數要求比較嚴格,靈活性受到一定限制 ; 累加器分頻則對頻率為 2 的冪的輸入時鐘分頻效果比較好 ,而且輸出時鐘有一定的抖動 , 但還是可以套用於一些特殊場合。
小數分頻器的套用
小數分頻器在數字系統設計中的套用非常廣泛 , 經常是各個模組需要的頻率不相同 ,這就需要對時鐘進行分頻得到各模組需要的時鐘頻率。但常規的整數分頻器(實際就是計數器)不能滿足要求 , 例如, 若基準時鐘頻率為 100M H z , 對其進行整數分頻,只能得到 50M H z 、25MH z 等頻率值, 如想得到30M H z 、20MH z 等頻率值, 就需要套用小數分頻器對基準時鐘進行小數分頻。
在 DDS 波形發生器設計和步進電機驅動中, 需要對輸出信號頻率進行控制 , 若採用一般計數器來進行分頻 ,由上述分析可知,輸出信號頻率值的連續性就受到限制 。為了使輸出信號頻率值能連續可控,就需進行小數分頻。
1 在 DDS 技術中的套用
頻率控制字送入分頻器,設基頻頻率為 fin ,分頻倍數為 W , 則計數器的時鐘頻率為為 fin /W 。計數器在頻率 fin /W 的時鐘作用下計數對查找表定址輸出波形數據。若查找表存儲深度為 M(一個周波存儲 M 個點),則輸出波形的頻率為f o = f inWM (5)式中 , fin為基頻頻率、存儲深度 M 為一定值, 這樣就只需控制分頻倍數 K 來控制合成波形的頻率 。
在 DDS 技術中,常用的技術是採用累加器對查找表定址 。但採用這種方法時 ,在輸出高頻與低頻波形時的定址點數不同, 在高頻定址點數較少 ,而在低頻時點數較多 ,為保證在頻率較高時輸出的波形失真度小, 在低頻階段 , 定址的點數就比較多 , 需要較深的存儲深度 。而採用圖 4 所示的方法, 則不管在低頻或高頻, 定址點數一樣 ,這樣就可以採用一致的存儲深度,節約存儲器 。特別是採用 CPLD 進行系統設計時, 查找表也可採用 CPLD 來設計, 易於系統集成。
2 在步進電機驅動中的套用
步進電機是一種用電脈衝信號進行控制 , 將電脈衝信號轉換為相應的角位移或線位移的控制電機。在步進電機的驅動中, 需要對步進電機轉速進行控制。基準時鐘在頻率控制字作用下分頻得到所需頻率的脈衝作為脈衝分配器的時鐘, 這樣即可控制脈衝分配器輸出驅動脈衝的速率 ,經功率放大後驅動步進電機。
此外 ,步進電動機的最高起動頻率(突跳頻率)一般為幾百 H z 到三、四千 H z , 而最高運行頻率則可以達到幾萬 H z 。以超過最高起動頻率的頻率直接起動, 將出現“失步”(失去同步)現象 ,有時根本就轉不起來 。而如果先以低於最高起動頻率的某一頻率起動, 再逐步提高頻率, 使電機逐步加速 ,則可以到達最高運行頻率。而且, 對於正在快速旋轉的步進電動機 ,若需停轉, 立即停發脈衝 , 令其立即準確鎖定 ,也是很難實現的; 由於慣性, 電動機往往會衝過頭 ,也會出現失步 。如果電動機的工作頻率總是低於最高起動頻率 ,當然不會失步 ,但電動機的潛力沒有發揮 ,工作速度太低了。