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

好久没更新了。这几天研究了DPLL提取位同步时钟的FPGA实现。DPLL和PLL一样,由鉴相器、环路滤波器和数控振荡器组成。
下面就是DPLL的基本框图。
超前-滞后型DPLL提取位同步时钟的FPGA实现_第1张图片

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

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

module	DPD(
	input					clk,
	input					rst_n,
	
	input					M_Data,//输入信号
	input					clk_Para,//本地参考信号
	
	output					bothEdge,//携带输入信号边沿信息的脉冲序列
	output	reg			sign_hou,//滞后信号
	output	reg			sign_qian//超前信号
	
);

reg				Q;
always @ (posedge clk or negedge rst_n)
begin
	if(!rst_n)
		Q <= 'd0;
	else 
		Q <= M_Data;
end
//	携带输入信号边沿的脉冲序列
assign	bothEdge = M_Data ^ Q;

always @ (posedge clk or negedge rst_n)
begin
	if(!rst_n)	begin
		sign_hou <= 'd0;
		sign_qian <= 'd0;
	end
	else 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 begin
		sign_hou <= 'd0;
		sign_qian <= 'd0;
	end
end
endmodule

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;通过这种方式一步步逼近输入信号。

module	DCO(
	input					clk,
	input					rst_n,
	
	input					carryPulse,
	input					subtractionPulse,
	input					bothEdge,
	
	output	reg			clk_Para
);

//	200K的参考时钟
parameter	C = 249;

reg		[9:0]		count_cnt;
always @ (posedge clk or negedge rst_n)
begin
	if(!rst_n)
		count_cnt <= C;
	else if(carryPulse)
		count_cnt <= count_cnt - 1'b1;
	else if(subtractionPulse)
		count_cnt <= count_cnt + 1'b1;
	else
		count_cnt <= count_cnt;
end

reg	[9:0]		count;
always @ (posedge clk or negedge rst_n)
begin
	if(!rst_n)
		count <= 'd0;
	else if(count >= count_cnt)
		count <= 'd0;
	else if(bothEdge)
		count <= 'd0;
	else 
		count <= count + 1'b1;
end




always @ (posedge clk or negedge rst_n)
begin
	if(!rst_n)
		clk_Para <= 'd1;	
	else if(count < (count_cnt >> 1))
		clk_Para <= 1'b1;
	else
		clk_Para <= 1'b0;
end
endmodule

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

超前-滞后型DPLL提取位同步时钟的FPGA实现_第2张图片


你可能感兴趣的:(FPGA)