fpga边沿检测

项目名称:

边沿检测

具体要求:

上升沿和下降沿检测,检测到后发出高电平脉冲

设计架构

                         

signal:输入信号

neg_flag:检测到低电平发出高脉冲信号

pos_flag:检测到高电平发出高脉冲信号

代码设计

verilog代码实现

module edge_detection(
	input			clk,
	input			rst_n,
	input			signal,
	output		pos_flag,
	output		neg_flag
);
//异步信号同步化,减少亚稳态,如果一级寄存器进入亚稳态,一般会在一个时钟周期稳定下来
//但也会导致标志信号延迟两拍
reg tr1;
reg tr2;
reg tr3;
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		begin
			tr1<=0;
			tr2<=0;
			tr3<=0;
		end
	else begin
		tr1<=signal;
		tr2<=tr1;
		tr3<=tr2;
	end

//如果是下降沿,第三个寄存器得到下降沿的高电平的时候,第二个寄存器得到下降沿的低电平	
assign neg_flag=(~tr2 & tr3)?1:0;
//如果是上升沿,先发送低电平再发送高电平,第三个寄存器寄存到低电平时第二个寄存器寄存到高电平
assign pos_flag=(tr2 & ~tr3)?1:0;

endmodule

仿真代码

`timescale 1ns/1ns
module edge_detection_tb;
	reg			clk;
	reg			rst_n;
	reg			signal;
	wire  		pos_flag;
	wire  		neg_flag;

edge_detection 	edge_detection(
	.clk(clk),
	.rst_n(rst_n),
	.signal(signal),
	.pos_flag(pos_flag),
	.neg_flag(neg_flag)
);

initial clk=0;
always #10 clk=~clk;

initial begin
	rst_n=0;
	signal=0;
	
	#200
	rst_n=1;
	#200
	signal=1;//上升沿
	#200
	signal=0;//下降沿
	
	#500;
	$stop;
end

endmodule

仿真结果

 可以看到在消除亚稳态的同时检测信号被延迟了两拍,本人在设计中发现如果刚开始检测下降沿,signal为高电平时,如果三个寄存器初始值为0,在边沿检测之前也会有标志信号产生,这一点要注意.

 

猜你喜欢

转载自blog.csdn.net/weixin_43533751/article/details/106971858