边沿检测原理及其实现(双边、同步、异步)

一、边沿检测原理

1、边检测原理(同步)

上升沿就是从0到1变化的过程,而同步边沿检测就是使用一个基准时钟,来检测另外一个信号的上升沿。这种检测方法适用于被检测信号的最大频率小于基准时钟的频率

在这里插入图片描述
如上图,当第一个时钟上升沿来到,检测到输入信号为低0,下一个上升沿来到检测到高1,则检测到上升沿。

下降沿同理
在这里插入图片描述
如上图,当第一个时钟上升沿来到,检测到输入信号为高1,下一个上升沿来到检测到低0,则检测到下降沿。

如果被检测信号的最大频率大于基准时钟的频率就会发生如下的问题,可能会检测不到
在这里插入图片描述
如上图,当第一个时钟上升沿来到,检测到输入信号为低0,下一个上升沿来到检测到还是低0,但是输入信号在两个时钟上升沿之间是有上升沿的。出现了检测不到的问题。

这时就需要异步边沿检测

2、边检测原理(异步)

异步边沿检测是利用D触发器来实现边沿检测。适用于任意频率(只要不超过D触发器的触发范围)。这种检测方法常用于被检测信号的最大频率大于基准时钟的频率

相当于把输入信号当成时钟,核心Verilog代码如下:

input					singal_in;

output			reg		Y_p;
output			reg		Y_n;

// 检测上升沿
always@(posedge singal_in)begin
	if(singal_in)
		Y_p <= 1;
end

/ 检测下降沿
always@(negedge singal_in)begin
	if(!singal_in)
		Y_n <= 1;
end

二、同步Verilog实现

`timescale 1ns / 1ps

module edge_detection(
	input					clk,
	input					rst_n,
	input					signal_in,
	
	output					Y_p,			// 检测到上升沿输出1,否则0
	output					Y_n				// 检测到下降沿输出1,否则0

    );
    
    reg			[1:0]		Y_p_g;
    reg			[1:0]		Y_n_g;
    
    assign Y_p = (!Y_p_g[1]) & Y_p_g[0];
    assign Y_n = Y_n_g[1] & (!Y_n_g[0]);
    
    always@(posedge clk or negedge rst_n) begin
    	if(!rst_n) begin
    		Y_p_g <= 2'd0;
    		Y_n_g <= 2'd0;
    	end
    	else begin
    		Y_p_g[0] <= signal_in;
    		Y_p_g[1] <= Y_p_g[0];
    		Y_n_g[0] <= signal_in;
    		Y_n_g[1] <= Y_n_g[0];
    	end
    end

endmodule

testbench文件

`timescale 1ns / 1ps

module edge_detection_tb();
	
	reg					clk;
	reg					rst_n;
	reg					signal_in;
	
	wire				Y_p;
	wire				Y_n;
	
	initial begin
		clk = 0;
		rst_n = 0;
		singal_in = 0;
		#30;
		rst_n = 1;
	end
	
	always #10 clk = ~ clk;
	
	initial begin
		#45 signal_in= 1;
		#37 signal_in= 0;
		#29 signal_in= 1;
		#37 signal_in= 0;
		#100 $stop;
	end
	
	edge_detection edge_detection(
		.clk				(clk),
		.rst_n				(rst_n),
		.signal_in			(signal_in),
		
		.Y_p				(Y_p),
		.Y_n				(Y_n)
	);
	
endmodule

在这里插入图片描述

在代码中,有这几行代码
在这里插入图片描述

我们取其中的Y_p_g和Y_p来说
在这里插入图片描述
触发电路如下
在这里插入图片描述

假设signal_in 的输入情况,假设先输入0,再输入1
第一个上升沿来到,signal_in赋值给Y_p_g[0] = 0,此时Y_p_g[1]为默认状态,不管;
第一个上升沿来到,signal_in赋值给Y_p_g[0] = 1,此时Y_p_g[0]的值赋值给Y_p_g[1] = 0;

在这里插入图片描述
此时Y_p = 1;下降沿原理一样。

  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值