超前-滞后型DPLL提取位同步时钟的FPGA实现

来源:互联网 发布:优化布林线 编辑:程序博客网 时间:2024/06/07 03:24
好久没更新了。这几天研究了DPLL提取位同步时钟的FPGA实现。DPLL和PLL一样,由鉴相器、环路滤波器和数控振荡器组成。
下面就是DPLL的基本框图。

1.超前-滞后性数字鉴相器

鉴相器的功能是检测本地估量信号和输入信号sigIn的相位关系。但只提取输入信号sigIn边沿处的相位关系。所以我们先由D触发器和异或门获得携带输入信号边沿信息的脉冲序列。在输入信号sigIn边沿处,如果本地估量信号为高电平则超前信号置“1”,本地估量信号为低电平则滞后信号置“1”。

moduleDPD(inputclk,inputrst_n,inputM_Data,//输入信号inputclk_Para,//本地参考信号outputbothEdge,//携带输入信号边沿信息的脉冲序列outputregsign_hou,//滞后信号outputregsign_qian//超前信号);regQ;always @ (posedge clk or negedge rst_n)beginif(!rst_n)Q <= 'd0;else Q <= M_Data;end//携带输入信号边沿的脉冲序列assignbothEdge = M_Data ^ Q;always @ (posedge clk or negedge rst_n)beginif(!rst_n)beginsign_hou <= 'd0;sign_qian <= 'd0;endelse if(bothEdge == 1'b1 && clk_Para == 1'b0)sign_hou <= 1'b1;else if(bothEdge == 1'b1 && clk_Para == 1'b1)sign_qian <= 1'b1;else beginsign_hou <= 'd0;sign_qian <= 'd0;endendendmodule

2.环路滤波器的实现

随机噪声可能会引起DPD的相位抖动,所以通过一个Mod为8的计数器来实现滤波功能,当超前信号为1时开始加计数,逐次加到15,进位变为8,此时环路滤波器输出一个进位信号,当滞后信号为1时开始减计数,逐次减到0,借位变为8,此时环路滤波器输出一个借位信号。因为噪声抖动是无序的,除非噪声在同一方向出现8次,滤波器才会输出误动作。Mod越小,锁相速度越快,精度越低。(为在仿真的时候效果明显,这里我没有加入环路滤波器,也就是Mod为0,锁相速度最快,损失了锁相精度)

3. 数字振荡器的实现

以200KHz的时钟作为参考信号。内部的时钟信号是50MHz,需要一个200KHz的时钟周期有250个clk时钟周期,即参数C = 250,当进位信号置1时,C - 1,当借位信号置1时,C + 1;通过这种方式一步步逼近输入信号。

moduleDCO(inputclk,inputrst_n,inputcarryPulse,inputsubtractionPulse,inputbothEdge,outputregclk_Para);//200K的参考时钟parameterC = 249;reg[9:0]count_cnt;always @ (posedge clk or negedge rst_n)beginif(!rst_n)count_cnt <= C;else if(carryPulse)count_cnt <= count_cnt - 1'b1;else if(subtractionPulse)count_cnt <= count_cnt + 1'b1;elsecount_cnt <= count_cnt;endreg[9:0]count;always @ (posedge clk or negedge rst_n)beginif(!rst_n)count <= 'd0;else if(count >= count_cnt)count <= 'd0;else if(bothEdge)count <= 'd0;else count <= count + 1'b1;endalways @ (posedge clk or negedge rst_n)beginif(!rst_n)clk_Para <= 'd1;else if(count < (count_cnt >> 1))clk_Para <= 1'b1;elseclk_Para <= 1'b0;endendmodule

下面附一张烧录到板子后的提取位同步时钟信号的效果图。黄色信号是提取的位同步时钟信号,蓝色信号是输入信号。