【FPGA - 基础知识(三)】边沿检测

边沿检测电路

要实现边沿检测,最直接的想法是用两级寄存器,第二级寄存器锁存住某个时钟上升沿到来时的输入电平,第一级寄存器锁存住下一个时钟沿到来时的输入电平,如果这两个寄存器锁存住的电平信号不同,就说明检测到了边沿,具体是上升沿还是下降沿可以通过组合逻辑来实现。如下图所示:

边沿检测

Verilog HDL 代码如下:

module edge_detect
(
    input  i_clk,
    input  i_rst,
    input  i_pulse,
    output o_posedge_detect, 
    output o_negedge_detect
);

reg s_pulse_d1; 
reg s_pulse_d2; 

 
always@(posedge i_clk or posedge i_rst)
begin
    if(i_rst)
    begin
        s_pulse_d1 <= 1'b0;
        s_pulse_d2 <= 1'b0;
    end
    else
    begin
        s_pulse_d1 <= i_pulse   ;
        s_pulse_d2 <= s_pulse_d1;
    end
end

assign o_posedge_detect= (s_pulse_d1 && ~s_pulse_d2 ) ? 1 : 0;
assign o_negedge_detect= (s_pulse_d2 && ~s_pulse_d1 ) ? 1 : 0;

endmodule

乍一看,这个电路似乎很简单地实现了边沿检测的功能,但是仔细分析就可以发现这种方法存在一个潜在的风险:当待测信号pulse是一个异步信号时,输出可能是亚稳态,如果pulse信号的变化刚好发生在clk时钟的建立时间和保持时间之内,那么第一级寄存器的输出 pulse_r1 就会进入亚稳态,而pulse_r1的亚稳态会立即传递给pos_edge和neg_edge信号,从而使得整个电路的输出进入亚稳态,进而影响下一级电路的正常工作,甚至导致整个系统崩溃!

因此,在进行异步信号边沿提取时,不能直接使用上面的这种电路,而应该先将异步信号同步化,一般采用多加一级寄存器的方法来减小亚稳态的发生概率,如下图所示:

边沿检测1

Verilog HDL 代码如下:

module edge_detect
(
    input  i_clk,
    input  i_rst,
    input  i_pulse,
    output o_posedge_detect, 
    output o_negedge_detect
);

reg s_pulse_d1; 
reg s_pulse_d2; 
reg s_pulse_d3;
 
always@(posedge i_clk or posedge i_rst)
begin
    if(i_rst)
    begin
        s_pulse_d1 <= 1'b0;
        s_pulse_d2 <= 1'b0;
        s_pulse_d3 <= 1'b0;
    end
    else
    begin
        s_pulse_d1 <= i_pulse   ;
        s_pulse_d2 <= s_pulse_d1;
        s_pulse_d3 <= s_pulse_d2;   
    end
end

assign o_posedge_detect= (s_pulse_d2 && ~s_pulse_d3 ) ? 1 : 0;
assign o_negedge_detect= (s_pulse_d3 && ~s_pulse_d2 ) ? 1 : 0;

endmodule

仿真图如下:

经过这样的同步处理后, 可以大大减小电路进入亚稳态的概率,如果第一级寄存器进入了亚稳态,一般也会在一个clk周期内稳定下来(可能稳定为0也可能稳定为1),如下图所示:

异步信号检测

图中pulse信号的改变刚好发生在 clk 的建立时间和保持时间之内,因而第一级寄存器的输出pulse_r1可能会进入亚稳态,图中Tco为第一级寄存器pulse_r1的状态建立时间(即clock to output),一般情况下,亚稳态的决断时间(即从进入亚稳态到稳定下来的时间)不会超过一个时钟周期,因此在下一个clk上升沿到来之前,pulse_r1已经稳定下来(可能稳定到0也可能稳定到1),这样第二级寄存器就会采集到一个稳定的状态,从而把亚稳态限制在第二级寄存器之前,保证了整个电路输出的稳定性。

综上所述,在异步信号边沿检测电路中,至少需要采用三级寄存器来实现,在对系统稳定性要求较高的数字系统中,可以采用更多级的寄存器来减小亚稳态发生概率,提高系统稳定性。

参考文章:

[1]《边沿检测电路小结》2014-12 MioTech  https://www.cnblogs.com/xiaoxie2014/p/4157835.html

[2]《【Verilog HDL 训练】第 06 天(边沿检测) 》Reborn Lee  2019-04 https://blog.csdn.net/Reborn_Lee/article/details/89669193

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值