发布时间:2008-09-18阅读:1497
有关数字锁相环的帖子不断出现,但大多没有讲述其原理。翻开有关锁相环的书总是堆叠着鉴相、同相积分、中相积分、滤波等专用名词。这些概念距离硬件设计实现数字锁相环较远。本文按照数字锁相环设计的步骤,采用手把手的方式讲述设计过程和原理,旨在给数字锁相环初次设计者提供一个思路,缩短开发的时间。附件是用VHDL语言设计的20分频数字锁相环。
Div20PLL Port(
clock : in std_logic; --80M local clk
flow : in std_logic; --4M data flow
clkout : out std_logic --4M CLK
);
其中clkout是所提取的数据时钟。clock是本地时钟,其频率是数据流flow速率的20倍。若数据流flow速率为4M则clock选用80M,若 flow为1M则选取clock为20M,依次类推。此附件基本按照下文提到的步骤设计,并已经在产品中应用的。
专用名词约定:
一个比特: 数据流flow由一个比特接一个比特组成,文中提到的一个比特均指flow中的一个比特。
域: 一个比特的时间从开始到结束可以划分为5个时间片段,依次为
§前失锁§超前§同步§滞后§后失锁§
这五个片段称作五个域,其中前失锁和后失锁统称为失锁域。
分频比R: 本地时钟记做clock,从flow中提取的时钟记做lowclk,clock与lowclk的频率比记做R。
smp: 指用clock提取的lowclk上升沿(参见“上升沿与下降沿触发小论”,需要注意一点的是,lowclk是与clock同步的信号,所以只需延时一次提取)。
脉冲: 如不特殊指明,是指'1'值保持一个clock周期的信号,无效时值为'0'。
设计总思路:
数字锁相环完成的功能就是利用clock从flow中提取lowclk,并且使smp保持在同步域。lowclk由clock经R分频得到,并且 lowclk的相位是可以动态调整的以达到锁相的目的。当smp落在同步域时,认定为锁相环已经同步,保持分频的状态不变。当smp落在失锁域时认定为失锁,则强行置下一个smp到同步域的中间位置。当smp落在超前域时,则推迟下一个smp的到来一个节拍。当smp落在滞后域时,则提前一个节拍使下一个 smp到来。
设计步骤:
根据设计参数要求合理选取R值,通常R不小于8,本文选取R = 20讲解。以后文中用到20均指R,而提到10则指R/2。
确定5个域的宽度,本例选取5个域等宽。由于R = 20,所以一个比特的宽度为20,那么每个域的宽度均为4。失锁域是前失锁域和后失锁域的统称,所以失锁域宽8。
设计一个计数器cnt,cnt供10(R/2)个状态,记做s0到s9,cnt从s0到s9循环变化。cnt有三个同步控制脉冲load、inc和 dec,load使cnt装入s7,inc使cnt跳过下一个状态(假如在s8时有inc,则cnt从s8直接跳到s0而不再经过s9),dec使cnt 继续保持当前状态不变。
时钟lowclk的状态受到cnt的状态和load信号的同步控制,load使lowclk置'1'值,s9使lowclk翻转。两个特殊情况是由于 cnt受到inc和dec的控制而使cnt的状态会跳过s9或重复出现s9,即会出现...s7s8s0s1...或... s7s8s9s9s0s1...这两种情况。对于第一种情况lowclk在s8后的s0翻转,而第二种情况仅在第一个s9处翻转。
用clock提取flow的跳变沿saltus。
用saltus产生一个宽度为16的信号pulse,pulse在saltus处及接下来的15个clock中期内保持为'1'值,其余情况为'0'。在pulse为'1'期间有一个计数器position在计数,显然position的值为0到15。
用clock提取pulse的下降沿cmp。
定义一个与position相同类型的信号phase。phase在pulse为'0'时值为0,在pulse为'1'且smp为'1'时装入position的值,其他情况phase保持值不变化。
在cmp处观察phase的值。若为0到3则产生一个失锁脉冲loss,若为4到7则产生一个超前脉冲lead,若为8到11则产生一个同步脉冲syn,若为12到15则产生一个滞后脉冲lag。这些脉冲的位置均在cmp。
若loss累积3次且这3次中间没有出现过syn,则产生一个装载脉冲load。按照相同的方法用lead产生一个dec信号,用lag信号产生一个inc信号。
上一篇:印制电路板设计要求