思路:设计两个或多个一位的寄存器,用来接收被检测的信号,系统时钟来一次记一次输入信号,如果用了两个寄存器直接异或就可以了;使用高频的时钟对信号进行采样,因此要实现上升沿检测,时钟频率至少要在信号最高频率的2倍以上,否则就可能出现漏检测。具体请参见下面代码:
module edge_detect(clk,rst,signal,pos_edge,neg_edge,both_edge);
input clk;
input rst;
input signal;
output pos_edge;
output neg_edge;
output both_edge;
reg sig_r0,sig_r1;//状态寄存器
always @(posedge clk)
begin
if(rst)
begin
sig_r0 <= 1'b0;
sig_r1 <= 1'b0;
end
else
begin
sig_r0 <= signal;
sig_r1 <= sig_r0;
end
end
assign pos_edge = ~sig_r1 & sig_r0;
assign neg_edge = sig_r1 & ~sig_r0;
assign both_edge = sig_r0 ^ sig_r1;
endmodule