本文为自己实现的利用FPGA检测信号下降沿并生成信号的过程:
/*****Author:Chun-juan He
date:2018.8.13
function: Edge detection*****/
module detection_edge
(
clk,rst_n,out1,out2,out3,triger1,triger2
);
input clk,rst_n;
output out1,out2,out3,triger1,triger2;
parameter T1S=32'd50_000;
parameter T100MS=26'd500;
//generate the signal out1
reg [31:0] outreg;
reg signal;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
outreg<=0;
signal<=1;
end
else
if(outreg<=T1S)
begin
outreg<=outreg+1'b1;
signal<=0;
end
else if((outreg>T1S)&&(outreg<2*T1S))
begin
outreg<=outreg+1'b1;
signal<=1;
end
else
begin
outreg<=0;
end
end
assign out1=signal;
//检测下降沿
reg TGreg0,TGreg1;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
TGreg0<=0;
TGreg1<=0;
end
else
begin
TGreg0<=signal;
TGreg1<=TGreg0;
end
end
wire Triger=(~TGreg0&TGreg1)? 1'b0:1'b1;
assign triger1=Triger;
//检测到下降沿,并产生一个信号
reg TrigerTrue;
reg [31:0] cnt;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
cnt<=0;
TrigerTrue<=0;
end
else
begin
if(~TGreg0&TGreg1)
begin
cnt<=0;
TrigerTrue<=1;
end
else
begin
if(TrigerTrue&&cnt<T100MS)
begin
cnt<=cnt+1'b1;
TrigerTrue<=1;
end
else
begin
TrigerTrue<=0;
end
end
end
end
assign out2=TrigerTrue;
//检测生成信号signal的下降沿
reg signal0,signal1;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
signal0<=0;
signal1<=0;
end
else
begin
signal0<=out2;
signal1<=signal0;
end
end
wire triger2=(~signal0&signal1)? 1'b1:1'b0;
reg signalTrue;
reg [25:0] signaicnt;
always @(posedge clk or negedge rst_n )
begin
if(!rst_n)
begin
signaicnt<=0;
signalTrue<=0;
end
else
begin
if(triger2)
begin
signaicnt<=0;
signalTrue<=1;
end
else
begin
if(signalTrue&&signaicnt<=T1S)
begin
signaicnt<=signaicnt+1'b1;
signalTrue<=1;
end
else
begin
signalTrue<=0;
end
end
end
end
assign out3=signalTrue;
endmodule
modelsim仿真结果如下:
踩了很多坑 这里发现仿真结果检测到下降沿之后 会有两个clk周期的延时 再生成所需信号 查了很多资料 有人说留有两个机器周期的时间反应 检测到下降沿后 反应一个机器周期 生成信号时再反应一个机器周期 但是由于时间太短 可忽略不计 故为了提高机器周期对设计电路的影响 建议使用高频率的晶振