Parameters.bsv
上传用户:aoptech
上传日期:2014-09-22
资源大小:784k
文件大小:16k
源码类别:

3G开发

开发平台:

Others

  1. //----------------------------------------------------------------------//
  2. // The MIT License 
  3. // 
  4. // Copyright (c) 2007 Alfred Man Cheuk Ng, mcn02@mit.edu 
  5. // 
  6. // Permission is hereby granted, free of charge, to any person 
  7. // obtaining a copy of this software and associated documentation 
  8. // files (the "Software"), to deal in the Software without 
  9. // restriction, including without limitation the rights to use,
  10. // copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the
  12. // Software is furnished to do so, subject to the following conditions:
  13. // 
  14. // The above copyright notice and this permission notice shall be
  15. // included in all copies or substantial portions of the Software.
  16. // 
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  19. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  21. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  22. // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  23. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24. // OTHER DEALINGS IN THE SOFTWARE.
  25. //----------------------------------------------------------------------//
  26. // WiMAX 802.16 Parameters
  27. import Controls::*;
  28. import Vector::*;
  29. import FPComplex::*;
  30. import LibraryFunctions::*;
  31. import Complex::*;
  32. import DataTypes::*;
  33. import Interfaces::*;
  34. import ConvEncoder::*;
  35. import Puncturer::*;
  36. import GetPut::*;
  37. import Connectable::*;
  38. import ReedEncoder::*;
  39. // Global Parameters:
  40. typedef enum {
  41.    R0,  // BPSK 1/2
  42.    R1,  // QPSK 1/2
  43.    R2,  // QPSK 3/4
  44.    R3,  // 16-QAM 1/2
  45.    R4,  // 16-QAM 3/4
  46.    R5,  // 64-QAM 2/3
  47.    R6   // 64-QAM 3/4
  48. } Rate deriving(Eq, Bits);
  49. // may be an extra field for DL: sendPremable
  50. typedef struct {
  51.    Bool       firstSymbol; 
  52.    Rate       rate;
  53.    CPSizeCtrl cpSize;
  54. } TXGlobalCtrl deriving(Eq, Bits);
  55. typedef 2  TXFPIPrec; // fixedpoint integer precision
  56. typedef 14 TXFPFPrec; // fixedpoint fractional precision
  57. typedef 2  RXFPIPrec; // rx fixedpoint integer precision
  58. typedef 14 RXFPFPrec; // rx fixedpoint fractional precision
  59. typedef TXGlobalCtrl RXGlobalCtrl; // same as tx
  60. // Local Parameters:
  61. // Scrambler:
  62. typedef  8 ScramblerDataSz;    
  63. typedef 15 ScramblerShifterSz;
  64. Bit#(ScramblerShifterSz) scramblerGenPoly = 'b110000000000000;
  65. typedef ScramblerCtrl#(ScramblerDataSz,ScramblerShifterSz) 
  66. TXScramblerCtrl;
  67. typedef struct {
  68.    TXScramblerCtrl  scramblerCtrl;
  69.    TXGlobalCtrl     globalCtrl;
  70. } TXScramblerAndGlobalCtrl deriving(Eq, Bits); 
  71. function TXScramblerCtrl 
  72.    scramblerMapCtrl(TXScramblerAndGlobalCtrl ctrl);
  73.    return ctrl.scramblerCtrl;
  74. endfunction
  75. function TXGlobalCtrl 
  76.    scramblerConvertCtrl(TXScramblerAndGlobalCtrl ctrl);
  77.     return ctrl.globalCtrl;
  78. endfunction
  79. //Reed Solomon Encoder:
  80. typedef 8 ReedEncoderDataSz;
  81. function ReedSolomonCtrl#(8) reedEncoderMapCtrl(TXGlobalCtrl ctrl);
  82.     return case (ctrl.rate) matches
  83.                R0   : ReedSolomonCtrl{in:12, out:0};
  84.                R1   : ReedSolomonCtrl{in:24, out:8};
  85.                R2   : ReedSolomonCtrl{in:36, out:4};
  86.                R3   : ReedSolomonCtrl{in:48, out:16};
  87.                R4   : ReedSolomonCtrl{in:72, out:8};
  88.                R5   : ReedSolomonCtrl{in:96, out:12};
  89.                R6   : ReedSolomonCtrl{in:108, out:12};
  90.            endcase;
  91. endfunction
  92. // Conv. Encoder:
  93. typedef 8  ConvEncoderInDataSz;
  94. typedef TMul#(2,ConvEncoderInDataSz) ConvEncoderOutDataSz;
  95. typedef  7 ConvEncoderHistSz;
  96. Bit#(ConvEncoderHistSz) convEncoderG1 = 'b1111001;
  97. Bit#(ConvEncoderHistSz) convEncoderG2 = 'b1011011;
  98. // Puncturer:
  99. typedef ConvEncoderOutDataSz        PuncturerInDataSz;
  100. typedef 24                          PuncturerOutDataSz;
  101. // typedef TMul#(2,PuncturerInDataSz)  PuncturerInBufSz;  // to be safe 2x inDataSz
  102. // typedef TMul#(2,PuncturerOutDataSz) PuncturerOutBufSz; // to be safe 2x outDataSz 
  103. // typedef TDiv#(PuncturerInDataSz,4)  PuncturerF1Sz; // no. of 2/3 in parallel
  104. // typedef TDiv#(PuncturerInDataSz,6)  PuncturerF2Sz; // no. of 3/4 in parallel
  105. // typedef TDiv#(PuncturerInDataSz,10) PuncturerF3Sz; // no. of 5/6 in parallel
  106. typedef TAdd#(PuncturerInDataSz,10) PuncturerInBufSz;  // to be safe 2x inDataSz
  107. typedef TAdd#(PuncturerInBufSz,PuncturerOutDataSz) PuncturerOutBufSz; // to be safe 2x outDataSz 
  108. typedef 1  PuncturerF1Sz; // no. of 2/3 in parallel
  109. typedef 1  PuncturerF2Sz; // no. of 3/4 in parallel
  110. typedef 1 PuncturerF3Sz; // no. of 5/6 in parallel
  111. function Bit#(3) puncturerF1 (Bit#(4) x);
  112.    return {x[3:3],x[1:0]};
  113. endfunction // Bit
  114.    
  115. function Bit#(4) puncturerF2 (Bit#(6) x);
  116.    return {x[4:3],x[1:0]};
  117. endfunction // Bit
  118. // not used in WiFi   
  119. function Bit#(6) puncturerF3 (Bit#(10) x);
  120.    return {x[8:7],x[4:3],x[1:0]};
  121. endfunction // Bit
  122. function PuncturerCtrl puncturerMapCtrl(TXGlobalCtrl ctrl);
  123.    return case (ctrl.rate)
  124.      R0: Half;
  125.      R1: TwoThird;
  126.      R2: FiveSixth;
  127.      R3: TwoThird;
  128.      R4: FiveSixth;
  129.      R5: ThreeFourth;
  130.      R6: FiveSixth;
  131.   endcase; // case(rate)
  132. endfunction // Bit  
  133. // Encoder: (Construct from ConvEncoder & Puncturer for wifi)
  134. typedef ReedEncoderDataSz   EncoderInDataSz;
  135. typedef PuncturerOutDataSz  EncoderOutDataSz;
  136. // Interleaver:
  137. typedef PuncturerOutDataSz  InterleaverDataSz;
  138. typedef 192                 MinNcbps;
  139. // used for both interleaver, mapper
  140. function Modulation modulationMapCtrl(TXGlobalCtrl ctrl);
  141.    return case (ctrl.rate)
  142.      R0: BPSK;
  143.      R1: QPSK;
  144.      R2: QPSK;
  145.      R3: QAM_16;
  146.      R4: QAM_16;
  147.      R5: QAM_64;
  148.      R6: QAM_64;
  149.           endcase;
  150. endfunction
  151. function Integer interleaverGetIdx(Modulation m, Integer k);
  152.    Integer s = 1;  
  153.    Integer ncbps = valueOf(MinNcbps);
  154.    case (m)
  155.       BPSK:   
  156.       begin
  157.  ncbps = ncbps;
  158.  s = 1;
  159.       end
  160.       QPSK:   
  161.       begin
  162.  ncbps = 2*ncbps;
  163.  s = 1;
  164.       end
  165.       QAM_16: 
  166.       begin
  167.  ncbps = 4*ncbps;
  168.  s = 2;
  169.       end
  170.       QAM_64: 
  171.       begin
  172.  ncbps = 6*ncbps;
  173.  s = 3;
  174.       end
  175.    endcase // case(m)
  176.    Integer i = (ncbps/12) * (k%12) + k/12;
  177.    Integer f= (i/s);
  178.    Integer j = s*f + (i + ncbps - (12*i/ncbps))%s;
  179.    return (k >= ncbps) ? k : j;
  180. endfunction
  181. //Mapper:
  182. typedef InterleaverDataSz MapperInDataSz;
  183. typedef 192               MapperOutDataSz;
  184. // mapperNegateInput = True implies: map 1 to -ve map 0 to +ve
  185. //                     False implies: mape 1 to +ve map 1 to -ve
  186. Bool mapperNegateInput = True; 
  187. //Pilot:
  188. typedef  MapperOutDataSz  PilotInDataSz;
  189. typedef  256              PilotOutDataSz;
  190. typedef   11              PilotPRBSSz;
  191. Bit#(PilotPRBSSz) pilotPRBSMask = 'b10100000000;
  192. Bit#(PilotPRBSSz) pilotInitSeq  = 'b01010101010; 
  193. // DL = 'h11111111100 (spec say 7FF, but we start after preamble)
  194. // UL = 'h01010101010 (spec say 555, but we start after preamble)
  195. function PilotInsertCtrl pilotMapCtrl(TXGlobalCtrl ctrl);
  196.    return ctrl.firstSymbol ? PilotRst : PilotNorm;
  197. endfunction 
  198. function Symbol#(PilotOutDataSz,TXFPIPrec,TXFPFPrec) 
  199.    pilotAdder(Symbol#(PilotInDataSz,TXFPIPrec,TXFPFPrec) x,
  200.       Bit#(1) ppv);
  201.    
  202.    Integer i =0, j = 0;
  203.    // assume all guards initially
  204.    Symbol#(PilotOutDataSz,TXFPIPrec,TXFPFPrec) syms = replicate(cmplx(0,0));
  205.    // data carriers
  206.    for(i = 29; i < 40; i = i + 1, j = j + 1)
  207.       syms[i] = x[j];
  208.    for(i = 41; i < 65; i = i + 1, j = j + 1)
  209.       syms[i] = x[j]; 
  210.    for(i = 66; i < 90 ; i = i + 1, j = j + 1)
  211.       syms[i] = x[j];  
  212.    for(i = 91; i < 115 ; i = i + 1, j = j + 1)
  213.       syms[i] = x[j];   
  214.    for(i = 116; i < 128 ; i = i + 1, j = j + 1)
  215.       syms[i] = x[j];
  216.    for(i = 129; i < 141 ; i = i + 1, j = j + 1)
  217.       syms[i] = x[j];
  218.    for(i = 142; i < 166 ; i = i + 1, j = j + 1)
  219.       syms[i] = x[j];
  220.    for(i = 167; i < 191 ; i = i + 1, j = j + 1)
  221.       syms[i] = x[j];
  222.    for(i = 192; i < 216 ; i = i + 1, j = j + 1)
  223.       syms[i] = x[j];
  224.    for(i = 217; i < 228 ; i = i + 1, j = j + 1)
  225.       syms[i] = x[j];
  226.    
  227.    //pilot carriers 
  228.    syms[40]  = mapBPSK(True,  ppv);  // UL: T, DL: T
  229.    syms[65]  = mapBPSK(False, ppv);  // UL: F, DL: F
  230.    syms[90]  = mapBPSK(True,  ppv);  // UL: T, DL: T
  231.    syms[115] = mapBPSK(False, ppv);  // UL: F, DL: F
  232.    syms[141] = mapBPSK(True,  ppv);  // UL: T, DL: F
  233.    syms[166] = mapBPSK(True,  ppv);  // UL: T, DL: T
  234.    syms[191] = mapBPSK(True,  ppv);  // UL: T, DL: F
  235.    syms[216] = mapBPSK(True,  ppv);  // UL: T, DL: T
  236.    
  237.    return syms;
  238. endfunction
  239. // FFT/IFFT:
  240. typedef PilotOutDataSz FFTIFFTSz;
  241. typedef 1              FFTIFFTNoBfly;
  242. // CPInsert:
  243. typedef FFTIFFTSz CPInsertDataSz;
  244. function CPInsertCtrl cpInsertMapCtrl(TXGlobalCtrl ctrl);
  245.    // UL: SendLong, DL: SendBoth
  246.    let fstEle = ctrl.firstSymbol ? SendLong : SendNone; 
  247.    return tuple2(fstEle, ctrl.cpSize);
  248. endfunction
  249. // Synchronizer:
  250. // specific for OFDM specification
  251. typedef 64  SSLen;        // short symbol length (auto correlation delay 16)
  252. typedef 128 LSLen;        // long symbol length (auto correlation delay 64)
  253. typedef 320 LSStart;      // when the long symbol start
  254. typedef 640 SignalStart;  // when the signal (useful data) start
  255. typedef 320 SymbolLen;    // one symbol length
  256. // implementation parameters
  257. typedef 192 SSyncPos;      // short symbol synchronization position ( 2*SSLen <= this value < LBStart)
  258. typedef 448 LSyncPos;      // long symbol synchronization position  ( LSStart <= this value < SinglaStart)       
  259. typedef 16  FreqMeanLen;   // how many samples we collect to calculate CFO (power of 2, at most 32, bigger == more tolerant to noise)
  260. typedef 720 TimeResetPos;  // reset time if coarCounter is larger than this, must be bigger than SignalStart
  261. typedef 2   CORDICPipe;    // number of pipeline stage of the cordic
  262. typedef 16  CORDICIter;    // number of cordic iterations (max 16 iterations, must be multiple of CORDICPIPE)
  263. typedef RXFPIPrec  SyncIntPrec;   // number of integer bits for internal arithmetic
  264. typedef RXFPFPrec  SyncFractPrec; // number of fractional bits for internal arithmetic 
  265. // Unserializer:
  266. typedef FFTIFFTSz  UnserialOutDataSz;
  267. // ChannelEstimator:
  268. typedef UnserialOutDataSz  CEstInDataSz;
  269. typedef PilotInDataSz      CEstOutDataSz;
  270. function Symbol#(CEstOutDataSz,RXFPIPrec,RXFPFPrec) pilotRemover
  271.    (Symbol#(CEstInDataSz,RXFPIPrec,RXFPFPrec) x);   
  272.    Integer i =0, j = 0;
  273.    // assume all guards initially
  274.    Symbol#(CEstOutDataSz,RXFPIPrec,RXFPFPrec) syms = newVector;
  275.   
  276.    // data carriers
  277.    for(i = 29; i < 40; i = i + 1, j = j + 1)
  278.       syms[j] = x[i];
  279.    for(i = 41; i < 65; i = i + 1, j = j + 1)
  280.       syms[j] = x[i]; 
  281.    for(i = 66; i < 90 ; i = i + 1, j = j + 1)
  282.       syms[j] = x[i];  
  283.    for(i = 91; i < 115 ; i = i + 1, j = j + 1)
  284.       syms[j] = x[i];   
  285.    for(i = 116; i < 128 ; i = i + 1, j = j + 1)
  286.       syms[j] = x[i];
  287.    for(i = 129; i < 141 ; i = i + 1, j = j + 1)
  288.       syms[j] = x[i];
  289.    for(i = 142; i < 166 ; i = i + 1, j = j + 1)
  290.       syms[j] = x[i];
  291.    for(i = 167; i < 191 ; i = i + 1, j = j + 1)
  292.       syms[j] = x[i];
  293.    for(i = 192; i < 216 ; i = i + 1, j = j + 1)
  294.       syms[j] = x[i];
  295.    for(i = 217; i < 228 ; i = i + 1, j = j + 1)
  296.       syms[j] = x[i];
  297.    return syms;
  298. endfunction
  299. // Demapper:
  300. typedef CEstOutDataSz  DemapperInDataSz;
  301. typedef MapperInDataSz DemapperOutDataSz;
  302. Bool demapperNegateOutput = mapperNegateInput;
  303. // Deinterleaver:
  304. typedef DemapperOutDataSz DeinterleaverDataSz;
  305. function Integer deinterleaverGetIndex(Modulation m, Integer j);
  306.    Integer s = 1;  
  307.    Integer ncbps = valueOf(MinNcbps);
  308.    case (m)
  309.       BPSK:  
  310.       begin
  311.  ncbps = ncbps;
  312.  s = 1;
  313.       end
  314.       QPSK:  
  315.       begin
  316.  ncbps = 2*ncbps;
  317.  s = 1;
  318.       end
  319.       QAM_16:
  320.       begin
  321.  ncbps = 4*ncbps;
  322.  s = 2;
  323.       end
  324.       QAM_64:
  325.       begin
  326.  ncbps = 6*ncbps;
  327.  s = 3;
  328.       end
  329.    endcase // case(m)
  330.    Integer f = (j/s);
  331.    Integer i = s*f + (j + (12*j/ncbps))%s;
  332.    Integer k = 12*i-(ncbps-1)*(12*i/ncbps);
  333.    return (j >= ncbps) ? j : k;
  334. endfunction   
  335. // Depuncturer:
  336. typedef DemapperOutDataSz  DepuncturerInDataSz;
  337. typedef PuncturerInDataSz  DepuncturerOutDataSz;
  338. // typedef TMul#(2,DepuncturerInDataSz)   DepuncturerInBufSz;  // to be safe 2x inDataSz
  339. // typedef TMul#(2,DepuncturerOutDataSz)  DepuncturerOutBufSz; // to be safe 2x outDataSz 
  340. // typedef TDiv#(DepuncturerOutDataSz,4)  DepuncturerF1Sz;     // no. of 2/3 in parallel
  341. // typedef TMul#(DepuncturerF1Sz,3)       DepuncturerF1InSz;   
  342. // typedef TMul#(DepuncturerF1Sz,4)       DepuncturerF1OutSz;
  343. // typedef TDiv#(DepuncturerOutDataSz,6)  DepuncturerF2Sz;     // no. of 3/4 in parallel
  344. // typedef TMul#(DepuncturerF2Sz,4)       DepuncturerF2InSz;   
  345. // typedef TMul#(DepuncturerF2Sz,6)       DepuncturerF2OutSz;
  346. // typedef TDiv#(DepuncturerOutDataSz,10) DepuncturerF3Sz;     // no. of 5/6 in parallel
  347. // typedef TMul#(DepuncturerF3Sz,6)       DepuncturerF3InSz;   
  348. // typedef TMul#(DepuncturerF3Sz,10)      DepuncturerF3OutSz;
  349. typedef TAdd#(DepuncturerInDataSz,6)                    DepuncturerInBufSz;  // to be safe 2x inDataSz
  350. typedef TAdd#(DepuncturerInBufSz,DepuncturerOutDataSz)  DepuncturerOutBufSz; // to be safe 2x outDataSz 
  351. typedef 1  DepuncturerF1Sz;     // no. of 2/3 in parallel
  352. typedef 3  DepuncturerF1InSz;   
  353. typedef 4  DepuncturerF1OutSz;
  354. typedef 1  DepuncturerF2Sz;     // no. of 3/4 in parallel
  355. typedef 4  DepuncturerF2InSz;   
  356. typedef 6  DepuncturerF2OutSz;
  357. typedef 1  DepuncturerF3Sz;     // no. of 5/6 in parallel
  358. typedef 6  DepuncturerF3InSz;   
  359. typedef 10 DepuncturerF3OutSz;
  360. function DepunctData#(4) dp1 (DepunctData#(3) x);
  361.    DepunctData#(4) outVec = replicate(4);
  362.    outVec[0] = x[0];
  363.    outVec[2] = x[1];
  364.    outVec[3] = x[2];
  365.    return outVec;
  366. endfunction // Bit
  367.    
  368. function DepunctData#(6) dp2 (DepunctData#(4) x);
  369.    DepunctData#(6) outVec = replicate(4);
  370.    outVec[0] = x[0];
  371.    outVec[1] = x[1];
  372.    outVec[3] = x[2];
  373.    outVec[4] = x[3];
  374.    return outVec;
  375. endfunction // Bit
  376. // not used in wifi   
  377. function DepunctData#(10) dp3 (DepunctData#(6) x);
  378.    DepunctData#(10) outVec = replicate(4);
  379.    outVec[0] = x[0];
  380.    outVec[1] = x[1];
  381.    outVec[3] = x[2];
  382.    outVec[4] = x[3];
  383.    outVec[7] = x[4];
  384.    outVec[8] = x[5];
  385.    return outVec;
  386. endfunction // Bit
  387. // Viterbi:
  388. typedef ConvEncoderOutDataSz ViterbiInDataSz;
  389. typedef ConvEncoderInDataSz  ViterbiOutDataSz;
  390. typedef ConvEncoderHistSz    KSz;       // no of input bits
  391. typedef 35                   TBLength;  // the minimum TB length for each output
  392. typedef 5                    NoOfDecodes;    // no of traceback per stage, TBLength dividible by this value
  393. typedef 3                    MetricSz;  // input metric
  394. typedef 1                    FwdSteps;  // forward step per cycle
  395. typedef 4                    FwdRadii;  // 2^(FwdRadii+FwdSteps*ConvInSz) <= 2^(KSz-1)
  396. typedef 1                    ConvInSz;  // conv input size
  397. typedef 2                    ConvOutSz; // conv output size
  398. // ReedDecoder:
  399. typedef ReedEncoderDataSz ReedDecoderDataSz;
  400. // Decoder: (Construct from Depuncturer,Viterbifor and ReedDecoder)
  401. typedef DepuncturerInDataSz DecoderInDataSz;
  402. typedef ReedDecoderDataSz   DecoderOutDataSz;
  403. // Descrambler:
  404. typedef ScramblerDataSz    DescramblerDataSz;    
  405. typedef ScramblerShifterSz DescramblerShifterSz;
  406. Bit#(DescramblerShifterSz) descramblerGenPoly = scramblerGenPoly;
  407. typedef TXScramblerCtrl    RXDescramblerCtrl;
  408. typedef struct {
  409.    RXDescramblerCtrl  descramblerCtrl;
  410.    Bit#(11)           length;               
  411.    Bool               isNewPacket;
  412. } RXDescramblerAndGlobalCtrl deriving(Eq, Bits); 
  413. function RXDescramblerCtrl 
  414.    descramblerMapCtrl(RXDescramblerAndGlobalCtrl ctrl);
  415.    return ctrl.descramblerCtrl;
  416. endfunction
  417. // typedef struct {
  418. //    RXDescramblerCtrl  descramblerCtrl;
  419. //    RXGlobalCtrl       globalCtrl;
  420. // } RXDescramblerAndGlobalCtrl deriving(Eq, Bits); 
  421. // function RXDescramblerCtrl 
  422. //    descramblerMapCtrl(RXDescramblerAndGlobalCtrl ctrl);
  423. //    return ctrl.descramblerCtrl;
  424. // endfunction
  425. // function Bit#(0) 
  426. //    descramblerConvertCtrl(RXDescramblerAndGlobalCtrl ctrl);
  427. //     return ?;
  428. // endfunction