const_enc.v
上传用户:jin985143
上传日期:2020-09-30
资源大小:278k
文件大小:11k
源码类别:

Modem编程

开发平台:

VHDL

  1. /* *****************************************************************
  2.  *
  3.  *  This file is part of the
  4.  *  
  5.  *  Tone Order and Constellation Encoder Core.
  6.  *
  7.  *  Description:
  8.  *
  9.  *  The conste_enc module implements the tone ordering and 
  10.  *  constellation encoding as described in ITU G.992.1
  11.  *  
  12.  ********************************************************************* 
  13.  *  Copyright (C) 2007 Guenter Dannoritzer
  14.  *
  15.  *   This source is free software; you can redistribute it
  16.  *   and/or modify it under the terms of the 
  17.  *             GNU General Public License
  18.  *   as published by the Free Software Foundation; 
  19.  *   either version 3 of the License,
  20.  *   or (at your option) any later version.
  21.  *
  22.  *   This source is distributed in the hope 
  23.  *   that it will be useful, but WITHOUT ANY WARRANTY;
  24.  *   without even the implied warranty of MERCHANTABILITY
  25.  *   or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26.  *   GNU General Public License for more details.
  27.  *
  28.  *   You should have received a copy of the
  29.  *   GNU General Public License along with this source.
  30.  *   If not, see <http://www.gnu.org/licenses/>.
  31.  *
  32.  * *****************************************************************/
  33. module const_encoder( 
  34.                 clk,
  35.                 reset,
  36.                 fast_ready_o,
  37.                 we_fast_data_i,
  38.                 fast_data_i,
  39.                 inter_ready_o,
  40.                 we_inter_data_i,
  41.                 inter_data_i,
  42.                 addr_i,
  43.                 we_conf_i,
  44.                 conf_data_i,
  45.                 xy_ready_o,
  46.                 carrier_num_o,
  47.                 x_o,
  48.                 y_o);
  49. `include "parameters.vh"
  50.               
  51. //
  52. // parameter
  53. // 
  54. input                 clk;
  55. input                 reset;
  56. output                fast_ready_o;
  57. input                 we_fast_data_i;
  58. input   [DW-1:0]      fast_data_i;
  59. output                inter_ready_o;
  60. input                 we_inter_data_i;
  61. input   [DW-1:0]      inter_data_i;
  62. input   [CONFAW-1:0]  addr_i;
  63. input                 we_conf_i;
  64. input   [CONFDW-1:0]  conf_data_i;
  65. output                xy_ready_o;
  66. output  [CNUMW-1:0]   carrier_num_o;
  67. output  [CONSTW-1:0]  x_o;            reg signed [CONSTW-1:0] x_o;
  68. output  [CONSTW-1:0]  y_o;            reg signed [CONSTW-1:0] y_o;
  69. //
  70. // local wire/regs
  71. //
  72. wire    [DW-1:0]          fast_data_o;
  73. wire    [DW-1:0]          inter_data_o;
  74. reg   [SHIFTW-1:0]        fast_shift_reg;
  75. reg   [SHIFTW-1:0]        inter_shift_reg;
  76. reg   [MAXBITNUM-1:0]     cin;
  77. reg   [CONFDW-1:0]        bit_load;
  78. reg   [4:0]               msb;
  79. reg   [1:0]               msb_x;
  80. reg   [1:0]               msb_y;
  81. reg   [CONFDW-1:0]        BitLoading [0:REG_MEM_LEN-1];
  82. reg   [CONFDW-1:0]        CarrierNumber [0:REG_MEM_LEN-1];
  83. reg   [USED_C_REG_W-1:0]  UsedCarrier;
  84. reg   [F_BITS_W-1:0]      FastBits;
  85. //
  86. // intantiate the fast path and interleaved path FIFOs
  87. //
  88. fifo  #(.AWIDTH(AW), .DWIDTH(DW))
  89.       fifo_fast ( .clk(clk),
  90.                   .reset(reset),
  91.                   .empty_o(fast_empty_o),
  92.                   .full_o(fast_full_o),
  93.                   .one_available_o(fast_one_available_o),
  94.                   .two_available_o(fast_two_available_o),
  95.                   .we_i(we_fast_i),
  96.                   .data_i(fast_data_i),
  97.                   .re_i(re_fast_i),
  98.                   .data_o(fast_data_o)
  99.                   );
  100. fifo  #(.AWIDTH(AW), .DWIDTH(DW))
  101.       fifo_inter ( .clk(clk),
  102.                   .reset(reset),
  103.                   .empty_o(inter_empty_o),
  104.                   .full_o(inter_full_o),
  105.                   .one_available_o(inter_one_available_o),
  106.                   .two_available_o(inter_two_available_o),
  107.                   .we_i(we_inter_i),
  108.                   .data_i(inter_data_i),
  109.                   .re_i(re_inter_i),
  110.                   .data_o(inter_data_o)
  111.                   );
  112.      
  113. //
  114. // configuration register access
  115. //
  116. always @(posedge clk or posedge reset) begin
  117.   if(reset) begin
  118.     UsedCarrier <= 0;
  119.     FastBits <= 0;
  120.   end
  121.   else begin
  122.     if(we_conf_i) begin
  123.       if(addr_i >= 0 && addr_i < C_NUM_ST_ADR) begin
  124.         BitLoading[addr_i] <= conf_data_i;
  125.       end
  126.       else if(addr_i >= C_NUM_ST_ADR && addr_i < USED_C_ADR) begin
  127.         CarrierNumber[addr_i - C_NUM_ST_ADR] <= conf_data_i;
  128.       end
  129.       else if(addr_i == USED_C_ADR) begin
  130.         UsedCarrier <= conf_data_i;
  131.       end
  132.       else if(addr_i == F_BITS_ADR) begin
  133.         FastBits <= conf_data_i;
  134.       end
  135.     end
  136.   end
  137.     
  138. end
  139. //
  140. // constellation mapping
  141. //
  142. always @(posedge reset or posedge clk) begin
  143.   if(reset) begin
  144.     x_o <= 9'b0;
  145.     y_o <= 9'b0;
  146.   end
  147.   else begin
  148.     case (bit_load)
  149.       4'b0010:  begin // #2
  150.                   x_o <= {cin[1], cin[1], cin[1], cin[1], cin[1], cin[1], cin[1], cin[1], 1'b1};
  151.                   y_o <= {cin[0], cin[0], cin[0], cin[0], cin[0], cin[0], cin[0], cin[0], 1'b1};
  152.                 end
  153.       
  154.       4'b0011:  begin // #3
  155.                   case (cin[2:0])
  156.                     3'b000: begin x_o <= 9'b000000001; y_o <= 9'b000000001; end
  157.                     3'b001: begin x_o <= 9'b000000001; y_o <= 9'b111111111; end
  158.                     3'b010: begin x_o <= 9'b111111111; y_o <= 9'b000000001; end
  159.                     3'b011: begin x_o <= 9'b111111111; y_o <= 9'b111111111; end
  160.                     3'b100: begin x_o <= 9'b111111101; y_o <= 9'b000000001; end
  161.                     3'b101: begin x_o <= 9'b000000001; y_o <= 9'b000000011; end
  162.                     3'b110: begin x_o <= 9'b111111111; y_o <= 9'b111111101; end
  163.                     3'b111: begin x_o <= 9'b000000011; y_o <= 9'b111111111; end
  164.                   endcase
  165.                 end
  166.       
  167.       4'b0100:  begin // #4
  168.                   x_o <= {cin[3], cin[3], cin[3], cin[3], cin[3], cin[3], cin[3], cin[1], 1'b1};
  169.                   y_o <= {cin[2], cin[2], cin[2], cin[2], cin[2], cin[2], cin[2], cin[0], 1'b1};
  170.                 end
  171.       
  172.       4'b0101:  begin // #5
  173.                   map_msb(cin[4:0], msb_x, msb_y);
  174.                   x_o <= {msb_x[1], msb_x[1], msb_x[1], msb_x[1], msb_x[1], msb_x[1], msb_x[0], cin[1], 1'b1};
  175.                   y_o <= {msb_y[1], msb_y[1], msb_y[1], msb_y[1], msb_y[1], msb_y[1], msb_y[0], cin[0], 1'b1};
  176.                 end
  177.       
  178.       4'b0110:  begin // #6
  179.                   x_o <= {cin[4], cin[4], cin[4], cin[4], cin[4], cin[4], cin[2], cin[0], 1'b1};
  180.                   y_o <= {cin[5], cin[5], cin[5], cin[5], cin[5], cin[5], cin[3], cin[1], 1'b1};
  181.                 end
  182.       
  183.       4'b0111:  begin // #7
  184.                   map_msb(cin[6:2], msb_x, msb_y);
  185.                   x_o <= {msb_x[1], msb_x[1], msb_x[1], msb_x[1], msb_x[1], msb_x[0], cin[2], cin[0], 1'b1};
  186.                   y_o <= {msb_y[1], msb_y[1], msb_y[1], msb_y[1], msb_y[1], msb_y[0], cin[3], cin[1], 1'b1};
  187.                 end
  188.       4'b1000:  begin // #8
  189.                   x_o <= {cin[6], cin[6], cin[6], cin[6], cin[6], cin[4], cin[2], cin[0], 1'b1};
  190.                   y_o <= {cin[7], cin[7], cin[7], cin[7], cin[7], cin[5], cin[3], cin[1], 1'b1};
  191.                 end
  192.       
  193.       4'b1001:  begin // #9
  194.                   map_msb(cin[7:3], msb_x, msb_y);
  195.                   x_o <= {msb_x[1], msb_x[1], msb_x[1], msb_x[1], msb_x[0], cin[4], cin[2], cin[0], 1'b1};
  196.                   y_o <= {msb_y[1], msb_y[1], msb_y[1], msb_y[1], msb_y[0], cin[5], cin[3], cin[1], 1'b1};
  197.                 end
  198.       4'b1010:  begin // #10
  199.                   x_o <= {cin[8], cin[8], cin[8], cin[8], cin[6], cin[4], cin[2], cin[0], 1'b1};
  200.                   y_o <= {cin[9], cin[9], cin[9], cin[9], cin[7], cin[5], cin[3], cin[1], 1'b1};
  201.                 end
  202.       
  203.       4'b1011:  begin // #11
  204.                   map_msb(cin[8:4], msb_x, msb_y);
  205.                   x_o <= {msb_x[1], msb_x[1], msb_x[1], msb_x[0], cin[6], cin[4], cin[2], cin[0], 1'b1};
  206.                   y_o <= {msb_y[1], msb_y[1], msb_y[1], msb_y[0], cin[7], cin[5], cin[3], cin[1], 1'b1};
  207.                 end
  208.       4'b1100:  begin // #12
  209.                   x_o <= {cin[10], cin[10], cin[10], cin[8], cin[6], cin[4], cin[2], cin[0], 1'b1};
  210.                   y_o <= {cin[11], cin[11], cin[11], cin[9], cin[7], cin[5], cin[3], cin[1], 1'b1};
  211.                 end
  212.       
  213.       4'b1101:  begin // #13
  214.                   map_msb(cin[9:5], msb_x, msb_y);
  215.                   x_o <= {msb_x[1], msb_x[1], msb_x[0], cin[8], cin[6], cin[4], cin[2], cin[0], 1'b1};
  216.                   y_o <= {msb_y[1], msb_y[1], msb_y[0], cin[9], cin[7], cin[5], cin[3], cin[1], 1'b1};
  217.                 end
  218.       4'b1110:  begin // #14
  219.                   x_o <= {cin[12], cin[12], cin[10], cin[8], cin[6], cin[4], cin[2], cin[0], 1'b1};
  220.                   y_o <= {cin[13], cin[13], cin[11], cin[9], cin[7], cin[5], cin[3], cin[1], 1'b1};
  221.                 end
  222.       
  223.       4'b1111:  begin // #15 TODO
  224.                   map_msb(cin[10:6], msb_x, msb_y);
  225.                   x_o <= {msb_x[1], msb_x[0], cin[10], cin[8], cin[6], cin[4], cin[2], cin[0], 1'b1};
  226.                   y_o <= {msb_y[1], msb_y[0], cin[11], cin[9], cin[7], cin[5], cin[3], cin[1], 1'b1};
  227.                 end
  228.     endcase
  229.   end
  230. end
  231. //
  232. // determine the top two bits of X and Y based on table 7-12 in G.992.1
  233. //
  234. task map_msb(input [4:0] t_msb, output [1:0] t_msb_x, output [1:0] t_msb_y );
  235.   begin
  236.   case (t_msb)
  237.     5'b00000: begin t_msb_x <= 2'b00; t_msb_y <= 2'b00; end
  238.     5'b00001: begin t_msb_x <= 2'b00; t_msb_y <= 2'b00; end
  239.     5'b00010: begin t_msb_x <= 2'b00; t_msb_y <= 2'b00; end
  240.     5'b00011: begin t_msb_x <= 2'b00; t_msb_y <= 2'b00; end
  241.     5'b00100: begin t_msb_x <= 2'b00; t_msb_y <= 2'b11; end
  242.     5'b00101: begin t_msb_x <= 2'b00; t_msb_y <= 2'b11; end
  243.     5'b00110: begin t_msb_x <= 2'b00; t_msb_y <= 2'b11; end
  244.     5'b00111: begin t_msb_x <= 2'b00; t_msb_y <= 2'b11; end
  245.     
  246.     5'b01000: begin t_msb_x <= 2'b11; t_msb_y <= 2'b00; end
  247.     5'b01001: begin t_msb_x <= 2'b11; t_msb_y <= 2'b00; end
  248.     5'b01010: begin t_msb_x <= 2'b11; t_msb_y <= 2'b00; end
  249.     5'b01011: begin t_msb_x <= 2'b11; t_msb_y <= 2'b00; end
  250.     5'b01100: begin t_msb_x <= 2'b11; t_msb_y <= 2'b11; end
  251.     5'b01101: begin t_msb_x <= 2'b11; t_msb_y <= 2'b11; end
  252.     5'b01110: begin t_msb_x <= 2'b11; t_msb_y <= 2'b11; end
  253.     5'b01111: begin t_msb_x <= 2'b11; t_msb_y <= 2'b11; end
  254.     5'b10000: begin t_msb_x <= 2'b01; t_msb_y <= 2'b00; end
  255.     5'b10001: begin t_msb_x <= 2'b01; t_msb_y <= 2'b00; end
  256.     5'b10010: begin t_msb_x <= 2'b10; t_msb_y <= 2'b00; end
  257.     5'b10011: begin t_msb_x <= 2'b10; t_msb_y <= 2'b00; end
  258.     5'b10100: begin t_msb_x <= 2'b00; t_msb_y <= 2'b01; end
  259.     5'b10101: begin t_msb_x <= 2'b00; t_msb_y <= 2'b10; end
  260.     5'b10110: begin t_msb_x <= 2'b00; t_msb_y <= 2'b01; end
  261.     5'b10111: begin t_msb_x <= 2'b00; t_msb_y <= 2'b10; end
  262.     5'b11000: begin t_msb_x <= 2'b11; t_msb_y <= 2'b01; end
  263.     5'b11001: begin t_msb_x <= 2'b11; t_msb_y <= 2'b10; end
  264.     5'b11010: begin t_msb_x <= 2'b11; t_msb_y <= 2'b01; end
  265.     5'b11011: begin t_msb_x <= 2'b11; t_msb_y <= 2'b10; end
  266.     
  267.     5'b11100: begin t_msb_x <= 2'b01; t_msb_y <= 2'b11; end
  268.     5'b11101: begin t_msb_x <= 2'b01; t_msb_y <= 2'b11; end
  269.     5'b11110: begin t_msb_x <= 2'b10; t_msb_y <= 2'b11; end
  270.     5'b11111: begin t_msb_x <= 2'b10; t_msb_y <= 2'b11; end
  271.     
  272.   endcase
  273. end
  274. endtask
  275. endmodule