全数字锁相环(PLL)的原理简介以及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*****/

[email protected](signal_in or signal_out)

  begin

    dpout<=signal_in^signal_out;

  end

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

[email protected](posedge clk or negedge reset)

  begin

        if(!reset)    dpout_delay<=‘b0;

        else          dpout_delay<=dpout;

  end

[email protected](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

[email protected](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****/

[email protected](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*****/

[email protected](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

[email protected](cnt8 or reset)

begin

if(!reset)

  add_del_clkout<=‘b0;

else

  add_del_clkout<=cnt8[2];

end

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

[email protected](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越大,则同步建立时间长,同步精度高.反之则短,低.

时间: 2024-10-14 10:27:40

全数字锁相环(PLL)的原理简介以及verilog设计代码的相关文章

锁相环倍频工作原理个人粗略理解

以s3c2440 clock & power management为例,2440一般可以使用外部晶振或者外部时钟作为时钟源,通过OM[3:2]来配置.外部晶振一般选用12MHZ,而2440如果工作在这个频率显然大材小用,2440正常工作频率可达400MHZ,显然从12MHZ到400MHZ需要倍频,2440通过锁相环单元来实现倍频. 上面这个框图中,PFD,PUMP,Loop Filter,VCO共同组成了锁相环. PFD(鉴相器):将2路输入Fref,Fvco的相位差转变为对应的控制信号输出.

数字锁相环Octave仿真

clc; clear all; % 仿真数据长度 SimLens = 1000; % 载波信号 Fs = 2400; Ts = 1 / Fs; Fsig = 60; % 随机初相 Delta_Phase = rand(1)*2*pi; SignalMod = exp(-1i*(Fsig/Fs * (1: SimLens) + Delta_Phase)); % 锁相环处理过程 Signal_PLL = zeros(SimLens, 1); NCO_Phase = zeros(SimLens, 1)

锁相环倍频原理简要分析

以前学STM32的时候就知道了倍频这个概念.开发板上外接8M晶振,但是STM32主频却能跑72M,这离不开锁相环(PLL)的作用.之后在使用FPGA的时候,直接有PLL这个IP核提供给我们使用,实现自己想要的频率.但是当我们使用的时候,锁相环倍频的原理我们清楚吗?下面就来简要分析下倍频的原理. 首先,我们需要了解下锁相环的组成.锁相环是由一个鉴相器(PD).低通滤波器(LPF)和压控振荡器(VCO)组成.结构图如下: PLL需要有一个参考频率fi.输出频率为fo,参考频率与输出频率同时送入鉴相器

simulink pi的方法产生锁相环

pi方法就是比例积分方法,关于pi方法介绍参考http://www.elecfans.com/dianzichangshi/20120909287851.html 锁相环pi方法原理参考http://wenku.baidu.com/view/86b9586fa76e58fafab003b7.html 关于系数的确定方法参考http://wenku.baidu.com/view/029d23425a8102d277a22f69.html 这次设计遇到了点麻烦,原因就在于从double型往定点型数据

FPGA的PLL锁相环

PLL实际上是一负反馈系统,其作用是使得电路上的时钟和某一外部时钟的相位同步 pll锁相环有三部分组成: 鉴相器PD.环路滤波器LF和压控振荡器VCO 原理: 利用外部输入的参考信号控制环路内部振荡信号的频率和相位. PD,的作用是检测输入信号和输出信号的相位差 LF,将转换后的电压进行滤波形成控制电压. 倍频: 基准.N倍谐波.锁相. 外接晶振时钟是参照! 压控振荡器VCO产生所需要的频率! 概括 一种输出一定频率信号的振荡电路,也称为相位同步环(回路).该回路利用使外部施加的基准信号与 PL

全数字(IP)楼宇对讲系统简介

*************************************************************************************************************************** 作者:EasyWave                                                             时间:2014.08.03 类别:Linux应用-全数字(IP)楼宇对讲系统简介             

DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/article/details/43221829 本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参考本文第一部分的算法简介. 经详细注释的代码:放在我的gith

晶振、时钟信号、锁相环、分频器

作者:Andrew Huang[email protected] 驱动数字电路运转是的时钟信号,时序电路都需要一个外部时钟信号来驱动,完成计时,同步,计数,时序控制等各种功能.象CPU也是用时序信号驱动来完成各种运算的,而且象ARM带的模块绝大部分与时序都有关,因此理解时钟信号对于底层编程非常重要. 一.时钟信号的源头---------晶振---------------------------------------------------------------------------- 数字

【转】浏览器的渲染原理简介

How Browsers Work 这篇文章把浏览器的很多细节讲的很细,也有中文的翻译版本,现在转载的这篇是陈皓写的,目的的为了能在上班途中,或是坐马桶时就能读完,并能从中学会一些能用在工作上的东西. 浏览器工作大流程 先看个图 从图中,可以看到: 1) 浏览器会解析三个东西 * 一个 HTML/SVG/XHTML,事实上,Webkit 有三个C++的类对应这三类文档.解析这三种文件会产生一个DOM Tree * CSS,解析CSS会产生CSS规则树 * JavaScript 脚本,主要是通过