# barrel_shift

barrel_shift的目的就是在一个bus中根据idx动态选择一部分数据输出如：

```input    din  [256*dw-1:0];
input    idx  [8-1:0];// 0~132
output   dout [124*dw-1:0];```

```reg   [dw-1:0]s0[124];// widht = 124 + 2^0 - 1
reg   [dw-1:0]s1[125];// widht = 124 + 2^1 - 1
reg   [dw-1:0]s2[127];// widht = 124 + 2^2 - 1
reg   [dw-1:0]s3[131];// widht = 124 + 2^3 - 1
reg   [dw-1:0]s4[139];// widht = 124 + 2^4 - 1
reg   [dw-1:0]s5[155];// widht = 124 + 2^5 - 1
reg   [dw-1:0]s6[187];// widht = 124 + 2^6 - 1
reg   [dw-1:0]s7[251];// widht = 124 + 2^7 - 1
reg   [dw-1:0]s8[256];//input width```

```generate
for(i=0;i<256;i=i+1)begin:REFORM_INPUT
always@(*)begin
s8[i][0+:dw] = din[i*dw +: dw];
end
end
endgenerate```

```generate
for(i=0;i<251;i=i+1)begin:SEL7
if(i<128)begin
always@(*)begin
if(idx[7]==1‘b0)begin
s7[i] = s8[i];
end else begin
s7[i] = s8[i+128];            end
end
end else begin
always@(*)begin
s7[i] = s8[i];//只有在idx[7]==1‘b0的时候才有意义，idx[7]==1‘b1的时候会出现一部分重复数据。
end
end
end
endgenerate```

```generate
for(i=0;i<187;i=i+1)begin:SEL6
always@(*)begin
if(idx[6]==1‘b0)begin
s6[i] = s7[i];
end else begin
s6[i] = s7[i+64];
end
end
end
endgenerate```

```generate
for(i=0;i<155;i=i+1)begin：SEL5
always@(*)begin
if(idx[5]==1‘b0)begin
s5[i] = s6[i];
end else begin
s5[i] = s6[i+32];
end
end
end
endgenerate

generate
for(i=0;i<139;i=i+1)begin:SEL4
always@(*)begin
if(idx[4]==1‘b0)begin
s4[i] = s5[i];
end else begin
s4[i] = s5[i+16];
end
end
end
endgenerate

generate
for(i=0;i<131;i=i+1)begin:SEL3
always@(*)begin
if(idx[3]==1‘b0)begin
s3[i] = s4[i];
end else begin
s3[i] = s4[i+8];
end
end
end
endgenerate

generate
for(i=0;i<127;i=i+1)begin:SEL2
always@(*)begin
if(idx[2]==1‘b0)begin
s2[i] = s3[i];
end else begin
s2[i] = s3[i+4];
end
end
end
endgenerate

generate
for(i=0;i<125;i=i+1)begin:SEL1
always@(*)begin
if(idx[1]==1‘b0)begin
s1[i] = s2[i];
end else begin
s1[i] = s2[i+2];
end
end
end
endgenerate

generate
for(i=0;i<124;i=i+1)begin:SEL0
always@(*)begin
if(idx[0]==1‘b0)begin
s0[i] = s1[i];
end else begin
s0[i] = s1[i+1];
end
end
end
endgenerate```

```generate
for(i=0;i<124;i=i+1)begin:GET_OUT
always@(*)begin
dout[i*dw +: dw] = s0[i];
end
end
endgenerate```

berral shift使用场景，比如两个128的数据中选择124个数据输出就可以将两个128的数据拼起来，然后根据idx输出124个数据。

barrel_shift

(0)
(0)