101 lines
2.0 KiB
Verilog

module Max_meas #
(
parameter data_width = 4'd12,
parameter range_width = 4'd10
)
(
input clk_in,
input rst_n,
input [range_width-1:0] range,
input signed [data_width - 1:0] data_in,
output signed [data_width - 1:0] data_out
);
localparam state_output = 3'b010;
localparam state_initial = 3'b000;
localparam state_detection = 3'b001;
reg signed [data_width - 1:0] data_out_buf = 0;
reg signed [data_width - 1:0] data_out_buf1 = 0;
reg [2:0] state = 3'b000;
reg test_sig = 1'b0;
reg test_sig_buf = 1'b0;
wire test_done_sig = ~test_sig & test_sig_buf;
wire test_start_sig = test_sig & ~test_sig_buf;
/***************************************************/
//define the time counter
reg [range_width-1:0] cnt0 = 1;
always@(posedge clk_in)
begin
if (range == 0)
begin
test_sig <= 1'b1;
end
else if (cnt0 == range)
begin
cnt0 <= 10'd0; //count done,clearing the time counter
test_sig <= 1'd0;
end
else
test_sig <= 1'd1; //cnt0 counter = cnt0 counter + 1
cnt0 <= cnt0 + 1'b1;
end
/***************************************************/
always@(posedge clk_in)
begin
if (range == 0)
begin
test_sig_buf <= 1'b0;
end
else
begin
test_sig_buf <= test_sig;
end
end
always@(posedge clk_in or negedge rst_n)
begin
if(!rst_n)
begin
data_out_buf <= 0;
data_out_buf1 <= 0;
end
else
begin
case(state)
state_initial:begin
if(test_start_sig)
begin
state <= state_detection;
data_out_buf <= 0;
end
end
state_detection:begin
if(test_done_sig)
state <= state_output;
else
if(data_in > data_out_buf)
begin
data_out_buf <= data_in;
if (range == 0)
begin
data_out_buf1 <= data_out_buf;
end
end
end
state_output:begin
data_out_buf1 <= data_out_buf;
state <= state_initial;
end
endcase
end
end
assign data_out=data_out_buf1;
endmodule