如何捕获一个宽度很窄的脉冲信号
这里面涉及到高频脉冲的捕获,就是把输入脉冲整形,有点难度啊,可以用原理图或VHDL或别的语言描述设计
非常感谢大家,
pulse_a = pulse ;
reg pulse_change ;
always @ (posedge pulse_a or negedge rst)
if(!rst)
pulse_change = 1'b0 ;
else
pulse_change = ~pulse_change ;
reg [2:0] pulse_sync ;
always @(posedge clk or negedge rst)
if(!rst)
pulse_sync [2 :0] =3'b0 ;
else
pulse_sync[2:0] = {pulse_sync[1:0],pulse_change} ;
reg output_clk ;
always @(posedge clk or negedge rst )
if(!rst)
output_clk <= 1'b0 ;
else if (pulse_sync[2] != pulse_sync[1] )
output_clk <= 1'b1 ;
else
output_clk <= 1'b0 ;
在pulse 到pulse_a之间需要插入一个buffer。另外这个程序参考下把,不知道对不对。
这位朋友,为什么你编代码没注释?看得辛苦
always @ ( posedge p_clk or negedge p_reset_n )
if ( ~ p_reset_n )
p_buf <= 0;
else
if ( p_en )
p_buf <= ~ c_buf;
always @ ( posedge c_clk or negedge c_reset_n )
if ( ~ c_reset_n )
c_buf <= 0;
else
if ( c_en )
c_buf <= p_buf;
assign flag = p_buf ^ c_buf;
chenyueboy是用寄存器将输入脉冲转换成电平变化输出,如果2次相邻脉冲间隔足够大,输出的电平变化是可以达到时钟的采集要求,然后去检测输出电平的上长升沿(pulse_sync[2] != pulse_sync[1]),实际我觉得应该是检测pulse_sync的变化沿(每个电平变化对应一个脉冲沿)。
但如果2次相邻脉冲不是足够大,输出电平还是达不到时间采集(寄存)的要求,这种方法 我觉得可能不行。
我觉得,信号能够输入到FPGA,本身就是要求达到器件的setup\hold时间,如果可以达到,那FPGA内部处理实际上是可以使用异步FIFO来达到检测脉冲个数,然后只要使用时钟去读异步FIFO,就达到了将脉冲转换成时间周期输出的要求。这样,只要脉冲信号能够输出到FPGA,那不管有多窄,都可以不漏的检测出来(当然是在异步FIFO不满的情况下)。
不知道脉冲多宽,可以用倍频后的时钟去采集吗?
如果你只需要脉冲的个数,我觉得6楼说得有道理,可以将该脉冲作为fifo的写时钟,写使能一直有效。后面只需要写入的个数就行了。
5楼朋友的程序什么意思?哪个是输入信号?什么检测原理,另外脉冲就一个,目的只是想把这个宽度很窄的脉冲整形成宽度为一个时钟周期的脉冲,不是要检测脉冲个数
路过学习了
用fifo是个不错的方法,不会引入很高的时钟。
亲们可能误解本题意思了,不是要计算脉冲个数,而是属于脉冲整形,就一个脉冲,并且脉冲宽度比较窄而且具体多窄是不确定的,该脉冲发出后是一个周期宽度完整的脉冲,但是经过一段较长的导线后输入到FPGA就衰减了,导致脉冲宽度变窄,边沿也不陡峭了,所以想把这个脉冲进行整形, 整形成一个宽度为一个时钟周期的脉冲,不计数啊亲们,注意这个脉冲宽度可能比半个时钟周期还要短,但是会达到器件的setup\hold时间。
将要检测的信号接p_clk,有上升沿时flag会被置位,表示检测到脉冲;c_clk脉冲将flag清零,以便检测下一个脉冲。你可以把flag用c_clk打一拍,这样就输出宽度为1cycle的脉冲了。
用高时钟去采,采到了,你给多宽的脉冲都行
process(sys_clk,sys_rst,flag)
begin
if(sys_rst= '1') then
qout <= '0';
elsif(sys_clk'event and sys_clk = '1') then
flag1 <= flag;
flag2 <= flag1;
qout <= flag2 xor flag1;
end if;
end process;
process(sig_in,sys_rst)
begin
if(sys_rst = '1') then
flag <= '0';
elsif(sig_in'event and sig_in = '1') then、
flag <= ~ flag;
end if;
end process;
就是当外部信号(sig_in)进来时,flag信号取反,然后在系统时钟作用下找出flag变化,发出一个sys_clk脉宽的信号。实时性会比较好。
15楼的朋友的程序应该是符合要求的,这个其实是一个很实用的电路,多谢各位朋友的相助,
