- 相關推薦
一種可編程的全數字鎖相環(huán)路的實現
摘要:介紹了一種基于FPGA可編程技術實現的用于無線通信實驗系統的全數字鎖相環(huán)路。詳細敘述了其工作原理、工作性能、電路實現和仿真結果。關鍵詞:FPGA 全數字鎖相環(huán)路 VHDL語言
鎖相環(huán)路已在模擬和數字通信及無線電電子學等各個領域中得到了極為廣泛的應用,特別是在數字通信的調制解調和位同步中常常要用到各種各樣的鎖相環(huán)。鎖相就是利用輸入信號與輸出信號之間的相位誤差自動調節(jié)輸出相位使之與輸入相位一致,或保持一個很小的相位差。最初的鎖相環(huán)全部由模擬電路組成,隨著大規(guī)模、超高速數字集成電路的發(fā)展及計算機的普遍應用,出現了全數字鎖相環(huán)路。所謂全數字鎖相環(huán)路,就是環(huán)路部件全部數字化,采用數字鑒相器(DPD)、數字環(huán)路濾波器(DLF)、數控振蕩器(DCO)構成鎖相環(huán)路。在用Altera公司的EPFl0K10TCl44-3芯片設計一種無線通信實驗系統的FSK、DPSK、QAM調制解調器時,利用剩余的10%FPGA資源設計出了一種可編程全數字鎖相環(huán)路,它成功地為該通信實驗系統的調制解調器提供了64kHz、56kHz和16kHz三種精確、穩(wěn)定的時鐘信號。
1 全數字鎖相環(huán)的電路設計
1.1 DPLL工作原理分析
所設計的全數字鎖相環(huán)路的結構如圖1所示。其中,數字鑒相器由異或門EXOR構成,數字環(huán)路濾波器由變?赡嬗嫈灯鱍構成,數控振蕩器由加/減脈沖控制器I/D和模N計數器組成?赡嬗嫈灯骱图樱瘻p脈沖控制器的時鐘頻率分別是Mf0和2Nf0。這里f0是環(huán)路的中心頻率,為64kHz。Mf0等于14336kHz,由晶振電路產生,它經模H計數器分頻后得到2Nf0的時鐘頻率。異或門鑒相器用于比較輸入信號IN64與數控振蕩器輸出信號OUT64的相位差,其輸出信號ud作為可逆計數器的計數方向控制信號。當ud為低電平時,可逆計數器作“加”計數;反之,可逆計數器作“減”計數。當環(huán)路鎖定時,IN64和OUT64正交,鑒相器的輸出信號ud為50%占空比的方波。在這種情況下,可逆計數器“加”與“減”的周期相同,只要可逆計數器的模值K足夠大(K>M/4),其輸出端就不會產生進位或借位脈沖。這時,加/減脈沖控制器只對頻率為2Nf0的時鐘進行二分頻,使IN64和OUT64的相位保持正交。在環(huán)路未鎖定的情況下,若ud為低電平時,可逆計數器進行加計數,并產生進位脈沖作用到加/減脈沖控制器的“加”控制端INC,該控制器便在二分頻過程中加入半個時鐘周期;反之,若ud為高電平,可逆計數器進行減計數,并產生借位脈沖作用到加/減脈沖控制器的“減”輸入端DEC,該控制器便在二分頻的過程中減去半個時鐘周期,這個過程是連續(xù)發(fā)生的。加/減脈沖控制器的輸出經過模N計數器分頻后,得到輸出信號OUT64,它的相位不斷受到調整控制,最終達到鎖定狀態(tài)。最后只要對OUT64進行4分頻就能得到16kHz的輸出信號OUTl6,對加/減脈沖控制器的輸出進行P分頻就能得到56kHz的輸出信號OUT56。
圖1
該全數字鎖相環(huán)的三個輸出信號的頻率分別為64kHz、56kHz和16kHz,經過計算可確定鎖相環(huán)的參數M、N和P。設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電路實現
1.2.1 數字鑒相器
數字鑒相器由異或門構成,并使用VHDL語言編程來實現。異或鑒相器比較輸入信號IN64和輸出信號OUT64之間的相位差,輸出誤差信號ud作為可逆計數器Q的計數方向信號。環(huán)路鎖定時,ud為一個占空比為50%的方波,此時的絕對相位差為90°,因此異或鑒相器相位差極限為±90°。
圖2
1.2.2 數字環(huán)路濾波器
數字環(huán)路濾波器由變?赡嬗嫈灯鱍構成。在ud的控制下,當j=0時,Q對時鐘Mf0進行“加”計數;當j=1時,Q對時鐘Mf0進行“減”計數。可逆計數器的模數K可以通過Ka、Kb、Kc、Kd四個輸入端進行預置,當Ka、Kb、Kc、Kd在0001~1110取值時,相應模數的變化范圍是2 3~2 16。數字環(huán)路濾波器用VHDL語言編程實現,其程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity count_zj is
port(clkl,j,Kd,Kc,Kb,Ka,en:in std_logic;
INC,DEC:out std_logic);
End count_zj;
architecture behave Of eonnt_zj is
signal cq,k,mo
,k2,mo2,cql:std_logic_vector(16 downto 0);
signal caol,cao2,caoll,cao22,caolll,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”,
“0000000000000t111”when“0010”,
“000(0)0(000~11111”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
m02<=“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 othels;
process(clkl,j,mo,en)
begin
if(clkl’event and clkl=‘1’)then
k<=mo;
k2<=mo+1;
if(ell=‘0’)then
cq<=“00000000000000000”;
cql<=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’;
cql<=cql+‘1’;
end if;
elsif(j=‘1’)then
if(cql=k2)theH
cao1<=‘0’;
cao2<=‘1’;
cql<=mo2;
elSe
cao1<=‘O’;
cao2<=‘O’;
cq<=cq-‘1’;
cql<=cql-‘1’;
end if;
end if;
end if;
end if;
end process;
process(clkl,cao1)
begin
cao111<=cao11 or cao1
if(clkl’event and clkl=‘1’)then
if(cao111=‘1’)then
ca011<=‘1’;
if(q1=“1111”)then
cao11<=‘O’;
q1<=“0000”;
elSe
q1<=q1+‘1’;
end if;
end if;
end if;
end process;
process(clkl,cao2)
beSin
cao222<=cao22 or cao2;
if(clkl’event and clkl=‘1’)then
if(ca0222=‘1’)then
cao22<=‘1’;
if(q2=“1111”)then
cao22<=‘0’;
q2<=“0000”;
e1Se
q2<=q2+‘1’;
end if;
eHd if;
end if;
end process;
INC<=gao11;
DEC<=cao222;
end behave;
1.2.3 數控振蕩器
數控振蕩器采用加/減脈沖控制器I/D和模N計數器實現,它的輸出是一脈沖序列,周期受數字環(huán)路濾波器送來的進位或借位校正信號控制。圖2是加/減脈沖控制器硬件電路圖,該電路由四片7474芯片和一片JK觸發(fā)器以及其它一些邏輯門構成。
(范文先生網adivasplayground.com收集整理)
1.3 DPLL工作性能分析
可逆計數器Q可看作一個模K分頻器,其輸出頻率為:
fQout=(KeΦeMf0)/K(Hz) (1)
式中,Φe為相位差,Ke為其系數。
加/減脈沖控制器I/D的輸出頻率為:
fI/Dout=Nf0+(KeΦeMf0)/(2K)(Hz) (2)
經模N計數器分頻后,鎖相環(huán)路的輸出信號OUT64的頻率為:
fouT64=f0+(KeΦeMf0)/(2KN)(Hz) (3)
由于鎖定的極限范圍為KeΦe=±1,所以從公式(3)可以得到環(huán)路的捕捉帶:
△fmax=(ffouT64)max-f0=Mf0(2KN)(Hz) (4)
上式表明,M和N確定后,變化可逆計數器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值取得太小,則可逆計數器因頻繁的循環(huán)計數會產生進位或借位脈沖,從而導致了相位抖動,增加了同步誤差。為了減少這種相位抖動,K值必須大于M/4。但K值取得太大會延長環(huán)路鎖定時間和減小捕捉帶,因此選擇一個適當的K值相當重要。
圖4
2 全數字鎖相環(huán)仿真驗證與分析
2.1 鎖定時間
變?赡嬗嫈灯鞯哪礙對DPLL的鎖定時間起著關鍵的作用。圖3為K=2 6時DPLL的輸出仿真波形。環(huán)路達到鎖定狀態(tài)的仿真時間為371.3μs,而K=2 8時環(huán)路達到鎖定狀態(tài)的仿真時間為1.54ms。由此可見,模K越大,環(huán)路進入鎖定狀態(tài)的時間越長。
2.2 捕捉帶
根據公式(4)可以得到這樣的結論:模數K越大,捕捉帶就越小。在本設計中,模數K的變化范圍是2 6~2 16,相應捕捉帶的范圍是32kHz~85.3kHz。
2.3 同步帶
在本設計中,中心頻率為64kHz。將輸入信號頻率偏移該中心頻率,恰能使DPLL鎖定的頻率范圍為同步帶。經過測試,同步帶范圍是63.82kHz~64.1kHz。圖4顯示的是DPLL在同步帶上邊界時的鎖定波形。
2.4 DPLL系統仿真結果
DPLL的系統仿真結果如圖5所示。圖中所顯示的OUTl6、OUT56、OUT64輸出信號符合設計要求。
DPLL設計的關鍵技術集中在數字環(huán)路濾波器和數控振蕩器上。數字環(huán)路濾波器可以看成模數K可預置的可逆計數器,這個可逆計數器與其它計數器最大的區(qū)別是“加”與“減”的計數值能夠相互抵消,因為只有這樣才能保證可逆計數器“加”和“減”的周期相同時,其輸出端不會產生進位或借位脈沖。另外,模數K的選擇非常重要,要綜合考慮捕捉時間和同步誤差相矛盾的問題。在數控振蕩器的設計中,要注意輸入的進位和借位脈沖信號周期不能太小,否則就不能對數控振蕩器起作用,必須擴大輸入的進位和借位脈沖信號的時鐘周期。本設計是將其擴大了16倍。
【一種可編程的全數字鎖相環(huán)路的實現】相關文章:
一種簡易數字波形存儲器的實現08-06
一種數字語音通信系統的DSP實現08-06
一種全同步數字頻率測量方法的研究08-06
鍵控技術的數字實現與發(fā)展08-06
新型數字化可編程頻率合成器08-06
在系統可編程通用數字開關ispGDS14的原理及應用08-06
數字頻率合成器的FPGA實現08-06
一種Flyback軟開關實現方法08-06