项目名称:
边沿检测
具体要求:
上升沿和下降沿检测,检测到后发出高电平脉冲
设计架构
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,在边沿检测之前也会有标志信号产生,这一点要注意.