//32位移位器
module shift (d,sa,right,arith,sh);
input [31:0] d;
input [4:0] sa; //移位的位数
input right,arith; // 0 or 1 控制信号
output [31:0] sh; //d-->sh
reg [31:0] sh;
always @* begin //当任意一个变量改变时触发
//当输入信号right=0时左移
if (!right) begin //shift left左移
sh = d << sa;
end
//当输入信号right=1时右移
//当arith=1时,符号扩展,否则零扩展
//当arith=1时,扩展位与数据位最高为d[31]相同,否则扩展位为0
else if (!arith) begin //shift right logical逻辑右移
sh = d >> sa;
end
else begin //shift right arithmetic算数右移
sh = $signed(d) >>> sa; //自动计算补码,$signed(d)表示d是一个带符号数
end
end
endmodule