| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | 
                        - `timescale 1ns / 1ps
 - //////////////////////////////////////////////////////////////////////////////////
 - // Company: BITSILICA PRIVATE LIMITED
 - // Design Name: ENCODER SUB-BLOCK INTERLEAVING
 - // Module Name: encoder_sub_block_interleaving_rtl
 - // Project Name: POLAR ENCODER-DECODER
 - // Target Devices: Zynq UltraScale+ ZCU111 Evaluation Platform (xczu28dr-ffvg1517-2-e)
 - // Tool Versions: VIVADO 2020.1
 - // Description: RTL code for sub block interleaving, in order to interleave the sub blocks of encoded codeword.
 - //
 - //////////////////////////////////////////////////////////////////////////////////
 - 
 - module encoder_sub_block_interleaving_rtl#(
 -   parameter N=512                   // input and output sequence length
 -                                     // parameter to break down the input message into 32- sub blocks of euqal length, S=N/32
 - ) (
 -   input  wire          clock_i,
 -   input  wire          reset_ni,
 -   input  wire  [N-1:0] msg_i,       // input message for sub block interleaver
 -   output  reg  [N-1:0] msg_o        // output message after sub block interleaving
 - );
 - 	
 -   localparam S=(N >> 3'd5);         // parameter to break down the input message into 32- sub blocks of euqal length, S=N/32
 - 
 -   reg   [4:0] sbi_pat [31:0] = '{5'd31, 5'd30, 5'd29, 5'd27, 
 -                                  5'd28, 5'd26,5'd25, 5'd24, 
 -                                  5'd23,5'd15,5'd22, 5'd14, 
 -                                  5'd21, 5'd13, 5'd20, 5'd12, 
 -                                  5'd19, 5'd11, 5'd18, 5'd10, 
 -                                  5'd17, 5'd9, 5'd16, 5'd8, 
 -                                  5'd7, 5'd6, 5'd5, 5'd3, 
 -                                  5'd4, 5'd2, 5'd1, 5'd0};                           
 -   logic [N-1:0] msg_1;
 -   logic         sub_blocks [31:0] [S-1:0];       //register to store the sub divided blocks
 -   logic         temp       [31:0] [S-1:0];       //register to store the interleaved sub blocks
 -     
 -   integer i,j,k,p,q,r;                           //looping variables
 - 
 -   // instantiating a register(group of FF's) to hold the output and synchronize the module w.r.t clock and reset signals
 -   register #(
 -     .WIDTH(N),                       // overriding the width of register with the length of output to be registered  
 -     .SR(2'b00),                      // overriding SR inputs of the register
 -     .RST_VAL({N{1'b0}})              // overriding the reset value with expected value in the output when reset is applied
 -   ) REG (
 -     .clk(clock_i),                   // connecting clock ports
 -     .rstb(reset_ni),                 // connecting reset ports
 -     .din(msg_1),                     // connecting input of register with the value that needs to be registered
 -     .dout(msg_o)                     // connecting the registered output with the output port of current module
 -   );
 - 
 -   always_comb begin
 -   //breaking down the message into 32 bit sub blocks of width N/32
 -     begin
 -       for(j = 0 ; j < 32 ; j=j+1) begin
 -         for (i = 0 ; i < S ; i = i+1) begin
 - 		    sub_blocks[j][i] = msg_i[(j*S)+i];
 - 		end
 - 	end
 -   end
 - 	 
 -   //interleaving the subblocks according to the interleaving pattern	 
 -     begin
 -       for(p = 0 ; p < 32 ; p = p+1) begin
 -         temp[p] = sub_blocks[sbi_pat[p]];
 -       end
 -     end
 - 	 
 -   //assigning interleaved bits to the output
 -     begin
 -       for(q = 0 ; q < 32 ; q = q+1) begin
 -         for (r = 0 ; r < S ; r = r+1) begin
 -           msg_1[(q*S)+r] = temp[q][r];
 -         end
 -       end
 -     end
 -   end
 -   
 - endmodule
 
 
  |