`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: BITSILICA PRIVATE LIMITED // Design Name: ENCODER CRC INTERLEAVING // Module Name: encoder_crc_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 interleaving the message attached with CRC, according to a CRC interleaver pattern. // // ////////////////////////////////////////////////////////////////////////////////// module encoder_crc_interleaving_rtl #( parameter K = 164, parameter ITLV = 0, parameter KMAX = 164 ) ( input wire clock_i, // system clock input wire reset_ni, // active low, synchronous reset input wire [K-1:0] msg_i, // input message to be interleaved output reg [K-1:0] msg_o // output crc interleaved message ); integer k = 1'd0; integer j = 1'd0; integer i = 1'd0; integer m = 1'd0; reg [K-1:0] msg_1; // internal register to hold the interleaved message throughout the operation reg [7:0] pi [K-1:0]; //internal register for interleaving logic //interleaving pattern for interleaving the given message reg [7:0] pimax [163:0] = '{8'd163,8'd162,8'd161,8'd160,8'd159,8'd158,8'd157,8'd156,8'd155,8'd154,8'd153,8'd152,8'd151,8'd150,8'd149,8'd148,8'd147,8'd41,8'd146, 8'd40,8'd145,8'd39,8'd144,8'd38,8'd18,8'd13,8'd143,8'd137,8'd86,8'd80,8'd75,8'd48,8'd37,8'd23,8'd17,8'd12,8'd142,8'd136,8'd131,8'd125, 8'd117,8'd103,8'd100,8'd97,8'd85,8'd79,8'd74,8'd64,8'd47,8'd44,8'd36,8'd33,8'd30,8'd22,8'd16,8'd11,8'd6,8'd141,8'd135,8'd133,8'd130, 8'd128,8'd124,8'd121,8'd116,8'd114,8'd112,8'd109,8'd107,8'd105,8'd102,8'd99,8'd96,8'd94,8'd92,8'd90,8'd84,8'd78,8'd73,8'd68,8'd63,8'd60, 8'd57,8'd55,8'd52,8'd46,8'd43,8'd35,8'd32,8'd29,8'd27,8'd21,8'd15,8'd10,8'd8,8'd5,8'd3,8'd1,8'd140,8'd139,8'd138,8'd134,8'd132,8'd129, 8'd127,8'd126,8'd123,8'd122,8'd120,8'd119,8'd118,8'd115,8'd113,8'd111,8'd110,8'd108,8'd106,8'd104,8'd101,8'd98,8'd95,8'd93,8'd91,8'd89, 8'd88,8'd87,8'd83,8'd82,8'd81,8'd77,8'd76,8'd72,8'd71,8'd70,8'd69,8'd67,8'd66,8'd65,8'd62,8'd61,8'd59,8'd58,8'd56,8'd54,8'd53,8'd51, 8'd50,8'd49,8'd45,8'd42,8'd34,8'd31,8'd28,8'd26,8'd25,8'd24,8'd20,8'd19,8'd14,8'd9,8'd7,8'd4,8'd2,8'd0}; // instantiating a register(group of FF's) to hold the output and synchronize the module w.r.t clock and reset signals register #( .WIDTH(K), // overriding the width of register with the length of output to be registered .SR(2'b00), // overriding SR inputs of the register .RST_VAL({K{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 ); // combinational always block for performing crc interleaving operation always_comb begin if(ITLV == 0) begin for(i = 0 ; i < K ; i = i+1) pi[i] = i; end else begin k = 0; begin for( m = 0 ; (m < KMAX) ; m = m+1) if(pimax[m] >= (KMAX-K)) begin pi[k] = (pimax[m]-(KMAX-K)); k = k+1'b1; end end begin for( j = 'd0 ; j < K ; j = j+1) msg_1[j] = msg_i[pi[j]]; end end end endmodule