异步信号边沿检测电路该如何实现呢?

时间:2025-09-11  作者:Diven  阅读:0

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

异步信号边沿检测电路该如何实现呢?

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

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

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

图1  用两级寄存器实现边沿检测

上图使用 block 图表示的,也可以用verilog编写出来,代码如下:

//边沿检测电路//2014/12/10Module 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; endelse 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信号,从而使得整个电路的输出进入亚稳态,进而影响下一级电路的正常工作,甚至导致整个系统崩溃!

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

图2  异步信号边沿检测

也可以用verilog编写出来,代码如下:

//异步信号边沿检测电路,三级寄存器实现//2014/12/08module 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; endelse 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),这样第二级寄存器就会采集到一个稳定的状态,从而把亚稳态限制在第二级寄存器之前,保证了整个电路输出的稳定性。

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

猜您喜欢

床垫是人们日常生活中不可少的家具,主要用于提供舒适的睡眠环境。一般而言,床垫是由多层材料构成的,通常包括弹簧、泡沫、乳胶、棉花等,旨在支撑身体,减轻压力,确保脊...
2025-05-14 00:00:00

贴片电阻R330表示阻值为33Ω的贴片电阻。字母R代表电阻,后面的数字330则采用三位数编码表示阻值。其中前两位数字33是有效数字,最后一位数字0表示在其后加0...
2024-11-29 10:26:17

纸箱作为应用的包装材料,其主要优势不容忽视。纸箱具有良好的环保性,采用可再生的纸浆材料,使用后可回收,符合现代可持续发展的需求。纸箱的轻便性使其在运输和存储过程...
2009-11-11 00:00:00

贴片电阻上的数字101代表其阻值为100kΩ。 这是一种简化的表示方法,遵循电子工业常用的三位数编码规则。前两位数字表示有效数值,第三位数字则表示10的几次方(...
2024-11-29 10:25:32

参考资料:xilinx大学计划实验平台:ZYBO开发板本次实验要做的是一个基于FPGA的简单图像处理程序, 共实现两个功能:1.输出一个灰度图像的直方图。...
2018-07-14 08:56:00

选择01A贴片电阻的阻值大小,需要根据电路的具体需求来确定,并非一概而论。01A指的是电阻的封装尺寸,表示其长宽为0.6mm x 0.3mm,与阻值本身无关。确...
2024-11-26 11:29:56

电流检测电阻作为关键的元器件,应用于电流测量、电源管理和保护电路中。选择合适的电流检测电阻品牌不仅关系到设备的性能稳定性,也直接影响产品的寿命和安全性。丽景电子...
2015-09-17 22:57:35

T类磁环是专门用于电源管理和信号处理的组件,应用于电子设备的电源转换和滤波电路中。采用高磁导率材料制成,能够有效地减少电磁干扰,提升设备的稳定性和效率。T类磁环...
2022-02-04 00:00:00

PPR热熔器是专门用于连接PPR(聚丙烯随机共聚物)管材的工具。通过加热管材和配件的接合面,使其表面融化,从而实现牢固的连接。PPR热熔器通常由加热板、温控系统...
2015-08-16 00:00:00

合金电阻作为电子元件中的重要组成部分,受到了关注。奇力新(CHILISIN)作为知名的电子元件制造商,其合金电阻凭借优良的性能和可靠的品质,在市场上赢得了良好的...
2022-09-09 18:09:04