《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 業界動態 > 一種可編程的全數字鎖相環路的實現

一種可編程的全數字鎖相環路的實現

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

??? 摘 要: 介紹了一種基于FPGA可編程技術實現的用于無線通信實驗系統的全數字" title="全數字">全數字鎖相環路" title="鎖相環路">鎖相環路。詳細敘述了其工作原理、工作性能、電路實現和仿真結果。
??? 關鍵詞:? FPGA? 全數字鎖相環路? VHDL語言

?

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

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

?


??? 該全數字鎖相環的三個輸出信號的頻率分別為64kHz、56kHz和16kHz,經過計算可確定鎖相環的參數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的計數方向信號。環路鎖定時,ud為一個占空比為50%的方波,此時的絕對相位差為90°,因此異或鑒相器相位差極限為±90°。
1.2.2 數字環路濾波器[2]
??? 數字環路濾波器由變模可逆計數器Q構成。在ud的控制下,當j=0時,Q對時鐘Mf0進行“加”計數;當j=1時,Q對時鐘Mf0進行“減”計數。可逆計數器的模數K可以通過Ka、Kb、Kc、Kd四個輸入端進行預置,當Ka、Kb、Kc、Kd在0001~1110取值時,相應模數的變化范圍是23~216。數字環路濾波器用VHDL語言編程實現,其程序如下:
??? 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 數控振蕩器[3]
??? 數控振蕩器采用加/減脈沖控制器I/D和模N計數器實現,它的輸出是一脈沖序列,周期受數字環路濾波器送來的進位或借位校正信號控制。圖2是加/減脈沖控制器硬件電路圖,該電路由四片7474芯片和一片JK觸發器以及其它一些邏輯門構成。

?

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

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

?


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

?


2.4 DPLL系統仿真結果
??? DPLL的系統仿真結果如圖5所示。圖中所顯示的OUT16、OUT56、OUT64輸出信號符合設計要求。

?


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

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 成人精品视频一区二区三区 | 精品国产免费第一区二区 | 成网站在线观看人免费 | 激情九月婷婷 | 玖玖99视频 | 精品综合久久久久久97超人该 | 欧美成人性生活视频 | 久久精品国产亚洲高清 | 久久久久久国产精品免费 | 国产精品免费播放 | 免费二级毛片免费完整视频 | 美女色水一级 | 男人的天堂社区 | 第四色网页 | 国产天堂在线观看 | 欧美国产日韩在线观看 | 亚洲综合激情六月婷婷在线观看 | 久久精品国产亚洲高清 | 日韩欧美视频一区 | 激情亚洲 | 久久精品a一国产成人免费网站 | 久久精品国产在热久久2019 | 国产一区二区三区四卡 | 国产精品视频国产永久视频 | 2020久久国产最新免费观看 | 免费人成年短视频在线观看免费网站 | 蜜爱在线观看 | 成人午夜一区二区三区视频 | 日本高清不卡免费 | 四虎精品永久在线 | 国产人成精品免费视频 | 色综合久久中文 | 天天干人人干 | 国产一级视频 | 国产精品深夜福利免费观看 | 国产美女精品在线 | 日本不卡中文字幕 | 六月天综合网 | 欧美日韩国产高清视频 | 辘轳女人和井电视剧全集播放 | 女生宿舍2在线播放 |