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:
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment