|
`timescale 1ns/1ns
module cbb_edgedet #
(parameter EDGE_DETECT="POSEDGE"
)
(
input SYS_CLK,
input RST_N,
input SIGNAL_IN,
output SIGNAL_EDGE
);
generate
if (EDGE_DETECT == "POSEDGE")
begin: POSE_EDGE
reg SIGNAL_IN_DLY1;
reg SIGNAL_IN_DLY2;
reg SIGNAL_IN_DLY3;
reg SIGNAL_RISE;
always @ (posedge SYS_CLK or negedge RST_N)
begin
if (RST_N == 1'B0)
begin
SIGNAL_IN_DLY1 <= 1'B0;
SIGNAL_IN_DLY2 <= 1'B0;
SIGNAL_IN_DLY3 <= 1'B0;
end
else
begin
SIGNAL_IN_DLY1 <= SIGNAL_IN;
SIGNAL_IN_DLY2 <= SIGNAL_IN_DLY1;
SIGNAL_IN_DLY3 <= SIGNAL_IN_DLY2;
end
end
always @ (posedge SYS_CLK or negedge RST_N)
begin
if (RST_N == 1'B0)
SIGNAL_RISE <= 1'B0;
else
SIGNAL_RISE <= ~SIGNAL_IN_DLY3 && SIGNAL_IN_DLY2;
end
assign SIGNAL_EDGE = SIGNAL_RISE;
end
else if (EDGE_DETECT == "NEGEDGE")
begin: NEGE_EDGE
reg SIGNAL_IN_DLY1;
reg SIGNAL_IN_DLY2;
reg SIGNAL_IN_DLY3;
reg SIGNAL_FALL;
always @ (posedge SYS_CLK or negedge RST_N)
begin
if (RST_N == 1'B0)
begin
SIGNAL_IN_DLY1 <= 1'B0;
SIGNAL_IN_DLY2 <= 1'B0;
SIGNAL_IN_DLY3 <= 1'B0;
end
else
begin
SIGNAL_IN_DLY1 <= SIGNAL_IN;
SIGNAL_IN_DLY2 <= SIGNAL_IN_DLY1;
SIGNAL_IN_DLY3 <= SIGNAL_IN_DLY2;
end
end
always @ (posedge SYS_CLK or negedge RST_N)
begin
if (RST_N == 1'B0)
SIGNAL_FALL <= 1'B0;
else
SIGNAL_FALL <= SIGNAL_IN_DLY3 && (~SIGNAL_IN_DLY2);
end
assign SIGNAL_EDGE = SIGNAL_FALL;
end
else if (EDGE_DETECT == "DUALDGE")
begin: DUAL_EDGE
reg SIGNAL_IN_DLY1;
reg SIGNAL_IN_DLY2;
reg SIGNAL_IN_DLY3;
reg SIGNAL_RISE_FALL;
always @ (posedge SYS_CLK or negedge RST_N)
begin
if (RST_N == 1'B0)
begin
SIGNAL_IN_DLY1 <= 1'B0;
SIGNAL_IN_DLY2 <= 1'B0;
SIGNAL_IN_DLY3 <= 1'B0;
end
else
begin
SIGNAL_IN_DLY1 <= SIGNAL_IN;
SIGNAL_IN_DLY2 <= SIGNAL_IN_DLY1;
SIGNAL_IN_DLY3 <= SIGNAL_IN_DLY2;
end
end
always @ (posedge SYS_CLK or negedge RST_N)
begin
if (RST_N == 1'B0)
SIGNAL_RISE_FALL <= 1'B0;
else
SIGNAL_RISE_FALL <= SIGNAL_IN_DLY3 ^ SIGNAL_IN_DLY2;
end
assign SIGNAL_EDGE = SIGNAL_RISE_FALL;
end
endgenerate
endmodule |
|