````timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output [4:0]out,
output validout
);
//*************code***********//
reg [4:0] out_r;
reg validout_r;
reg [15:0]d_r;
always @(posedge clk or negedge rst) begin
    if(!rst) begin
        d_r <= 'b0;
    end
    else if(~(|sel))begin
        d_r <= d;
    end
end
always @(posedge clk or negedge rst) begin
    if(!rst) begin
        out_r <= 'b0;
        validout_r <= 'b0;
    end
    else begin
        case (sel)
           2'd1 : begin
            out_r <= d_r[3:0] + d_r[7:4];
            validout_r <= 'b1;
           end

           2'd2 : begin
            out_r <= d_r[3:0] + d_r[11:8];
            validout_r <= 'b1;
           end

           2'd3 : begin
            out_r <= d_r[3:0] + d_r[15:12];
            validout_r <= 'b1;
           end

           default: begin
            out_r <= 'b0;
            validout_r <= 'b0;
           end
        endcase

    end
end

assign out = (|sel)?out_r:'b0;
assign validout = validout_r;

//*************code***********//
endmodule