module intercambiador_filas2
#(
	parameter ENDMEMBER = 21
)
(
	input clk,rst,
	input req,
	input [ENDMEMBER-1:0] fila,
	input [4:0]index_i,
	output reg ack,
	output cero,cambiar,
	output [4:0]indice_cambiar
);

localparam 	state_idle 		= 	2'h1,
				state_fin		=	2'h2;

wire [ENDMEMBER-1:0]termino;
wire [ENDMEMBER-1:0]fraccion;	
wire cero_temp,cambiar_temp;
wire [4:0] indice_cambiar_temp;
reg [1:0]state_reg,state_next;
reg cambiar_reg,cambiar_next;
reg cero_reg,cero_next;
reg [4:0]indice_cambiar_reg,indice_cambiar_next;

			
decodificador5a32 stage_decodificador (.data_in(index_i),.data_out(termino));
assign fraccion=(termino)&~fila;
assign cero_temp=(fraccion==3'b000)?1'b1:1'b0;
mux5bits #(.WIDTH(1)) stage_mux(.data_in(fila),.sel(index_i),.data_out(cambiar_temp));
codificador32a5 stage_codificador(.data_in(fraccion),.data_out(indice_cambiar_temp));

always@(posedge clk,posedge rst)
begin
	if (rst)
	begin
		state_reg <= 2'b01;
		cero_reg <= 1'b0;
		cambiar_reg <=1'b0;
		indice_cambiar_reg<=5'd0;
	end
	else
	begin
		state_reg <= state_next;
		cero_reg <= cero_next;
		cambiar_reg <=cambiar_next;
		indice_cambiar_reg<=indice_cambiar_next;
	end
end

always@(*)
begin
state_next=state_reg;
cero_next=cero_reg;
cambiar_next=cambiar_reg;
indice_cambiar_next=indice_cambiar_reg;
ack=1'b0;
case(state_reg)
state_idle:
begin
if(req)
begin
	state_next=state_fin;
	cero_next=cero_temp;
	cambiar_next=cambiar_temp;
	indice_cambiar_next=indice_cambiar_temp;
end
end
state_fin:
begin
ack=1'b1;
if (~req)
begin
	state_next=state_idle;
end
end
default:
begin
state_next=state_idle;
end
endcase
end

assign cero=cero_reg;
assign cambiar=cambiar_reg;
assign indice_cambiar=indice_cambiar_reg;
endmodule
