FPGA学习-边沿检测技术

原文作者:FPGA设计论坛 

        所谓边沿检测,就是检测输入信号即上升沿或者下降沿的检测。边沿检测的电路很好实现:上一时刻为低电平,而当前时刻为高电平,此时就为上升沿;上一时刻为高电平,而当前时刻为低电平,此时就为上升沿。

        通过边沿采样技术实现上升沿捕获进而实现外部信号的上升沿触发。

边沿检测电路的实现方法

always @ (posedge signal)

        FPGA不便于处理此类触发信号,除非外部输入信号作为全局时钟使用。另外众所周知由于电路不能能避免抖动现象,所以用这个检测方法是明显不合理的。

一级D触发器实现; 我们先看下代码

module shizhong

(

    input               clk,

    input               rst_n,

    input               spi_cs,     

    output   mcu_write_done 

);

reg spi_cs_r0;      

always@(posedge clk or negedge rst_n)

begin

    if(!rst_n)

        begin

        spi_cs_r0 <= 1; 

        end

    else

        begin

        spi_cs_r0 <= spi_cs;        

        end

end



assign  mcu_write_done = (~spi_cs_r0 & spi_cs) ? 1'b1 : 1'b0;  //posedge



endmodule 

        代码综合后RTL视图如下:

正常工作,没有复位的情况下,工作流程如下:

(1)D触发器经过时钟clk的触发,输出spi_cs信号,保存了t0时刻的信号。

(2)同时由spi_cs直接输出到与门,保留了当前时刻t1的触发信号

(3)经过与门输出信号pos_edge,neg_edge

a) 只有t0时刻为高,且t1时候为低的时候,与门输出高,此时为下降沿。

b) 只有to时候为低,且t1时候为高的时候,与门输出高,此时为上升沿。

        一级D触发器在寄存器比较时,前一时刻通过D触发器已经统一到FPGA的时钟域,而当前时刻直接从外部输入,与FPGA整体逻辑电路不在同一时钟域,为提高系统的稳定性我们可以采用第三种方法即二级D触发器。

二级D触发器;我们仍然先看代码

module shizhong

(

    input               clk,

    input               rst_n,

    input               spi_cs, 

    output   mcu_write_done 

);

reg spi_cs_r0,      spi_cs_r1;      

always@(posedge clk or negedge rst_n)

begin

    if(!rst_n)

        begin

            spi_cs_r0 <= 1; spi_cs_r1 <= 1;

        end

    else

        begin

            spi_cs_r0 <= spi_cs; spi_cs_r1 <= spi_cs_r0;

        end

end



assign  mcu_write_done = (~spi_cs_r1 & spi_cs_r0) ? 1'b1 : 1'b0;



endmodule 

        代码综合后RTL视图如下:

        正常工作,没有复位的情况下,工作流程如下:

(1)一级D触发器经过时钟clk的触发,输出当前spi_cs信号,保存了t0时刻的信号。送往与门。

(2)二级D触发器经过时钟clk的触发,输出上一时刻spi_cs信号,保存了t1时刻的信号。通过非们送往与门。

(3)经过与门输出信号pos_edge,neg_edge

a) 只有t0时刻为高,且t1时候为低的时候,与门输出高,此时为下降沿。

b) 只有to时候为低,且t1时候为高的时候,与门输出高,此时为上升沿。

        利用CLK打两拍,实现了上一时刻信号和本时刻信号和FPGA整体逻辑电路统一到同一时钟域。

        这里要加两级的触发器的另一个原因,因触发器跳转产生滞后信号只能在时钟的上升沿,而被检测信号tigger并不一定是在一级触发器跳转的时钟上升沿到来,这样一级触发器所产生的滞后信号与tigger相差就达不到一个CLK周期,所以产生的脉冲信号就小于一个CLK周期了,不利于后面电路对其的应用。

边沿检测应用

(1)将时钟边沿使能转换为边沿检测使能,使时钟同步化。

(2)捕获信号的突变(UART,SPI等信号使能突变)

(3)逻辑分析仪中信号的边沿检测。

实现指标及存在缺陷:

(1)增大CLK信号可以增强边沿检测的效率,但不能滤去跳变的杂波。

(2)减少CLK可以有效滤去跳变的杂波,但不能及时检测到边沿跳变。

(3)增加DFF能更好的滤除杂波,寄存信号,但同时检测延时大。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值