Monday, December 27, 2010

Barrel Shifter


Barrel shifter at behavioural level:


module barr_shf (data , amount ,type, out);
input [3:0] data;
input [1:0] amount , type;
output reg [3:0] out;
always @ (type or amount or out or data)
case (type)  
0: out = data >> amount;   
1: out = data << amount;



2:
    case (amount)  
    0:    out = data;
    1: begin
    out[0] = data[1];
    out[1] = data[2];
    out[2] = data[3];
    out[3] = data[0];
    end
    2:    begin
    out[0] = data[2];
    out[1] = data[3];
    out[2] = data[0];
    out[3] = data[1];
    end
    3:    begin
    out[0] = data[3];
    out[1] = data[0];
    out[2] = data[1];
    out[3] = data[2];
    end  
    endcase
3:
    case (amount)  
    0:    out = data;
    1:
    begin
    out[0] = data[3];
    out[1] = data[0];
    out[2] = data[1];
    out[3] = data[2];
    end
    2:  
    begin
    out[0] = data[2];
    out[1] = data[3];
    out[2] = data[0];
    out[3] = data[1];
    end
    3:  
    begin
    out[0] = data[1];
    out[1] = data[2];
    out[2] = data[3];
    out[3] = data[0];
    end  
    endcase
endcase
endmodule

// ALU, having two 4 bit inputs with also a 4 bit selection line.


module ALU2(a ,b ,sel ,out ,c_out ,z_f);
input [3:0] a ,b;
input [3:0] sel;
output reg [3:0]out;
output z_f ,c_out ;
wire[3:0] out1;
barr_shf j (a ,b[1:0] ,b[3:2] , out1);  
assign z_f = (~out[3] & ~out[2] & ~out[1] & ~out[0]);
assign c_out = ((a[3]&b[3]) | ((a[3] | b[3]) & ~out[3]));
always @ (a or b or sel or out1)
case (sel)
0: out = a + b;
1: out = a - b;
2: out = b + 1;
3: out = a - 1;
4: out = ~a;
5: out = a & b;
6: out = a | b;
7: out = ~a + 1;
8: out = out1;
9:    out = (a>b) ? a:b;
10: out = (a==b) ? 4'b1111 : 4'b0000;
11: out = a*b;
12: out = ~(a&b);
13: out = ~b;
14: out = b-a;
15: out = a^b;
endcase
endmodule

Output for barrel shifter:




No comments:

Post a Comment