全數字鎖相環(DPLL)的原理簡介以及verilog設計代碼


隨着數字電路技術的發展,數字鎖相環在調制解調、頻率合成、FM 立體聲解碼、彩色副載波同步、圖象處理等各個方面得到了廣泛的應用。數字鎖相環不僅吸收了數字電路可靠性高、體積小、價格低等優點,還解決了模擬鎖相環的直流零點漂移、器件飽和及易受電源和環境溫度變化等缺點,此外還具有對離散樣值的實時處理能力,已成為鎖相技術發展的方向。

所謂數字PLL,就是指應用於數字系統的PLL,也就是說數字PLL中的各個模塊都是以數字器件來實現的,是一個數字的電路。 數字鎖相環的優點是電路最簡單有效,可采用沒有壓控的晶振,降低了成本,提高了晶振的穩定性。但缺點是和模擬鎖相環一樣,一旦失去基准頻率,輸出頻率立刻跳回振盪器本身的頻率;另外還有一個缺點,就是當進行頻率調整的時候,輸出頻率會產生抖動,頻差越大,抖動會越大於密,不利於某些場合的應用。隨着大規模、超高速的數字集成電路的發展,為數字鎖相環路的研究與應用提供了廣闊空間。由於晶體振盪器和數字調整技術的加盟,可以在不降低振盪器的頻率穩定度的情況下,加大頻率的跟蹤范圍,從而提高整個環路工作的穩定性與可靠性。

鎖相環是一個相位反饋控制系統,在數字鎖相環中,由於誤差控制信號是離散的數字信號,而不是模擬電壓,因而受控的輸出電壓的改變是離散的而不是連續的;此外,環路組成部件也全用數字電路實現,故而這種鎖相環就稱之為全數字鎖相環(簡稱PLL)。全數字鎖相環主要由數字鑒相器、可逆計數器、頻率切換電路及N分頻器四部分組成。其中可逆計數器及N分頻器的時鍾由外部晶振提供。不用VCO,可大大減輕溫度及電源電壓變化對環路的影響。同時,采用在系統可編程芯片實現有利於提高系統的集成度和可靠性。

一階全數字鎖相環主要由鑒相器、K變模可逆計數器、脈沖加減電路和除N計數器四部分構成。K變模計數器和脈沖加減電路的時鍾分別為Mfc和2Nfc。這里fc是環路中心頻率,一般情況下M和N都是2的整數冪。本設計中兩個時鍾使用相同的系統時鍾信號。

當環路失鎖時,異或門鑒相器比較輸入信號(fin)和輸出信號(fout)之間的相位差異,並產生K變模可逆計數器的計數方向控制信號(dnup); K變模可逆計數器根據計數方向控制信號(dnup)調整計數值,dnup為高進行減計數,並當計數值到達0時,輸出借位脈沖信號(borrow);為低進行加計數,並當計數值達到預設的K模值時,輸出進位脈沖信號(carryo);脈沖加減電路則根據進位脈沖信號(carryo)和借位脈沖信號(borrow)在電路輸出信號(idout)中進行脈沖的增加和扣除操作,來調整輸出信號的頻率;重復上面的調整過程,當環路進入鎖定狀態時,異或門鑒相器的輸出se為一占空比50%的方波,而K變模可逆計數器則周期性地產生進位脈沖輸出carryo和借位脈沖輸出borrow,導致脈沖加減電路的輸出idout周期性的加入和扣除半個脈沖。這樣對於輸出的頻率沒有影響,也正是基於這種原理,可以把等概率出現的噪聲很容易的去掉。

全數字鎖相環的verilog源代碼,仿真已通過

module dpll(reset,clk,signal_in,signal_out,syn);

parameter para_K=4;

parameter para_N=16;

input reset;

input clk;

input signal_in;

output signal_out;

output syn;

reg signal_out;

reg dpout;

reg delclk;

reg addclk;

reg add_del_clkout;

reg [7:0]up_down_cnt;

reg [2:0]cnt8;

reg [8:0]cnt_N;

reg syn;

reg dpout_delay;

reg [8:0]cnt_dpout_high;

reg [8:0]cnt_dpout_low;

/******phase detector*****/

always@(signal_in or signal_out)

  begin

    dpout<=signal_in^signal_out;

  end

/******synchronization establish detector*****/

always@(posedge clk or negedge reset)

  begin

        if(!reset)    dpout_delay<='b0;

        else          dpout_delay<=dpout;

  end

always@(posedge clk or negedge reset)

  begin

      if(!reset)

          begin

            cnt_dpout_high<='b0; cnt_dpout_low<='b0;

          end

      else if(dpout)

                if(dpout_delay==0)  cnt_dpout_high<='b0;

                else

                    if(cnt_dpout_high==8'b11111111)  cnt_dpout_high<='b0;

                    else  cnt_dpout_high<=cnt_dpout_high+1;

      else if(!dpout)

                 if(dpout_delay==1)  cnt_dpout_low<='b0;

                 else

                     if(cnt_dpout_low==8'b11111111)  cnt_dpout_low<='b0;

                     else  cnt_dpout_low<=cnt_dpout_low+1;

   end

always@(posedge clk or negedge reset)

  begin

          if(!reset)  syn<='b0;

      else if((dpout&&!dpout_delay)||(!dpout&&dpout_delay))

           if(cnt_dpout_high[8:0]-cnt_dpout_low[8:0]<=4||cnt_dpout_low[8:0]-cnt_dpout_high[8:0]<=4)  syn<='b1;

           else  syn<='b0;

  end

/****up down couter with mod=K****/

always@(posedge clk or negedge reset)

begin

   if(!reset)

    begin

       delclk<='b0;

       addclk<='b0;

       up_down_cnt<='b00000000;

    end

   else

    begin

      if(!dpout)

       begin

        delclk<='b0;

        if(up_down_cnt==para_K-1)

          begin

            up_down_cnt<='b00000000;

            addclk<='b0;

          end

     else

        begin

           up_down_cnt<=up_down_cnt+1;

           addclk<='b0;

        end

      end

else

  begin

  addclk<='b0;

           if(up_down_cnt=='b0)

             begin

               up_down_cnt<=para_K-1;

               delclk<='b0;

             end

            else

             if(up_down_cnt==1)

               begin

                 delclk<='b1;

                 up_down_cnt<=up_down_cnt-1;

               end

             else

                 up_down_cnt<=up_down_cnt-1;

             end

          end

  end

/******add and delete clk*****/

always@(posedge clk or negedge reset)

begin

  if(!reset)

     begin

       cnt8<='b000;

     end

  else

     begin

      if(cnt8=='b111)

     begin

      cnt8<='b000;

   end

else

    if(addclk&&!syn)

       begin

         cnt8<=cnt8+2;

       end

    else

       if(delclk&&!syn)

          cnt8<=cnt8;

       else

          cnt8<=cnt8+1;

  end

end

always@(cnt8 or reset)

begin

if(!reset)

  add_del_clkout<='b0;

else

  add_del_clkout<=cnt8[2];

end

/******counter with mod=N******/

always@(posedge add_del_clkout or negedge reset)

begin

  if(!reset)

   begin

    cnt_N<='b0000;

    signal_out<='b0;

   end

else

   begin

     if(cnt_N==para_N-1)

       begin

         cnt_N<='b0000;

         signal_out<='b0;

   end

else

   if(cnt_N==(para_N-1)/2)

     begin

       signal_out<='b1;

       cnt_N<=cnt_N+1;

  end

else

      cnt_N<=cnt_N+1;

  end

end

endmodule

   DPLL由  鑒相器  模K加減計數器  脈沖加減電路  同步建立偵察電路 模N分頻器 構成.

整個系統的中心頻率(即signal_in和signal_out的碼速率的2倍)

為clk/8/N.  模K加減計數器的K值決定DPLL的精度和同步建立時間,K越大,則同步建立時間長,同步精度高.反之則短,低.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM