边沿检测电路

边沿检测电路小结

    所谓边沿检测(又叫沿提取),就是检测输入信号的上升沿下降沿在设计数字系统时,边沿检测是一种很重要的思想,实际编程时用的最多的时序电路应该就是边沿检测电路和分频电路了。

    那么,边沿检测电路该如何实现呢?

    我们知道,在always块的敏感信号列表中可以直接用posedgenegedge来提取上升沿和下降沿,但是如果要在always程序块的内部检测上升沿或者下降沿呢?还是用poesedge和negedge吗?显然是不可以的,因为这样的语句不可综合,我在Quartus II中尝试了,编译时提示 ”multiple event control statements not supported for synthesis !“,意思就是不可综合。实际上,posedge和negedge只能用在always块的敏感信号列表中或者testbench中,所以我们还是通过其他的办法来实现吧。

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

//边沿检测电路
//2014/12/10
module edge_cap
(
    input clk, rst_n,
    input pulse,
    
    output pos_edge,
    output neg_edge
    
);
reg pulse_r1, pulse_r2;

always @ (posedge clk or negedge rst_n)
if(!rst_n) 
    begin
    pulse_r1 <= 1'b0;
    pulse_r2 <= 1'b0;
    end
else 
    begin
    pulse_r1 <= pulse;
    pulse_r2 <= pulse_r1;
    end
    
assign pos_edge = (pulse_r1 && ~pulse_r2) ?1:0;
assign neg_edge = (~pulse_r1 && pulse_r2) ?1:0; 

endmodule

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

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

在这里插入图片描述

//异步信号边沿检测电路,三级寄存器实现
//2014/12/08

module edge_cap
(
    input clk, rst_n,
    input pulse,
    
    output pos_edge,
    output neg_edge
    
);
reg pulse_r1, pulse_r2, pulse_r3;

always @ (posedge clk or negedge rst_n)
if(!rst_n) 
    begin
    pulse_r1 <= 1'b0;
    pulse_r2 <= 1'b0;
    pulse_r3 <= 1'b0;
    end
else 
    begin
    pulse_r1 <= pulse;
    pulse_r2 <= pulse_r1;
    pulse_r3 <= pulse_r2;
    end
    
assign pos_edge = (pulse_r2 && ~pulse_r3) ?1:0;
assign neg_edge = (~pulse_r2 && pulse_r3) ?1:0; 


endmodule

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

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

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

在FPGA中,边沿检测电路主要用于检测信号的上升沿或下降沿,并给相应的指示信号。边沿检测电路的实现方法有多种,其中一种方法是通过寄存器和逻辑门的组合来实现。具体步骤如下: 1. 首先,将需要检测边沿的信号延迟一拍,得到延迟后的信号。 2. 然后,将延迟后的信号与原始信号进行逻辑运算,以检测上升沿或下降沿。例如,对于上升沿检测电路,可以使用逻辑与门将延迟后的信号与原始信号的取反进行逻辑与运算。 3. 最后,将逻辑与门的输作为边沿检测电路的输信号。 这样,当输入信号发生上升沿或下降沿时,边沿检测电路将给相应的信号指示。 需要注意的是,在实际应用中,为了确保稳定性,可以采用多级寄存器来实现边沿检测电路。例如,使用两级或三级寄存器来锁存结果,以避免亚稳态的影响。通过多级寄存器的组合,可以提高电路的稳定性和可靠性。 总结起来,FPGA边沿检测电路可以通过延迟信号、逻辑运算和寄存器的组合来实现。这样的电路能够检测输入信号的上升沿或下降沿,并给相应的指示信号。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [FPGA基础设计(—):边沿检测电路](https://blog.csdn.net/weixin_47421560/article/details/123011273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值