1
0
mirror of https://github.com/pConst/basic_verilog.git synced 2025-01-14 06:42:54 +08:00
basic_verilog/edge_detect.sv

94 lines
2.1 KiB
Systemverilog
Raw Normal View History

2018-08-01 07:00:37 +03:00
//------------------------------------------------------------------------------
2018-12-11 15:34:14 +03:00
// edge_detect.sv
// Konstantin Pavlov, pavlovconst@gmail.com
2018-08-01 07:00:37 +03:00
//------------------------------------------------------------------------------
2018-08-01 07:00:37 +03:00
// INFO ------------------------------------------------------------------------
2020-05-22 15:59:50 +03:00
// Edge detector, ver.3
// Added parameter to select combinational implementation (zero clocks delay)
// or registered implementation (one clocks delay)
//
// In case when "in" port has toggle rate 100% (changes every clock period)
// "rising" and "falling" outputs will completely replicate input
// "both" output will be always active in this case
2020-05-22 15:59:50 +03:00
//
/* --- INSTANTIATION TEMPLATE BEGIN ---
2020-05-22 15:59:50 +03:00
edge_detect #(
.REGISTER_OUTPUTS( 1'b1 )
) ED1[31:0] (
.clk( {32{clk}} ),
.nrst( {32{1'b1}} ),
.in( in[31:0] ),
.rising( out[31:0] ),
.falling( ),
.both( )
);
--- INSTANTIATION TEMPLATE END ---*/
2020-05-22 15:59:50 +03:00
module edge_detect #( parameter
bit [0:0] REGISTER_OUTPUTS = 1'b0 // 0 - comb. implementation (default)
// 1 - registered implementation
)(
input clk,
input nrst,
input in,
output logic rising,
output logic falling,
output logic both
);
2020-05-22 15:59:50 +03:00
// data delay line
logic in_d = 0;
always_ff @(posedge clk) begin
2018-08-01 07:00:37 +03:00
if ( ~nrst ) begin
in_d <= 0;
end else begin
in_d <= in;
2018-08-01 07:00:37 +03:00
end
end
2020-05-22 15:59:50 +03:00
logic rising_comb;
logic falling_comb;
logic both_comb;
always_comb begin
2020-05-22 15:59:50 +03:00
rising_comb = nrst && (in && ~in_d);
falling_comb = nrst && (~in && in_d);
both_comb = nrst && (rising_comb || falling_comb);
end
2020-05-22 15:59:50 +03:00
generate
if( REGISTER_OUTPUTS=='0 ) begin
// combinational outputs, no delay
always_comb begin
rising = rising_comb;
falling = falling_comb;
both = both_comb;
end // always
end else begin
// registered outputs, 1 cycle delay
always_ff @(posedge clk) begin
if( ~nrst ) begin
rising <= 0;
falling <= 0;
both <= 0;
end else begin
rising <= rising_comb;
falling <= falling_comb;
both <= both_comb;
end // always
end // if
end // end else
endgenerate
endmodule