module shift_32bit

#(
	parameter WIDTH = 32
)

(
	// Input Ports
	input [WIDTH-1:0] number,
	input [5:0] k,

	// Output Ports
	output [WIDTH-1:0] result

);


reg [WIDTH-1:0] shift_negativo;
reg [WIDTH-1:0] shift_positivo;

assign result=(k[5]==1'b1)?shift_negativo:shift_positivo;

always@(*)
begin	
	case(k[4:0])
	5'b00000:shift_positivo=number;
	5'b00001:shift_positivo=number<<1;
	5'b00010:shift_positivo=number<<2;
	5'b00011:shift_positivo=number<<3;
	5'b00100:shift_positivo=number<<4;
	5'b00101:shift_positivo=number<<5;
	5'b00110:shift_positivo=number<<6;
	5'b00111:shift_positivo=number<<7;
	5'b01000:shift_positivo=number<<8;
	5'b01001:shift_positivo=number<<9;
	5'b01010:shift_positivo=number<<10;
	5'b01011:shift_positivo=number<<11;
	5'b01100:shift_positivo=number<<12;
	5'b01101:shift_positivo=number<<13;
	5'b01110:shift_positivo=number<<14;
	5'b01111:shift_positivo=number<<15;
	5'b10000:shift_positivo=number<<16;
	5'b10001:shift_positivo=number<<17;
	5'b10010:shift_positivo=number<<18;
	5'b10011:shift_positivo=number<<19;
	5'b10100:shift_positivo=number<<20;
	5'b10101:shift_positivo=number<<21;
	5'b10110:shift_positivo=number<<22;
	5'b10111:shift_positivo=number<<23;
	5'b11000:shift_positivo=number<<24;
	5'b11001:shift_positivo=number<<25;
	5'b11010:shift_positivo=number<<26;
	5'b11011:shift_positivo=number<<27;
	5'b11100:shift_positivo=number<<28;
	5'b11101:shift_positivo=number<<29;
	5'b11110:shift_positivo=number<<30;
	5'b11111:shift_positivo=number<<31;
	default:shift_positivo=16'h0000;
	endcase
end

//negative part
always@(*)
begin	
	case(k[4:0])
	5'b11111:shift_negativo={{1{number[31]}},number[31:1]};
	5'b11110:shift_negativo={{2{number[31]}},number[31:2]};
	5'b11101:shift_negativo={{3{number[31]}},number[31:3]};
	5'b11100:shift_negativo={{4{number[31]}},number[31:4]};
	5'b11011:shift_negativo={{5{number[31]}},number[31:5]};
	5'b11010:shift_negativo={{6{number[31]}},number[31:6]};
	5'b11001:shift_negativo={{7{number[31]}},number[31:7]};
	5'b11000:shift_negativo={{8{number[31]}},number[31:8]};
	5'b10111:shift_negativo={{9{number[31]}},number[31:9]};
	5'b10110:shift_negativo={{10{number[31]}},number[31:10]};
	5'b10101:shift_negativo={{11{number[31]}},number[31:11]};
	5'b10100:shift_negativo={{12{number[31]}},number[31:12]};
	5'b10011:shift_negativo={{13{number[31]}},number[31:13]};
	5'b10010:shift_negativo={{14{number[31]}},number[31:14]};
	5'b10001:shift_negativo={{15{number[31]}},number[31:15]};
	5'b10000:shift_negativo={{16{number[31]}},number[31:16]};
	5'b01111:shift_negativo={{17{number[31]}},number[31:17]};
	5'b01110:shift_negativo={{18{number[31]}},number[31:18]};
	5'b01101:shift_negativo={{19{number[31]}},number[31:19]};
	5'b01100:shift_negativo={{20{number[31]}},number[31:20]};
	5'b01011:shift_negativo={{21{number[31]}},number[31:21]};
	5'b01010:shift_negativo={{22{number[31]}},number[31:22]};
	5'b01001:shift_negativo={{23{number[31]}},number[31:23]};
	5'b01000:shift_negativo={{24{number[31]}},number[31:24]};
	5'b00111:shift_negativo={{25{number[31]}},number[31:25]};
	5'b00110:shift_negativo={{26{number[31]}},number[31:26]};
	5'b00101:shift_negativo={{27{number[31]}},number[31:27]};
	5'b00100:shift_negativo={{28{number[31]}},number[31:28]};
	5'b00011:shift_negativo={{29{number[31]}},number[31:29]};
	5'b00010:shift_negativo={{30{number[31]}},number[31:30]};
	5'b00001:shift_negativo={{31{number[31]}},number[31]};
	default:shift_negativo=16'h0000;
	endcase
end
	
endmodule
