module barrelshift_32(
input [31:0] a, // 32 位原始输入数据
input [4:0] b, // 5 位输入数据,控制移位的位数
input [1:0] aluc, // 2 位输入控制移位的方式
output reg [31:0] c // 32 位输出,由a 经过b 位通过aluc 指定的移位方
);
always @ (a or b or aluc)
begin
if(aluc==2'b00)
begin
case(b) //移位数
5'b00000:c=a; //移动0位,不变
5'b00001:c={{2{a[31]}},a[29:0]};
5'b00010:c={{3{a[31]}},a[28:0]};
5'b00011:c={{4{a[31]}},a[27:0]};
5'b00100:c={{5{a[31]}},a[26:0]};
5'b00101:c={{6{a[31]}},a[25:0]};
5'b00110:c={{7{a[31]}},a[24:0]};
5'b00111:c={{8{a[31]}},a[23:0]};
5'b01000:c={{9{a[31]}},a[22:0]};
5'b01001:c={{10{a[31]}},a[21:0]};
5'b01010:c={{11{a[31]}},a[20:0]};
5'b01011:c={{12{a[31]}},a[19:0]};
5'b01100:c={{13{a[31]}},a[18:0]};
5'b01101:c={{14{a[31]}},a[17:0]};
5'b01110:c={{15{a[31]}},a[16:0]};
5'b01111:c={{16{a[31]}},a[15:0]};
5'b10000:c={{17{a[31]}},a[14:0]};
5'b10001:c={{18{a[31]}},a[13:0]};
5'b10010:c={{19{a[31]}},a[12:0]};
5'b10011:c={{20{a[31]}},a[11:0]};
5'b10100:c={{21{a[31]}},a[10:0]};
5'b10101:c={{22{a[31]}},a[9:0]};
5'b10110:c={{23{a[31]}},a[8:0]};
5'b10111:c={{24{a[31]}},a[7:0]};
5'b11000:c={{25{a[31]}},a[6:0]};
5'b11001:c={{26{a[31]}},a[5:0]};
5'b11010:c={{27{a[31]}},a[4:0]};
5'b11011:c={{28{a[31]}},a[3:0]};
5'b11100:c={{29{a[31]}},a[2:0]};
5'b11101:c={{30{a[31]}},a[1:0]};
5'b11110:c={{31{a[31]}},a[0]};
5'b11111:c={32{a[31]}};
endcase
end
if(aluc==2'b01)
begin
case(b)
5'b00000:c=a;
5'b00001:c={1'b0,a[31:1]};
5'b00010:c={2'b0,a[31:2]};
5'b00011:c={3'b0,a[31:3]};
5'b00100:c={4'b0,a[31:4]};
5'b00101:c={5'b0,a[31:5]};
5'b00110:c={6'b0,a[31:6]};
5'b00111:c={7'b0,a[31:7]};
5'b01000:c={8'b0,a[31:8]};
5'b01001:c={9'b0,a[31:9]};
5'b01010:c={10'b0,a[31:10]};
5'b01011:c={11'b0,a[31:11]};
5'b01100:c={12'b0,a[31:12]};
5'b01101:c={13'b0,a[31:13]};
5'b01110:c={14'b0,a[31:14]};
5'b01111:c={15'b0,a[31:15]};
5'b10000:c={16'b0,a[31:16]};
5'b10001:c={17'b0,a[31:17]};
5'b10010:c={18'b0,a[31:18]};
5'b10011:c={19'b0,a[31:19]};
5'b10100:c={20'b0,a[31:20]};
5'b10101:c={21'b0,a[31:21]};
5'b10110:c={22'b0,a[31:22]};
5'b10111:c={23'b0,a[31:23]};
5'b11000:c={24'b0,a[31:24]};
5'b11001:c={25'b0,a[31:25]};
5'b11010:c={26'b0,a[31:26]};
5'b11011:c={27'b0,a[31:27]};
5'b11100:c={28'b0,a[31:28]};
5'b11101:c={29'b0,a[31:29]};
5'b11110:c={30'b0,a[31:30]};
5'b11111:c={31'b0,a[31]};
endcase
end
if(aluc==2'b10)
begin
case(b)
5'b00000:c=a;
5'b00001:c={a[31],a[29:0],1'b0};
5'b00010:c={a[31],a[28:0],2'b0};
5'b00011:c={a[31],a[27:0],3'b0};
5'b00100:c={a[31],a[26:0],4'b0};
5'b00101:c={a[31],a[25:0],5'b0};
5'b00110:c={a[31],a[24:0],6'b0};
5'b00111:c={a[31],a[23:0],7'b0};
5'b01000:c={a[31],a[22:0],8'b0};
5'b01001:c={a[31],a[21:0],9'b0};
5'b01010:c={a[31],a[20:0],10'b0};
5'b01011:c={a[31],a[19:0],11'b0};
5'b01100:c={a[31],a[18:0],12'b0};
5'b01101:c={a[31],a[17:0],13'b0};
5'b01110:c={a[31],a[16:0],14'b0};
5'b01111:c={a[31],a[15:0],15'b0};
5'b10000:c={a[31],a[14:0],16'b0};
5'b10001:c={a[31],a[13:0],17'b0};
5'b10010:c={a[31],a[12:0],18'b0};
5'b10011:c={a[31],a[11:0],19'b0};
5'b10100:c={a[31],a[10:0],20'b0};
5'b10101:c={a[31],a[9:0],21'b0};
5'b10110:c={a[31],a[8:0],22'b0};
5'b10111:c={a[31],a[7:0],23'b0};
5'b11000:c={a[31],a[6:0],24'b0};
5'b11001:c={a[31],a[5:0],25'b0};
5'b11010:c={a[31],a[4:0],26'b0};
5'b11011:c={a[31],a[3:0],27'b0};
5'b11100:c={a[31],a[2:0],28'b0};
5'b11101:c={a[31],a[1:0],29'b0};
5'b11110:c={a[31],a[0],30'b0};
5'b11111:c={a[31],31'b0};
endcase
end
if(aluc==2'b11)
begin
case(b)
5'b00000:c=a;
5'b00001:c={a[30:0],1'b0};
5'b00010:c={a[29:0],2'b0};
5'b00011:c={a[28:0],3'b0};
5'b00100:c={a[27:0],4'b0};
5'b00101:c={a[26:0],5'b0};
5'b00110:c={a[25:0],6'b0};
5'b00111:c={a[24:0],7'b0};
5'b01000:c={a[23:0],8'b0};
5'b01001:c={a[22:0],9'b0};
5'b01010:c={a[21:0],10'b0};
5'b01011:c={a[20:0],11'b0};
5'b01100:c={a[19:0],12'b0};
5'b01101:c={a[18:0],13'b0};
5'b01110:c={a[17:0],14'b0};
5'b01111:c={a[16:0],15'b0};
5'b10000:c={a[15:0],16'b0};
5'b10001:c={a[14:0],17'b0};
5'b10010:c={a[13:0],18'b0};
5'b10011:c={a[12:0],19'b0};
5'b10100:c={a[11:0],20'b0};
5'b10101:c={a[10:0],21'b0};
5'b10110:c={a[9:0],22'b0};
5'b10111:c={a[8:0],23'b0};
5'b11000:c={a[7:0],24'b0};
5'b11001:c={a[6:0],25'b0};
5'b11010:c={a[5:0],26'b0};
5'b11011:c={a[4:0],27'b0};
5'b11100:c={a[3:0],28'b0};
5'b11101:c={a[2:0],29'b0};
5'b11110:c={a[1:0],30'b0};
5'b11111:c={a[0],31'b0};
endcase
end
end
endmodule