/*Interleaver followed by Deinterleaver*/
module test_interleaver(
input data_in,
input valid_in,res,clk,
output reg deinterleaver_out,
output de_valid_out,
output reg counter //for debug purpose
);
integer i;
reg clk_en;
wire valid_out;
reg data_out;
assign valid_out=valid_in;
/*Interleaver branches*/
reg D1;
reg D2 ;
reg D3 ;
reg D4 ;
reg D5 ;
reg D6 ;
reg D7 ;
reg D8 ;
reg D9 ;
reg D10;
reg D11;
reg D12;
reg D13;
reg D14;
reg D15;
reg D16;
reg D17;
reg D18;
reg D19;
reg D20;
reg D21;
reg D22;
reg D23;
reg D24;
reg D25;
reg D26;
reg D27;
reg D28;
reg D29;
reg D30;
reg D31;
reg D32;
wire branch_in ;
reg branch_out;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
assign branch_in = data_in;
/*counter*/
always@(posedge clk or posedge res)
begin
if(res)counter<=5'd0;
else//clk
begin
if(valid_in)counter<=counter+5'd1;
else counter<=counter; //hold
end
end
/*switch and enable control (these 2 modules are tested and work properly)*/
mux_8x32 switch_int(.counter(counter),.branch_out(branch_out), .data_out(data_out));
enable_coder en_bus_int(.counter(counter), .clk_en(clk_en));
/*branch output assignation*/
always@(posedge clk)
begin
if(valid_in)
begin
branch_out<=D1;
branch_out<=D2;
branch_out<=D3;
branch_out<=D4;
branch_out<=D5;
branch_out<=D6;
branch_out<=D7;
branch_out<=D8;
branch_out<=D9;
branch_out<=D10;
branch_out<=D11;
branch_out<=D12;
branch_out<=D13;
branch_out<=D14;
branch_out<=D15;
branch_out<=D16;
branch_out<=D17;
branch_out<=D18;
branch_out<=D19;
branch_out<=D20;
branch_out<=D21;
branch_out<=D22;
branch_out<=D23;
branch_out<=D24;
branch_out<=D25;
branch_out<=D26;
branch_out<=D27;
branch_out<=D28;
branch_out<=D29;
branch_out<=D30;
branch_out<=D31;
branch_out<=D32;
end
else for(i=1;i<33;i=i+1)branch_out<=branch_out;
end
/*shift registers*/
always@(posedge clk)
begin
if(valid_in)
begin
case(clk_en)
32'd1:begin D1<=branch_in;end
32'd2:begin D2<=branch_in;D2<=D2;end
32'd4:begin D3<=branch_in;D3<=D3;D3<=D3;end
32'd8:begin D4<=branch_in;for(i=1;i<4;i=i+1)D4<=D4;end //D1<=D0,D2<=D1,D3<=D2
32'd16:begin D5<=branch_in;for(i=1;i<5;i=i+1)D5<=D5;end
32'd32:begin D6<=branch_in;for(i=1;i<6;i=i+1)D6<=D6;end
32'd64:begin D7<=branch_in;for(i=1;i<7;i=i+1)D7<=D7;end
32'd128:begin D8<=branch_in;for(i=1;i<8;i=i+1)D8<=D8;end
32'd256:begin D9<=branch_in;for(i=1;i<9;i=i+1)D9<=D9;end
32'd512:begin D10<=branch_in;for(i=1;i<10;i=i+1)D10<=D10;end
32'd1024:begin D11<=branch_in;for(i=1;i<11;i=i+1)D11<=D11;end
32'd2048:begin D12<=branch_in;for(i=1;i<12;i=i+1)D12<=D12;end
32'd4096:begin D13<=branch_in;for(i=1;i<13;i=i+1)D13<=D13;end
32'd8192:begin D14<=branch_in;for(i=1;i<14;i=i+1)D14<=D14;end
32'd16384:begin D15<=branch_in;for(i=1;i<15;i=i+1)D15<=D15;end
32'd32768:begin D16<=branch_in;for(i=1;i<16;i=i+1)D16<=D16;end
32'd65536:begin D17<=branch_in;for(i=1;i<17;i=i+1)D17<=D17;end
32'd131072:begin D18<=branch_in;for(i=1;i<18;i=i+1)D18<=D18;end
32'd262144:begin D19<=branch_in;for(i=1;i<19;i=i+1)D19<=D19;end
32'd524288:begin D20<=branch_in;for(i=1;i<20;i=i+1)D20<=D20;end
32'd1048576:begin D21<=branch_in;for(i=1;i<21;i=i+1)D21<=D21;end
32'd2097152:begin D22<=branch_in;for(i=1;i<22;i=i+1)D22<=D22;end
32'd4194304:begin D23<=branch_in;for(i=1;i<23;i=i+1)D23<=D23;end
32'd8388608:begin D24<=branch_in;for(i=1;i<24;i=i+1)D24<=D24;end
32'd16777216:begin D25<=branch_in;for(i=1;i<25;i=i+1)D25<=D25;end
32'd33554432:begin D26<=branch_in;for(i=1;i<26;i=i+1)D26<=D26;end
32'd67108864:begin D27<=branch_in;for(i=1;i<27;i=i+1)D27<=D27;end
32'd134217728:begin D28<=branch_in;for(i=1;i<28;i=i+1)D28<=D28;end
32'd268435456:begin D29<=branch_in;for(i=1;i<29;i=i+1)D29<=D29;end
32'd536870912:begin D30<=branch_in;for(i=1;i<30;i=i+1)D30<=D30;end
32'd1073741824:begin D31<=branch_in;for(i=1;i<31;i=i+1)D31<=D31;end
32'd2147483648:begin D32<=branch_in;for(i=1;i<32;i=i+1)D32<=D32;end
default:D1<=branch_in;
endcase
end
end