`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
//*************code***********//
reg [1:0] cnt;
wire add_cnt;
wire end_cnt;
reg [7:0]d_reg;
always @(posedge clk or negedge rst)begin
if(!rst)begin
cnt <= 0;
end
else if(add_cnt)begin
if(end_cnt)
cnt <= 0;
else
cnt <= cnt + 1;
end
end
assign add_cnt = 1;
assign end_cnt = add_cnt && cnt==4-1;
always @(posedge clk or negedge rst)begin
if(!rst)
out <= 0;
d_reg <= 0;
else begin
case( cnt )
0:
out <= d;
d_reg <= d;
1:
out <= d_reg + {d_reg, 1'b0};
2:
out <= d_reg + {d_reg, 1'b0} + {d_reg, 2'b0};
3:
out <= {d_reg, 3'b0};
default:
out <= out;
endcase
end
end
always @(posedge clk or negedge rst)begin
if(!rst)begin
input_grant <= 0;
end
else begin
if(add_cnt &&cnt == 0)
input_grant <= 1;
else if(add_cnt && cnt ==1)
input_grant <= 0;
end
end
//*************code***********//
endmodule