25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

78 lines
4.0 KiB

  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company: BITSILICA PRIVATE LIMITED
  4. // Design Name: ENCODER CRC INTERLEAVING
  5. // Module Name: encoder_crc_interleaving_rtl
  6. // Project Name: POLAR ENCODER-DECODER
  7. // Target Devices: Zynq UltraScale+ ZCU111 Evaluation Platform (xczu28dr-ffvg1517-2-e)
  8. // Tool Versions: VIVADO 2020.1
  9. // Description: RTL code for interleaving the message attached with CRC, according to a CRC interleaver pattern.
  10. //
  11. //
  12. //////////////////////////////////////////////////////////////////////////////////
  13. module encoder_crc_interleaving_rtl
  14. #(
  15. parameter K = 164,
  16. parameter ITLV = 0,
  17. parameter KMAX = 164
  18. )
  19. (
  20. input wire clock_i, // system clock
  21. input wire reset_ni, // active low, synchronous reset
  22. input wire [K-1:0] msg_i, // input message to be interleaved
  23. output reg [K-1:0] msg_o // output crc interleaved message
  24. );
  25. integer k = 1'd0;
  26. integer j = 1'd0;
  27. integer i = 1'd0;
  28. integer m = 1'd0;
  29. reg [K-1:0] msg_1; // internal register to hold the interleaved message throughout the operation
  30. reg [7:0] pi [K-1:0]; //internal register for interleaving logic
  31. //interleaving pattern for interleaving the given message
  32. 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,
  33. 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,
  34. 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,
  35. 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,
  36. 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,
  37. 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,
  38. 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,
  39. 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};
  40. // instantiating a register(group of FF's) to hold the output and synchronize the module w.r.t clock and reset signals
  41. register #(
  42. .WIDTH(K), // overriding the width of register with the length of output to be registered
  43. .SR(2'b00), // overriding SR inputs of the register
  44. .RST_VAL({K{1'b0}}) // overriding the reset value with expected value in the output when reset is applied
  45. ) REG (
  46. .clk(clock_i), // connecting clock ports
  47. .rstb(reset_ni), // connecting reset ports
  48. .din(msg_1), // connecting input of register with the value that needs to be registered
  49. .dout(msg_o) // connecting the registered output with the output port of current module
  50. );
  51. // combinational always block for performing crc interleaving operation
  52. always_comb begin
  53. if(ITLV == 0) begin
  54. for(i = 0 ; i < K ; i = i+1)
  55. pi[i] = i;
  56. end
  57. else begin
  58. k = 0; begin
  59. for( m = 0 ; (m < KMAX) ; m = m+1)
  60. if(pimax[m] >= (KMAX-K)) begin
  61. pi[k] = (pimax[m]-(KMAX-K));
  62. k = k+1'b1;
  63. end
  64. end
  65. begin
  66. for( j = 'd0 ; j < K ; j = j+1)
  67. msg_1[j] = msg_i[pi[j]];
  68. end
  69. end
  70. end
  71. endmodule