之前写过一个算数右移的实现,今天又发现了两种:
版本一:
module shift_2(d,sa,right,arith,sh);
input [31:0] d;
input [4:0] sa;
input right,arith;
output [31:0] sh;
wire [31:0] t0,t1,t2,t3,t4,s1,s2,s3,s4;
wire a = d[31] & arith; //judge whether need arithmetic shift
wire [15:0] e = {16{a}};
wire [15:0] z = {16{1'b0}};
wire [31:0] sld4,sdr4,sld3,sdr3,sld2,sdr2,sld1,sdr1,sld0,sdr0;
assign sld4 = {d[15:0],z};
assign sdr4 = {e,d[31:16]};
mux32 m4_right(sld4,sdr4,right,t4); //mux32(a0,a1,s,y);y = s?a1:a0;
mux32 m4_shift(d,t4,sa[4],s4);
assign sld3 = {s4[23:0],z[7:0]};
assign sdr3 = {e[7:0],s4[31:8]};
mux32 m3_right(sld3,sdr3,right,t3);
mux32 m3_shift(s4,t3,sa[3],s3);
assign sld2 = {s3[27:0],z[3:0]};
assign sdr2 = {e[3:0],d[31:4]};
mux32 m2_right(sld2,sdr2,right,t2);