《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動態(tài) > 一種可編程的全數(shù)字鎖相環(huán)路的實現(xiàn)

一種可編程的全數(shù)字鎖相環(huán)路的實現(xiàn)

2008-08-04
作者:徐 躍 王 奇 何秋陽

??? 摘 要: 介紹了一種基于FPGA可編程技術(shù)實現(xiàn)的用于無線通信實驗系統(tǒng)的全數(shù)字" title="全數(shù)字">全數(shù)字鎖相環(huán)路" title="鎖相環(huán)路">鎖相環(huán)路。詳細(xì)敘述了其工作原理、工作性能、電路實現(xiàn)和仿真結(jié)果。
??? 關(guān)鍵詞:? FPGA? 全數(shù)字鎖相環(huán)路? VHDL語言

?

??? 鎖相環(huán)路已在模擬和數(shù)字通信及無線電電子學(xué)等各個領(lǐng)域中得到了極為廣泛的應(yīng)用,特別是在數(shù)字通信的調(diào)制解調(diào)和位同步中常常要用到各種各樣的鎖相環(huán)。鎖相就是利用輸入信號與輸出信號之間的相位誤差自動調(diào)節(jié)輸出相位使之與輸入相位一致,或保持一個很小的相位差。最初的鎖相環(huán)全部由模擬電路組成,隨著大規(guī)模、超高速數(shù)字集成電路的發(fā)展及計算機的普遍應(yīng)用,出現(xiàn)了全數(shù)字鎖相環(huán)路。所謂全數(shù)字鎖相環(huán)路,就是環(huán)路部件全部數(shù)字化,采用數(shù)字鑒相器" title="鑒相器">鑒相器(DPD)、數(shù)字環(huán)路濾波器(DLF)、數(shù)控振蕩器" title="數(shù)控振蕩器">數(shù)控振蕩器(DCO)構(gòu)成鎖相環(huán)路。在用Altera公司的EPF10K10TC144-3芯片設(shè)計一種無線通信實驗系統(tǒng)的FSK、DPSK、QAM調(diào)制解調(diào)器時,利用剩余的10%FPGA資源設(shè)計出了一種可編程全數(shù)字鎖相環(huán)路,它成功地為該通信實驗系統(tǒng)的調(diào)制解調(diào)器提供了64kHz、56kHz和16kHz三種精確、穩(wěn)定的時鐘信號。
1 全數(shù)字鎖相環(huán)的電路設(shè)計
1.1 DPLL工作原理分析[1]

??? 所設(shè)計的全數(shù)字鎖相環(huán)路的結(jié)構(gòu)如圖1所示。其中,數(shù)字鑒相器由異或門EXOR構(gòu)成,數(shù)字環(huán)路濾波器由變??赡嬗嫈?shù)器Q構(gòu)成,數(shù)控振蕩器由加/減脈沖控制器" title="脈沖控制器">脈沖控制器I/D和模N計數(shù)器組成??赡嬗嫈?shù)器和加/減脈沖控制器的時鐘頻率分別是Mf0和2Nf0。這里f0是環(huán)路的中心頻率,為64kHz。Mf0等于14336kHz,由晶振電路產(chǎn)生,它經(jīng)模H計數(shù)器分頻后得到2Nf0的時鐘頻率。異或門鑒相器用于比較輸入信號IN64與數(shù)控振蕩器輸出信號OUT64的相位差,其輸出信號ud作為可逆計數(shù)器的計數(shù)方向控制信號。當(dāng)ud為低電平時,可逆計數(shù)器作“加”計數(shù);反之,可逆計數(shù)器作“減”計數(shù)。當(dāng)環(huán)路鎖定時,IN64和OUT64正交,鑒相器的輸出信號ud為50%占空比的方波。在這種情況下,可逆計數(shù)器“加”與“減”的周期相同,只要可逆計數(shù)器的模值K足夠大(K>M/4),其輸出端就不會產(chǎn)生進位或借位脈沖。這時,加/減脈沖控制器只對頻率為2Nf0的時鐘進行二分頻,使IN64和OUT64的相位保持正交。在環(huán)路未鎖定的情況下,若ud為低電平時,可逆計數(shù)器進行加計數(shù),并產(chǎn)生進位脈沖作用到加/減脈沖控制器的“加”控制端INC,該控制器便在二分頻過程中加入半個時鐘周期;反之,若ud為高電平,可逆計數(shù)器進行減計數(shù),并產(chǎn)生借位脈沖作用到加/減脈沖控制器的“減”輸入端DEC,該控制器便在二分頻的過程中減去半個時鐘周期,這個過程是連續(xù)發(fā)生的。加/減脈沖控制器的輸出經(jīng)過模N計數(shù)器分頻后,得到輸出信號OUT64,它的相位不斷受到調(diào)整控制,最終達(dá)到鎖定狀態(tài)。最后只要對OUT64進行4分頻就能得到16kHz的輸出信號OUT16,對加/減脈沖控制器的輸出進行P分頻就能得到56kHz的輸出信號OUT56。

?


??? 該全數(shù)字鎖相環(huán)的三個輸出信號的頻率分別為64kHz、56kHz和16kHz,經(jīng)過計算可確定鎖相環(huán)的參數(shù)M、N和P。設(shè)H=8,因為Mf0=14336kHz=4×4×2×7×64kHz,故M=4×4×2×7=224。因為2Nf0=Mf0/H=4×4×2×7×64kHz/8=2×2×7×64kHz=2×2×8×56kHz,故N=14、P=16。
1.2 DPLL電路實現(xiàn)
1.2.1 數(shù)字鑒相器

??? 數(shù)字鑒相器由異或門構(gòu)成,并使用VHDL語言編程來實現(xiàn)。異或鑒相器比較輸入信號IN64和輸出信號OUT64之間的相位差,輸出誤差信號ud作為可逆計數(shù)器Q的計數(shù)方向信號。環(huán)路鎖定時,ud為一個占空比為50%的方波,此時的絕對相位差為90°,因此異或鑒相器相位差極限為±90°。
1.2.2 數(shù)字環(huán)路濾波器[2]
??? 數(shù)字環(huán)路濾波器由變??赡嬗嫈?shù)器Q構(gòu)成。在ud的控制下,當(dāng)j=0時,Q對時鐘Mf0進行“加”計數(shù);當(dāng)j=1時,Q對時鐘Mf0進行“減”計數(shù)??赡嬗嫈?shù)器的模數(shù)K可以通過Ka、Kb、Kc、Kd四個輸入端進行預(yù)置,當(dāng)Ka、Kb、Kc、Kd在0001~1110取值時,相應(yīng)模數(shù)的變化范圍是23~216。數(shù)字環(huán)路濾波器用VHDL語言編程實現(xiàn),其程序如下:
??? library ieee;
??? use ieee.std_logic_1164.all;
??? use ieee.std_logic_unsigned.all;
??? entity count_zj is
??? port(clk1,j,Kd,Kc,Kb,Ka,en:in std_logic;INC,DEC:out std_logic);
??? End count_zj;
??? architecture behave of count_zj is
??? signal cq,k,mo,k2,mo2,cq1:std_logic_vector(16 downto 0);
??? signal cao1,cao2,cao11,cao22,cao111,cao222:std_logic;
??? signal instruction,aa,q1,q2:std_logic_vector(3 downto 0);
??? begin
??????? instruction<=Kd & Kc & Kb & Ka;
????? ??aa<=instruction+1;
????? ??with instruction select
????? ??mo<='00000000000000111' when '0001',
???????? ???'00000000000001111' when '0010',
???????? ???'00000000000011111' when '0011',
???????? ???'00000000000111111' when '0100',
???????? ???'00000000001111111' when '0101',
???????? ???'00000000011111111' when '0110',
???????? ???'00000000111111111' when '0111',
???????? ???'00000001111111111' when '1000',
???????? ???'00000011111111111' when '1001',
???????? ???'00000111111111111' when '1010',
???????? ???'00001111111111111' when '1011',
???????? ???'00011111111111111' when '1100',
???????? ???'00111111111111111' when '1101',
???????? ???'01111111111111111' when '1110',
???????? ???'11111111111111111' when '1111',
???????? ???'00000000000000111' when others;
??? with aa select
??? mo2 < =?'00000000000000111' when '0001',
????????????'00000000000001111' when '0010',
????????????'00000000000011111' when '0011',
???????? ???'00000000000111111' when '0100',
???????? ???'00000000001111111' when '0101',
????????? ??'00000000011111111' when '0110',
???????? ???'00000000111111111' when '0111',
???????? ???'00000001111111111' when '1000',
????????????'00000011111111111' when '1001',
???????? ???'00000111111111111' when '1010',
???????? ???'00001111111111111' when '1011',
???????? ???'00011111111111111' when '1100',
???????? ???'00111111111111111' when '1101',
???????? ???'01111111111111111' when '1110',
???????? ???'11111111111111111' when '1111',
???????? ???'00000000000000111' when others;
??? process(clk1,j,mo,en)
??? ? ?begin
??????? ???if (clk1'event and clk1='1') then
???????????? k<=mo;
???????????? k2<=mo+1;
???? ?if (en='0') then
??????????????? cq<='00000000000000000';
???????????? ? ?cq1<=mo2;
?????????else
????? if (j='0') then
???????? if (cq=k) then
??????????????? cao1<='1';
????????????????cao2<='0';
??????????? ????cq<=(others=>'0');
????? ???else
??????????? ????cao1<='0';
??????????? ????cao2<='0';
????????????????cq<=cq+'1';
??????????? ????cq1<=cq1+'1';
??? ???end if;
??? elsif (j='1') then
?????? if (cq1=k2) then
????????????????cao1<='0';
??????????? ????cao2<='1';
???????????? ???cq1<=mo2;
????? ?else
??????????? ????cao1<='0';
??????????? ????cao2<='0';
??????????? ????cq<=cq-'1';
??????????? ????cq1<=cq1-'1';
???????? end if;
?????? end if;
???? end if;
???? end if;
??? end process;
??? process(clk1,cao1)
??? begin
??????? cao111<=cao11 or cao1;
??????? if(clk1'event and clk1='1') then
????????????? if (cao111='1')then
??????????????cao11<='1';
??????????? ??if (q1='1111') then
??????????? ??cao11<='0';
??????????? ??q1<='0000';
??????????? ??else
??????????????q1<=q1+'1';
??????????? ??end if;
??????????? ??end if;
??????????? ??end if;
??? end process;
??? process(clk1,cao2)
??? begin
?????? cao222<=cao22 or cao2;
?????? if(clk1'event and clk1='1') then
?????? if (cao222='1')then
??????????? ??cao22<='1';
??????????? ??if (q2='1111') then
??????????? ??cao22<='0';
??????????? ??q2<='0000';
??????????? ??else
??????????? ??q2<=q2+'1';
?????????????? ???end if;
?????????????? ???end if;
??????????? ??end if;
????? ?end process;
?????? INC<=cao111;
??? DEC<=cao222;
??? end behave;
1.2.3 數(shù)控振蕩器[3]
??? 數(shù)控振蕩器采用加/減脈沖控制器I/D和模N計數(shù)器實現(xiàn),它的輸出是一脈沖序列,周期受數(shù)字環(huán)路濾波器送來的進位或借位校正信號控制。圖2是加/減脈沖控制器硬件電路圖,該電路由四片7474芯片和一片JK觸發(fā)器以及其它一些邏輯門構(gòu)成。

?

1.3 DPLL工作性能分析[4]
??? 可逆計數(shù)器Q可看作一個模K分頻器,其輸出頻率為:
?? ?fQout=(KeΦeMf0)/K (Hz)?????????????????? (1)
式中,Φe為相位差,Ke為其系數(shù)。
??? 加/減脈沖控制器I/D的輸出頻率為:
??? fI/Dout=Nf0+(KeΦeMf0)/(2K) (Hz)?????????? (2)
??? 經(jīng)模N計數(shù)器分頻后,鎖相環(huán)路的輸出信號OUT64的頻率為:
??? fOUT64=f0+(KeΦeMf0)/(2KN) (Hz)??????????? (3)
??? 由于鎖定的極限范圍為KeΦe=±1,所以從公式(3)可以得到環(huán)路的捕捉帶:
??? Δfmax=(fOUT64)max-f0=Mf0 (2KN)? (Hz)?????? (4)
??? 上式表明,M和N確定后,變化可逆計數(shù)器Q的模K可以改變環(huán)路的捕捉帶。
??? 環(huán)路處于鎖定狀態(tài)時,環(huán)路輸出頻率fOUT64必定和輸入信號的頻率fIN64相等,但同時存在一個穩(wěn)態(tài)相位誤差。由式(3)可得:
????Φe(∞)=2KN(fIN64-f0)/(KeMf0)????????????? (5)
??? 值得注意的是,即使環(huán)路在鎖定狀態(tài)下,如果K值取得太小,則可逆計數(shù)器因頻繁的循環(huán)計數(shù)會產(chǎn)生進位或借位脈沖,從而導(dǎo)致了相位抖動,增加了同步誤差。為了減少這種相位抖動,K值必須大于M/4。但K值取得太大會延長環(huán)路鎖定時間和減小捕捉帶,因此選擇一個適當(dāng)?shù)腒值相當(dāng)重要。
2 全數(shù)字鎖相環(huán)仿真驗證與分析
2.1 鎖定時間

??? 變模可逆計數(shù)器的模數(shù)K對DPLL的鎖定時間起著關(guān)鍵的作用。圖3為K=26時DPLL的輸出仿真波形。環(huán)路達(dá)到鎖定狀態(tài)的仿真時間為371.3μs,而K=28時環(huán)路達(dá)到鎖定狀態(tài)的仿真時間為1.54ms。由此可見,模K越大,環(huán)路進入鎖定狀態(tài)的時間越長。

?


2.2 捕捉帶
??? 根據(jù)公式(4)可以得到這樣的結(jié)論:模數(shù)K越大,捕捉帶就越小。在本設(shè)計中,模數(shù)K的變化范圍是26~216,相應(yīng)捕捉帶的范圍是32kHz~85.3kHz。
2.3 同步帶
??? 在本設(shè)計中,中心頻率為64kHz。將輸入信號頻率偏移該中心頻率,恰能使DPLL鎖定的頻率范圍為同步帶。經(jīng)過測試,同步帶范圍是63.82kHz~64.1kHz。圖4顯示的是DPLL在同步帶上邊界時的鎖定波形。

?


2.4 DPLL系統(tǒng)仿真結(jié)果
??? DPLL的系統(tǒng)仿真結(jié)果如圖5所示。圖中所顯示的OUT16、OUT56、OUT64輸出信號符合設(shè)計要求。

?


??? DPLL設(shè)計的關(guān)鍵技術(shù)集中在數(shù)字環(huán)路濾波器和數(shù)控振蕩器上。數(shù)字環(huán)路濾波器可以看成模數(shù)K可預(yù)置的可逆計數(shù)器,這個可逆計數(shù)器與其它計數(shù)器最大的區(qū)別是“加”與“減”的計數(shù)值能夠相互抵消,因為只有這樣才能保證可逆計數(shù)器“加”和“減”的周期相同時,其輸出端不會產(chǎn)生進位或借位脈沖。另外,模數(shù)K的選擇非常重要,要綜合考慮捕捉時間和同步誤差相矛盾的問題。在數(shù)控振蕩器的設(shè)計中,要注意輸入的進位和借位脈沖信號周期不能太小,否則就不能對數(shù)控振蕩器起作用,必須擴大輸入的進位和借位脈沖信號的時鐘周期。本設(shè)計是將其擴大了16倍。
參考文獻
1 胡華春, 石 玉.數(shù)字鎖相環(huán)路原理與應(yīng)用.上海:上海科學(xué)技術(shù)出版社,1990
2 龐 浩.一種新型的全數(shù)字鎖相環(huán).中國電機工程學(xué)報,2003;23(2)
3 龔建榮,李曉飛.利用FPGA實現(xiàn)數(shù)字鎖相及頻率轉(zhuǎn)換.南京郵電學(xué)院學(xué)報,1998;18(4)
4 張振華, 張興周.一種用可編程邏輯器件實現(xiàn)的全數(shù)字鎖相環(huán)路.四川通信技術(shù),2000;30(6)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。