《數(shù)字系統(tǒng)設(shè)計》課程設(shè)計報告 -數(shù)字鎖相環(huán)_第1頁
《數(shù)字系統(tǒng)設(shè)計》課程設(shè)計報告 -數(shù)字鎖相環(huán)_第2頁
《數(shù)字系統(tǒng)設(shè)計》課程設(shè)計報告 -數(shù)字鎖相環(huán)_第3頁
《數(shù)字系統(tǒng)設(shè)計》課程設(shè)計報告 -數(shù)字鎖相環(huán)_第4頁
《數(shù)字系統(tǒng)設(shè)計》課程設(shè)計報告 -數(shù)字鎖相環(huán)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

《數(shù)字系統(tǒng)設(shè)計》課程設(shè)計報告題目:數(shù)字鎖相環(huán)課程名稱:數(shù)字系統(tǒng)設(shè)計目錄一、數(shù)字鎖相環(huán)的主要功能 1二、系統(tǒng)結(jié)構(gòu)與模塊劃分 1三、各個模塊的設(shè)計與仿真分析 21、鑒相器的設(shè)計與仿真分析(by廖蘭根) 22、模K計數(shù)器的設(shè)計與仿真分析(by鐘志偉) 43、加減脈沖計數(shù)器的設(shè)計與仿真分析(by廖蘭根) 74、信號頻率比較器的設(shè)計與仿真分析(by廖蘭根) 105、可控分頻器的設(shè)計與仿真分析(by鐘志偉) 126、附:除二函數(shù)的定義與調(diào)用(by廖蘭根) 15四、系統(tǒng)仿真分析(by包金龍、王渝) 16五、VHDL完整代碼 21數(shù)字鎖相環(huán)的主要功能數(shù)字鎖相環(huán)簡稱DPLL,是一種相位反饋控制系統(tǒng)。數(shù)字鎖相環(huán)路(DPLL)主要由鑒相器(DPD)、數(shù)字環(huán)路濾波器(DLF)、脈沖加減電路(數(shù)控振蕩器DCO)、信號頻率比較器和分頻器(DFD)五部分構(gòu)成。系統(tǒng)總時鐘為fclk,輸入一個參考信號fin(fclk應(yīng)為fin的2N倍),恢復(fù)的輸出信號為fout。系統(tǒng)通過鑒相器(DPD),求得輸入信號fin與恢復(fù)的輸出信號fout之間的相位誤差(超前還是滯后),通過數(shù)字環(huán)路濾波器(模K計數(shù)器DLF)將其轉(zhuǎn)換成加減脈沖,并通過加減脈沖電路(數(shù)控振蕩器DCO),對輸入時鐘進(jìn)行加減脈沖相應(yīng)的增加或刪減。最后,分頻器(DFD)將加減脈沖電路處理過的時鐘進(jìn)行N分頻,即可得到與參考信號有90度相位差的恢復(fù)輸出時鐘信號。通過連續(xù)不斷的反饋調(diào)節(jié),輸出信號fout的相位將持續(xù)跟蹤輸入信號fin的相位。二、系統(tǒng)結(jié)構(gòu)與模塊劃分 根據(jù)上述鎖相環(huán)的功能,所設(shè)計的數(shù)字鎖相環(huán)的系統(tǒng)結(jié)構(gòu)如圖1所示。圖1數(shù)字鎖相環(huán)的系統(tǒng)結(jié)構(gòu)圖中各個IO端口的功能表如下:端口方向(I/O)功能pllTopClkI外接高頻時鐘源輸入端口pllTopFinaI參考信號輸入端口pllTopFinbI反饋信號輸入端口pllTopModeI模K計數(shù)器的模的大?。ㄈ唬﹑llTopRstI復(fù)位信號,低電平復(fù)位pllTopFoutO恢復(fù)信號輸出端口三、各個模塊的設(shè)計與仿真分析 數(shù)字鎖相環(huán)劃分為五大模塊:鑒相器模塊、模K計數(shù)器模塊、加減脈沖計數(shù)器模塊、信號頻率比較器模塊、可控分頻器。1、鑒相器的設(shè)計與仿真分析(by王渝)A)功能概述:常用的鑒相器有兩種,異或門(XOR)鑒相器和邊沿控制鑒相器(ECPD)。我們采用異或門鑒相器,它輸出參考時鐘和恢復(fù)時鐘的相位誤差。如果恢復(fù)時鐘超前/滯后于參考時鐘時,則其輸出pllXorOut輸出為高電平,反之pllXorOut輸出為低電平。B)程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpll_xorISPORT( pllXorInA,pllXorInB : IN STD_LOGIC; --pllXorInA和 pllXorInB分別用 --于參考信號輸入和恢復(fù)信號反饋 --輸入 pllXorOut : OUTSTD_LOGIC --pllXorOut為信號的相位差);ENDENTITY;ARCHITECTUREbehOFpll_xorIS BEGIN PROCESS(pllXorInA,pllXorInB) BEGIN pllXorOut<=pllXorInAxorpllXorInB; ENDPROCESS; ENDARCHITECTURE;C)硬件資源消耗:D)仿真波形: E)分析:pllXorInA,pllXorInB均是周期為1us的方波,pllXorOut為鑒相器的輸出結(jié)果。波形圖一中,pllXorInBpllXorInA同相(相位偏移0o),此時輸出為低電平。波形圖二中,pllXorInB相對pllXorInA有0.25us(相位偏移90o),此時輸出為周期等于0.5us的方波。波形圖三中,pllXorInBpllXorInA反相(相位偏移180o),此時輸出為高電平。從波形圖可看出,pllXorInB超前或滯后pllXorInA時,pllXorOut均為高電平。且輸出為與其相位差相關(guān)的方波。綜上所述,仿真波形與理論預(yù)期完全相符,證明程序符合設(shè)計要求。2、模K計數(shù)器的設(shè)計與仿真分析(by鐘志偉)A)功能概述:數(shù)字環(huán)路濾波器(DLF)作用是消除鑒相器輸出的相位差信號PE中的高頻成分,保證環(huán)路的性能穩(wěn)定,用一變??赡嬗嫈?shù)器(設(shè)模數(shù)為K)來實(shí)現(xiàn)。K變模可逆計數(shù)器根據(jù)相差信號PE來進(jìn)行加減運(yùn)算。當(dāng)PE為高電平時,計數(shù)器進(jìn)行加運(yùn)算,如果相加的結(jié)果達(dá)到預(yù)設(shè)的模值,則輸出一個進(jìn)位脈沖信號DP給脈沖加減電路;當(dāng)PE為低電平時,計數(shù)器進(jìn)行減運(yùn)算,如果結(jié)果為零,則輸出一個借位脈沖信號DP給脈沖加減電路。當(dāng)Fout同步于Fin或只有隨機(jī)干擾脈沖時,計數(shù)器加減的數(shù)目基本相等,計數(shù)結(jié)果在初始值處上下徘徊,不會產(chǎn)生進(jìn)位和借位脈沖,濾除因隨機(jī)噪聲引起的相位抖動。計數(shù)器根據(jù)輸出結(jié)果生成控制DCO動作的控制指令。B)程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYpll_kcounterIS PORT( pllKcounterClock,pllKcounterRst,pllKcounterEn,pllKcounterMode :IN STD_LOGIC; pllKcounterKMode :IN STD_LOGIC_VECTOR(2DOWNTO0); pllKcounterCarry,pllKcounterBorrow :OUTSTD_LOGIC );ENDENTITY;ARCHITECTUREbhvOFpll_kcounterIS SIGNAL kMax,kCount:STD_LOGIC_VECTOR(7DOWNTO0); BEGIN Mode:PROCESS(pllKcounterKMode) BEGIN CASEpllKcounterKModeIS WHEN"001" => kMax<="00000011"; WHEN"010" => kMax<="00000111"; WHEN"011" => kMax<="00001111"; WHEN"100" => kMax<="00011111"; WHEN"101" => kMax<="00111111"; WHEN"110" => kMax<="01111111"; WHEN"111" => kMax<="11111111"; WHENOTHERS => kMax<="00000011"; ENDCASE; ENDPROCESS; Count:PROCESS(pllKcounterClock,pllKcounterRst,pllKcounterEn,pllKcounterMode,kCount) BEGIN IFpllKcounterRst='0' THENkCount<=(OTHERS=>'0'); ELSIFpllKcounterClock'EVENTANDpllKcounterClock='1' THEN IF pllKcounterEn='1' THEN IFpllKcounterMode='1' THEN pllKcounterBorrow<='0'; IFkCount=kMax THENkCount<=(OTHERS=>'0');pllKcounterCarry<='1'; ELSEkCount<=kCount+1;pllKcounterCarry<='0'; ENDIF; ELSIFpllKcounterMode='0' THEN pllKcounterCarry<='0'; IFkCount=0 THENkCount<=kMax;pllKcounterBorrow<='1'; ELSEkCount<=kCount-1;pllKcounterBorrow<='0'; ENDIF; ENDIF; ENDIF; ENDIF; ENDPROCESS; ENDARCHITECTURE;硬件資源消耗:D)仿真波形:E)分析:1、pllKcounterClock,pllKcounterRst,pllKcounterEn,pllKcounterMode,pllKcounterKMode分別為時鐘輸入、復(fù)位信號、使能信號、加/減計數(shù)模式、模的大小輸入。pllKcounterCarry,pllKcounterBorrow分別為進(jìn)位和借位脈沖信號輸出。2、當(dāng)使能信號pllKcounterEn和復(fù)位信號pllKcounterRst為高電平時,模塊工作。3、pllKcounterKMode等于1,模的大小為4。pllKcounterMode為低電平時,模塊進(jìn)行減計數(shù),計數(shù)信號kcount根據(jù)時鐘輸入從3減到0。pllKcounterMode為高電平時,模塊進(jìn)行加計數(shù),計數(shù)信號kcount根據(jù)時鐘輸入從0加到3。4、當(dāng)計數(shù)信號計數(shù)信號kcount進(jìn)行加計數(shù),且由3變?yōu)?,即發(fā)生進(jìn)位時,pllKcounterCarry產(chǎn)生一個時鐘周期的脈沖。當(dāng)計數(shù)信號計數(shù)信號kcount進(jìn)行減計數(shù),且由0變?yōu)?,即發(fā)生借位時,pllKcounterBorrow產(chǎn)生一個時鐘周期的脈沖。綜上所述,仿真波形與理論預(yù)期完全相符,證明程序符合設(shè)計要求。加減脈沖計數(shù)器的設(shè)計與仿真分析(by廖蘭根)A)功能概述:DCO的具體結(jié)構(gòu)形式有多種,常用的有加減脈沖計數(shù)器DCO和除N計數(shù)式DCO,我們選取了加減脈沖計數(shù)器DCO。在沒有進(jìn)位脈沖或借位脈沖輸入時,加減脈沖計數(shù)器對固定頻率高速時鐘進(jìn)行除二分頻;若有一個借位脈沖,在加減脈沖計數(shù)器的借位脈沖輸出端出現(xiàn),并不管它在何時出現(xiàn),加減脈沖計數(shù)器的內(nèi)部邏輯就在高速時鐘進(jìn)行二分頻的過程中延遲一個時鐘周期。反之,無論什么時候,在加減脈沖計數(shù)器的進(jìn)位脈沖輸入端出現(xiàn)進(jìn)位脈沖,加減脈沖計數(shù)器在二分頻過程中就插入一個時鐘周期。B)程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpll_idcountIS PORT( pllIdCountClock,pllIdCountRST,pllIdCountInc,pllIdCountDec : INSTD_LOGIC; pllIdCountOut : OUTSTD_LOGIC );ENDENTITY;ARCHITECTUREbhvOFpll_idcount IS SIGNALinc_new,dec_new,inc_pulse,dec_pulse,delay,advance,tff:STD_LOGIC; BEGIN PROCESS(pllIdCountClock,pllIdCountInc,pllIdCountDec) BEGIN IFpllIdCountClock'EVENTANDpllIdCountClock='1' THEN IF pllIdCountInc='0' THENinc_new<='1';inc_pulse<='0'; ELSIF inc_pulse='1' THENinc_new<='0';inc_pulse<='0'; ELSIF pllIdCountInc='1'ANDinc_new='1' THENinc_new<='0';inc_pulse<='1'; ELSE inc_new<='0';inc_pulse<='0'; ENDIF; ENDIF; ENDPROCESS; PROCESS(pllIdCountClock,pllIdCountDec) BEGIN IFpllIdCountClock'EVENTANDpllIdCountClock='1' THEN IF pllIdCountDec='0' THENdec_new<='1';dec_pulse<='0'; ELSIF dec_pulse='1' THENdec_new<='0';dec_pulse<='0'; ELSIF pllIdCountDec='1'ANDdec_new='1' THENdec_new<='0';dec_pulse<='1'; ELSE dec_new<='0';dec_pulse<='0'; ENDIF; ENDIF; ENDPROCESS; PROCESS(pllIdCountClock,pllIdCountRST,pllIdCountInc,pllIdCountDec) BEGIN IFpllIdCountClock'EVENTANDpllIdCountClock='1' THEN IF pllIdCountRST='0' THENtff<='0';delay<='1';advance<='1'; ELSIF inc_pulse='1' THENadvance<='1';tff<=NOTTff; ELSIF dec_pulse='1' THENdelay<='1';tff<=NOTTff; ELSIF TFF='0' THEN IFadvance='0' THENtff<=NOTtff; ELSIFadvance='1' THENtff<=tff;advance<='0'; ENDIF; ELSE IF delay='0' THENtff<=NOTtff; ELSIFdelay='1' THENtff<=Tff;delay<='0'; ENDIF; ENDIF; ENDIF; ENDPROCESS; PROCESS(pllIdCountClock,tff) BEGIN IFtff='1' THEN pllIdCountOut<='0'; ELSIFpllIdCountClock='1' THEN pllIdCountOut<='0'; ELSEpllIdCountOut<='1'; ENDIF; ENDPROCESS; ENDARCHITECTURE;C硬件資源消耗:D)仿真波形:E)分析:pllIdCountClock,pllIdCountRST,pllIdCountInc,pllIdCountDec分別為時鐘輸入、復(fù)位信號輸入、進(jìn)位脈沖輸入、借位脈沖輸入。pllIdCountOut為加減脈沖輸出。在復(fù)位信號pllIdCountRST為高電平時,模塊工作。若pllIdCountInc和pllIdCountDec均無脈沖時,加減脈沖輸出pllIdCountOut為輸入時鐘信號pllIdCountClock的二分頻。若pllIdCountInc為高電平時,加減脈沖輸出pllIdCountOut在下一個時鐘周期添加了一個脈沖。若pllIdCountDec為高電平時,加減脈沖輸出pllIdCountOut在下一個時鐘周期延遲了延遲了一個周期。綜上所述,仿真波形與理論預(yù)期完全相符,證明程序符合設(shè)計要求。4、信號頻率比較器的設(shè)計與仿真分析(by廖蘭根)A)功能概述:總時鐘信號頻率為參考信號頻率的2N倍,由于加減脈沖計數(shù)器本身具有二分頻功能,因此將加減脈沖計數(shù)器的輸出進(jìn)行N分頻即可得到恢復(fù)輸出信號。但是分頻系數(shù)N需要根據(jù)信號輸入進(jìn)行手動調(diào)節(jié),很不方便。因此,我們設(shè)計該模塊用于計算時鐘信號與參考信號之間的分頻系數(shù)N。 B)程序源碼:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYpll_count_nIS PORT( pllCountNClk,pllCountNIn,pllCountNRst : INSTD_LOGIC; pllCountNOUT : OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDENTITY;ARCHITECTUREbhvOFpll_count_nIS SIGNALcnt : STD_LOGIC_VECTOR(7DOWNTO0); SIGNALcnt_clr,cnt_en : STD_LOGIC; BEGIN PROCESS(pllCountNIn) BEGIN IFpllCountNIn'EVENTANDpllCountNIn='1' THEN IFpllCountNRst='0' THENcnt_en<='0'; ELSEcnt_en<=NOTcnt_en; ENDIF; ENDIF; ENDPROCESS; cnt_clr<=NOT((NOTpllCountNIn)ANDcnt_en); PROCESS(pllCountNClk,cnt_clr) BEGIN IFpllCountNClk'EVENTANDpllCountNClk='0' THEN IFcnt_clr='0' THENcnt<=(OTHERS=>'0'); ELSIFcnt_en='1' THEN IFcnt=255 THENcnt<=(OTHERS=>'0'); ELSEcnt<=cnt+1; ENDIF;ENDIF; ENDIF; ENDPROCESS; PROCESS(cnt_clr) BEGIN IFcnt_clr'EVENTANDcnt_clr='0' THENpllCountNOUT<=cnt; ENDIF; ENDPROCESS;ENDARCHITECTURE;C)硬件資源消耗:D)仿真波形:E)分析:a)pllCountNClk,pllCountNIn,pllCountNRst分別為時鐘信號輸入、參考信號輸入、復(fù)位信號輸入,pllCountNOUT為pllCountNClk與pllCountNIn的比值的一半,即N。b)當(dāng)復(fù)位信號pllCountNRst為高電平時,模塊工作。c)pllCountNClk為周期10ns的時鐘信號,pllCountNIn為參考信號。由波形圖可知,在pllCountNIn達(dá)到一個周期時,pllCountNOUT將系數(shù)N返還。綜上所述,仿真波形與理論預(yù)期完全相符,證明程序符合設(shè)計要求。5、可控分頻器的設(shè)計與仿真分析(by鐘志偉)A)功能概述:得到加減脈沖計數(shù)輸出后,需要對其進(jìn)行N分頻獲得恢復(fù)信號。我們設(shè)計了一個可以自動計算分頻系數(shù)N的模塊,因此,我們還需要一個可以控制分頻系數(shù)的分頻器對加減脈沖計數(shù)輸出進(jìn)行N分頻。 B)程序源碼:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;LIBRARYWORK;USEWORK.PLL_FUNC.ALL;ENTITYpll_divnIS PORT( pllDivNIn,pllDivNRst : IN STD_LOGIC; pllDivN : IN STD_LOGIC_VECTOR(7DOWNTO0); pllDivNOut : OUT STD_LOGIC );ENDENTITY;ARCHITECTUREbhvOFpll_divnIS SIGNALcount,max : STD_LOGIC_VECTOR(7DOWNTO0); SIGNALq : STD_LOGIC; BEGIN PROCESS(pllDivN) BEGIN IFpllDivN<2 THENmax<="00010000"; ELSEmax<=pllDivN; ENDIF; ENDPROCESS; PROCESS(pllDivNIn,pllDivNRst) BEGIN IFpllDivNRst='0' THENq<='0';count<=(OTHERS=>'0'); ELSIFpllDivNIn'EVENTANDpllDivNIn='1' THEN IFcount=DIV2(max)-1 THENq<=NOTq;count<=(OTHERS=>'0'); ELSEcount<=count+1; ENDIF; ENDIF; ENDPROCESS; pllDivNOut<=q;ENDARCHITECTURE;C)硬件資源消耗:D)仿真波形:E)分析:a)pllDivNIn,pllDivNRst,pllDivN分別為信號輸入、復(fù)位信號輸入,信號分頻系數(shù)輸入。pllDivNOut為模塊的分頻輸出。b)當(dāng)復(fù)位信號pllDivNRst為高電平時,模塊工作。c)由波形圖可看到,當(dāng)分頻系數(shù)pllDivN為2時,輸出信號的周期為輸入信號周期的兩倍,即實(shí)現(xiàn)了二分頻。當(dāng)分頻系數(shù)pllDivN為4時,輸出信號的周期為輸入信號周期的四倍,即實(shí)現(xiàn)了四分頻。d)特殊地,我們對分頻系數(shù)小于2的情況,默認(rèn)分頻情況為16分頻.綜上所述,仿真波形與理論預(yù)期完全相符,證明程序符合設(shè)計要求。6、除二函數(shù)的定義與調(diào)用(by廖蘭根)功能概述:在以上的可控系數(shù)分頻器和信號頻率比較器中都要使用到STD_LOGIC_VECTOR的除二運(yùn)算,但STD_LOGIC_VECTOR不能使用除法。因此我們將其封裝為一個函數(shù),將其命名為DIV2,放在目錄quartus\libraries\vhdl\work下實(shí)現(xiàn)函數(shù)調(diào)用。程序源碼:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;PACKAGEpll_funcIS FUNCTIONDIV2(VECTOR_IN:STD_LOGIC_VECTOR) RETURNSTD_LOGIC_VECTOR;END;PACKAGEBODYpll_funcIS FUNCTIONDIV2(VECTOR_IN:STD_LOGIC_VECTOR) RETURNSTD_LOGIC_VECTOR IS VARIABLERESULT:STD_LOGIC_VECTOR(VECTOR_IN'RANGE); BEGIN RESULT(6DOWNTO0):=VECTOR_IN(7DOWNTO1); RESULT(7):='0'; RETURNRESULT; ENDFUNCTION;END;四、系統(tǒng)仿真分析(by包金龍、王渝) 將各模塊的程序作修改并整合在一起,編譯后進(jìn)行時序仿真并分析仿真波形圖。頂層程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpll_topIS PORT( pllTopClk,pllTopFina,pllTopFinb,pllTopRst : INSTD_LOGIC; pllTopMode : INSTD_LOGIC_VECTOR(2DOWNTO0); pllTopFout : OUTSTD_LOGIC );ENDENTITY;ARCHITECTUREbhvOFpll_topIS COMPONENTpll_xor PORT( pllXorInA,pllXorInB : IN STD_LOGIC; pllXorOut : OUTSTD_LOGIC ); ENDCOMPONENT; COMPONENTpll_kcounter PORT( pllKcounterClock,pllKcounterRst,pllKcounterEn,pllKcounterMode : IN STD_LOGIC; pllKcounterKMode : IN STD_LOGIC_VECTOR(2DOWNTO0); pllKcounterCarry,pllKcounterBorrow : OUT STD_LOGIC ); ENDCOMPONENT; COMPONENTpll_idcountIS PORT( pllIdCountClock,pllIdCountRST,pllIdCountInc,pllIdCountDec : INSTD_LOGIC; pllIdCountOut : OUTSTD_LOGIC ); ENDCOMPONENT; COMPONENTpll_divnIS PORT( pllDivNIn,pllDivNRst : IN STD_LOGIC; pllDivN : IN STD_LOGIC_VECTOR(7DOWNTO0); pllDivNOut : OUT STD_LOGIC ); ENDCOMPONENT; COMPONENTpll_count_nIS PORT( pllCountNClk,pllCountNIn,pllCountNRst : INSTD_LOGIC; pllCountNOUT : OUTSTD_LOGIC_VECTOR(7DOWNTO0) ); ENDCOMPONENT; SIGNALpllTopFout1,pllTopXorOut,pllTopKcounterCarry,pllTopKcounterBorrow,pllTopIdCountOut : STD_LOGIC; SIGNALpllTopCountNOUT : STD_LOGIC_vector(7DOWNTO0); BEGIN u1:pll_xor PORTMAP( pllXorInA => pllTopFina, pllXorInB => pllTopFout1, pllXorOut => pllTopXorOut); u2:pll_kcounter PORTMAP( pllKcounterClock => pllTopClk, pllKcounterRst => pllTopRst, pllKcounterEn => '1', pllKcounterMode => pllTopXorOut, pllKcounterKMode => pllTopMode, pllKcounterCarry => pllTopKcounterCarry, pllKcounterBorrow => pllTopKcounterBorrow ); u3:pll_idcount PORTMAP( pllIdCountClock => pllTopClk, pllIdCountRST => pllTopRst, pllIdCountInc => pllTopKcounterCarry, pllIdCountDec => pllTopKcounterBorrow, pllIdCountOut => pllTopIdCountOut ); u4:pll_count_n portmap( pllCountNClk => pllTopClk, pllCountNIn => pllTopFina, pllCountNRst => pllTopRst, pllCountNOUT => pllTopCountNOUT ); u5:pll_divn portmap( pllDivNIn => pllTopIdCountOut, pllDivNRst => pllTopRst, pllDivN => pllTopCountNOUT, pllDivNOut => pllTopFout1 ); pllTopFout<=pllTopFout1;ENDARCHITECTURE;硬件資源消耗:3、波形圖:分析:時鐘信號周期為100ns,參考信號周期為3200ns=3.2us,即2N=32。模K計數(shù)器輸入為2,即進(jìn)行模8運(yùn)算。鎖相環(huán)約在18us時與參考信號保持90度相位差,并維持穩(wěn)定。時鐘信號周期為50ns,參考信號周期為3200ns=3.2us,即2N=64。模K計數(shù)器輸入為2,即進(jìn)行模8運(yùn)算。頻率比較器在初始狀態(tài)下輸出為0,則分頻器進(jìn)行默認(rèn)的16分頻輸出。故輸出信號在開始時只有參考信號周期的一半。在參考信號達(dá)到一個周期時,頻率比較器得出時鐘信號與參考信號的分頻系數(shù)N=32,鎖相環(huán)正式開始跟隨參考信號。并在月20us時與參考信號保持了90度相位差并保持穩(wěn)定跟隨。在上一個波形圖的基礎(chǔ)上,將模K計數(shù)器的模選項改為4,即進(jìn)行模32計數(shù)。鎖相環(huán)約在40us才與參考信號保持90度相位差,保持相位穩(wěn)定。因此,模K計數(shù)器的選取會影響到鎖相環(huán)的跟隨速度。當(dāng)K比較小時,鎖相環(huán)能快速捕捉并跟隨參考信號。當(dāng)K比較大時,鎖相環(huán)需要花費(fèi)較多時間對信號進(jìn)行捕捉。五、VHDL完整代碼--鑒相器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpll_xorISPORT( pllXorInA,pllXorInB : IN STD_LOGIC; --pllXorInA和 pllXorInB分別用 --于參考信號輸入和恢復(fù)信號反饋 --輸入 pllXorOut : OUTSTD_LOGIC --pllXorOut為信號的相位差);ENDENTITY;ARCHITECTUREbehOFpll_xorIS BEGIN PROCESS(pllXorInA,pllXorInB) BEGIN pllXorOut<=pllXorInAxorpllXorInB; ENDPROCESS; ENDARCHITECTURE;--模K計數(shù)器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYpll_kcounterIS PORT(--pllKcounterClock,pllKcounterRst,pllKcounterEn,pllKcounterMode,pllKcounterKMode分別為時鐘輸入、復(fù)位信 --號、使能信號、加/減計數(shù)模式、模的大小輸入。 pllKcounterClock,pllKcounterRst,pllKcounterEn,pllKcounterMode :IN STD_LOGIC; pllKcounterKMode :IN STD_LOGIC_VECTOR(2DOWNTO0);--pllKcounterCarry,pllKcounterBorrow分別為進(jìn)位和借位脈沖信號輸出。 pllKcounterCarry,pllKcounterBorrow :OUTSTD_LOGIC );ENDENTITY;ARCHITECTUREbhvOFpll_kcounterIS SIGNAL kMax,kCount:STD_LOGIC_VECTOR(7DOWNTO0); BEGIN--Mode進(jìn)程用于根據(jù)pllKcounterKMode的大小決定計數(shù)器的模的大小。最小為4,最大為256 Mode:PROCESS(pllKcounterKMode) BEGIN CASEpllKcounterKModeIS WHEN"001" => kMax<="00000011"; WHEN"010" => kMax<="00000111"; WHEN"011" => kMax<="00001111"; WHEN"100" => kMax<="00011111"; WHEN"101" => kMax<="00111111"; WHEN"110" => kMax<="01111111"; WHEN"111" => kMax<="11111111"; WHENOTHERS => kMax<="00000011"; ENDCASE; ENDPROCESS; --Count進(jìn)程用于計數(shù),當(dāng)pllKcounterKMode為高電平時加計數(shù),反之為減計數(shù),并且pllKcounterCarry和--pllKcounterBorrow會產(chǎn)生對應(yīng)的進(jìn)位和借位脈沖 Count:PROCESS(pllKcounterClock,pllKcounterRst,pllKcounterEn,pllKcounterMode,kCount) BEGIN IFpllKcounterRst='0' THENkCount<=(OTHERS=>'0'); ELSIFpllKcounterClock'EVENTANDpllKcounterClock='1' THEN IF pllKcounterEn='1' THEN IFpllKcounterMode='1' THEN pllKcounterBorrow<='0'; IFkCount=kMax THENkCount<=(OTHERS=>'0');pllKcounterCarry<='1'; ELSEkCount<=kCount+1;pllKcounterCarry<='0'; ENDIF; ELSIFpllKcounterMode='0' THEN pllKcounterCarry<='0'; IFkCount=0 THENkCount<=kMax;pllKcounterBorrow<='1'; ELSEkCount<=kCount-1;pllKcounterBorrow<='0'; ENDIF; ENDIF; ENDIF; ENDIF; ENDPROCESS; ENDARCHITECTURE;--加減脈沖計數(shù)器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpll_idcountIS PORT(--pllIdCountClock,pllIdCountRST,pllIdCountInc,pllIdCountDec分別為時鐘輸入、復(fù)位信號輸入、進(jìn)位脈沖輸入、 --借位脈沖輸入。 pllIdCountClock,pllIdCountRST,pllIdCountInc,pllIdCountDec : INSTD_LOGIC--pllIdCountOut為加減脈沖輸出。; pllIdCountOut : OUTSTD_LOGIC );ENDENTITY;ARCHITECTUREbhvOFpll_idcount IS SIGNALinc_new,dec_new,inc_pulse,dec_pulse,delay,advance,tff:STD_LOGIC; BEGIN--該進(jìn)程用于產(chǎn)生加或減脈沖的標(biāo)志 PROCESS(pllIdCountClock,pllIdCountInc,pllIdCountDec) BEGIN IFpllIdCountClock'EVENTANDpllIdCountClock='1' THEN IF pllIdCountInc='0' THENinc_new<='1';inc_pulse<='0'; ELSIF inc_pulse='1' THENinc_new<='0';inc_pulse<='0'; ELSIF pllIdCountInc='1'ANDinc_new='1' THENinc_new<='0';inc_pulse<='1'; ELSE inc_new<='0';inc_pulse<='0'; ENDIF; ENDIF; ENDPROCESS;--該進(jìn)程用于產(chǎn)生加或減脈沖的標(biāo)志 PROCESS(pllIdCountClock,pllIdCountDec) BEGIN IFpllIdCountClock'EVENTANDpllIdCountClock='1' THEN IF pllIdCountDec='0' THENdec_new<='1';dec_pulse<='0'; ELSIF dec_pulse='1' THENdec_new<='0';dec_pulse<='0'; ELSIF pllIdCountDec='1'ANDdec_new='1' THENdec_new<='0';dec_pulse<='1'; ELSE dec_new<='0';dec_pulse<='0'; ENDIF; ENDIF; ENDPROCESS; --該進(jìn)程用于對脈沖進(jìn)行加減脈沖處理 PROCESS(pllIdCountClock,pllIdCountRST,pllIdCountInc,pllIdCountDec) BEGIN IFpllIdCountClock'EVENTANDpllIdCountClock='1' THEN IF pllIdCountRST='0' THENtff<='0';delay<='1';advance<='1'; ELSIF inc_pulse='1' THENadvance<='1';tff<=NOTTff; ELSIF dec_pulse='1' THENdelay<='1';tff<=NOTTff; ELSIF TFF='0' THEN IFadvance='0' THENtff<=NOTtff; ELSIFadvance='1' THENtff<=tff;advance<='0'; ENDIF; ELSE IF delay='0' THENtff<=NOTtff; ELSIFdelay='1' THENtff<=Tff;delay<='0'; ENDIF; ENDIF; ENDIF; ENDPROCESS; PROCESS(pllIdCountClock,tff) BEGIN IFtff='1' THEN pllIdCountOut<='0'; ELSIFpllIdCountClock='1' THEN pllIdCountOut<='0'; ELSEpllIdCountOut<='1'; ENDIF; ENDPROCESS; ENDARCHITECTURE;--信號頻率比較器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;--pllCountNClk,pllCountNIn,pllCountNRst分別為時鐘信號輸入、參考信號輸入、復(fù)位信號輸入,pllCountNOUT為pllCountNClk與pllCountNIn的比值的一半,即N。ENTITYpll_count_nIS PORT( pllCountNClk,pllCountNIn,pllCountNRst : INSTD_LOGIC; pllCountNOUT : OUTSTD_LOGIC_VECTOR(7DOWNTO0) );ENDENTITY;ARCHITECTUREbhvOFpll_count_nIS SIGNALcnt : STD_LOGIC_VECTOR(7DOWNTO0); SIGNALcnt_clr,cnt_en : STD_LOGIC; BEGIN--該進(jìn)程用于判斷開始計數(shù)的條件 PROCESS(pllCountNIn) BEGIN IFpllCountNIn'EVENTANDpllCountNIn='1' THEN IFpllCountNRst='0' THENcnt_en<='0'; ELSEcnt_en<=NOTcnt_en; ENDIF; ENDIF; ENDPROCESS; --cnt_clr用于標(biāo)志是否要對計數(shù)清零以及讀數(shù) cnt_clr<=NOT((NOTpllCountNIn)ANDcnt_en); --該進(jìn)程用于根據(jù)時鐘信號對輸入信號進(jìn)行周期性計數(shù) PROCESS(pllCountNClk,cnt_clr) BEGIN IFpllCountNClk'EVENTANDpllCountNClk='0' THEN IFcnt_clr='0' THENcnt<=(OTHERS=>'0'); ELSIFcnt_en='1' THEN IFcnt=255 THENcnt<=(OTHERS=>'0'); ELSEcnt<=cnt+1; ENDIF;ENDIF; ENDIF; ENDPROCESS; PROCESS(cnt_clr) BEGIN IFcnt_clr'EVENTANDcnt_clr='0' THENpllCountNOUT<=cnt; ENDIF; ENDPROCESS;ENDARCHITECTURE;--可控系數(shù)分頻器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;--pllDivNIn,pllDivNRst,pllDivN分別為信號輸入、復(fù)位信號輸入,信號分頻系數(shù)輸入。pllDivNOut為模塊的分頻輸出。ENTITYpll_divnIS PORT( pllDivNIn,pllDivNRst : IN STD_LOGIC; pllDivN : IN STD_LOGIC_VECTOR(7DOWNTO0); pllDivNOut : OUT STD_LOGIC );ENDENTITY;ARCHITECTUREbhvOFpll_divnIS SIGNALcount,max : STD_LOGIC_VECTOR(7DOWNTO0); SIGNALq : STD_LOGIC; BEGIN--如果分頻系數(shù)小于2,則將分頻系數(shù)設(shè)為默認(rèn)的16分頻 PROCESS(pllDivN) BEGIN IFpllDivN<2 THENmax<="00010000"; ELSEmax<=pllDivN; ENDIF; ENDPROCESS; --該進(jìn)程用于對信號進(jìn)行分頻PROCESS(pllDivNIn,pllDivNRst) BEGIN IFpllDivNRst='0' THENq<='0';count<=(OTHERS=>'0'); ELSIFpllDivNIn'EVENTANDpllDivNIn='1' THEN IFcount=CONV_INTEGER(max)/2-1 THENq<=NOTq;count<=(OTHERS=>'0'); ELSEcount<=count+1; ENDIF; ENDIF; ENDPROCESS; pllDivNOut<=q;ENDARCHITECTURE;--頂層程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpll_topIS PORT( pllTopClk,pllTopFina,pllTopFinb,pllTopRst : INSTD_LOGIC; pllTopMode : INSTD_LOGIC_VECTOR(2DOWNTO0); pllTopFout : OUTSTD_LOGIC );ENDENTITY;ARCHITECTUREbhvOFpll_topIS COMPONENTpll_xor PORT( p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論