forked from qleenju/PDPU
-
Notifications
You must be signed in to change notification settings - Fork 0
/
barrel_shifter.sv
33 lines (31 loc) · 1.16 KB
/
barrel_shifter.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// barrel shifter
module barrel_shifter #(
parameter int unsigned WIDTH = 8, // bit-width of input data
parameter int unsigned SHIFT_WIDTH = 3, // bit-width of shift amount
// MODE=0-->shift left; MODE=1-->shift right
parameter bit MODE = 1'b0
)(
input logic [WIDTH-1:0] operand_i,
input logic [SHIFT_WIDTH-1:0] shift_amount,
output logic [WIDTH-1:0] result_o
);
logic [SHIFT_WIDTH-1:0][WIDTH-1:0] temp_results;
assign temp_results[SHIFT_WIDTH-1] = operand_i;
generate
genvar i;
// Left Shift
if(MODE==1'b0) begin
for(i=SHIFT_WIDTH-1;i>0;i--) begin
assign temp_results[i-1] = shift_amount[i] ? temp_results[i]<<(2**i) : temp_results[i];
end
assign result_o = shift_amount[0] ? temp_results[0]<<1 : temp_results;
end
// Left Right
else begin
for(i=SHIFT_WIDTH-1;i>0;i--) begin
assign temp_results[i-1] = shift_amount[i] ? temp_results[i]>>(2**i) : temp_results[i];
end
assign result_o = shift_amount[0] ? temp_results[0]>>1 : temp_results;
end
endgenerate
endmodule