如何用FPGA捕捉低频脉冲信号
现在FPGA经过PLL倍频出来的信号也就250Mhz,老板说可以四个不同相位的信号来捕捉这个信号,phase delay刚好是1ns。
现在比较头大,因为以前没做过,而且是用actel的器件,我也不是太熟,不知道从何入手,想请高人指点一二了。
期待大神出现
我的理解是这样的;你这个PLL输出的时钟周期是4ns,用四个相位的话各个时钟之间的相位延迟恰好是1ns。可以满足精度是1ns的需求。
使用两时钟,一个PLL直接输出clk1,一个PLL偏移90度输出clk2,这两时钟属于同一个输入时钟的派生时钟,算同源。
使用clk1将输入的脉冲以双沿打两拍,sig1_d1, sig1_d2,采到脉冲上升沿时取sig1_d2,下降沿时取sig_d1, 输出为sig1_out
使用clk2将输入的脉冲以双沿打两拍,sig2_d1, sig2_d2,不管上升下降沿都取sig2_d2,得到sig2_out
然后输出信号将两信号取或output = sig1_out | sig2_out
说明:以同一个时钟上下沿取数,这样就可以将四个信号减少一半为两信号,最后的输出只能为组合逻辑,不能为寄存器输出。这两信号比较时,其中快的信号先从0变1时,就是要选择的输出信号的上升开始;快的信号由1变0时,就是输出信号的下降开始,这样直接&或|都不方便操作,所以我将sig1_out的下降时刻提前半个周期,然后再作|操作就可以了。
先谢谢楼上的回复了。
你的意思是不是这样的:
input sig //待测低频信号
always @ (posedge clk1)
begin
sig1_d1 <= sig;
sig1_d2 <= sig1_d1;
if (sig1 == 1'b1 && sig_d2 == 1'b2) //pos edge
sig1_out<=sig1_d2;
else if(sig1 == 1'b0 && sig_d2 == 1'b1) //neg edge
sig1_out<=sig1_d1;
end
always @ (posedge clk2)
begin
sig2_d1 <= sig;
sig2_d2 <= sig2_d1;
sig2_out<=sig_d2;
end
assign output = sig1_out | sig2_out;
output就是待测信号由0变1的信号;问题是这个output还不是我需要的输出。
我想输出的信号是脉冲宽度和相位都可编程的信号,这个sig信号相当于是个触发信号,输出信号要求精度1ns.
请教一下,我可以用这个output信号,再用系统的时钟信号来计数已达到相位和脉冲宽度可调的目的吗?
