101 lines
2.0 KiB
Verilog
101 lines
2.0 KiB
Verilog
module Min_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
|