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

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. // WiFi 802.11a Parameters
  27. import Controls::*;
  28. import Vector::*;
  29. import FPComplex::*;
  30. import LibraryFunctions::*;
  31. import Complex::*;
  32. import DataTypes::*;
  33. import Interfaces::*;
  34. import GetPut::*;
  35. import Connectable::*;
  36. // Global Parameters:
  37. typedef enum {
  38.    R0,  // 6Mbps
  39.    R1,  // 9Mbps
  40.    R2,  // 12Mbps
  41.    R3,  // 18Mbps
  42.    R4,  // 24Mbps
  43.    R5,  // 36Mbps
  44.    R6,  // 48Mbps
  45.    R7   // 54Mbps
  46. } Rate deriving(Eq, Bits);
  47. typedef struct {
  48.     Bool firstSymbol;
  49.     Rate rate;
  50. } TXGlobalCtrl deriving(Eq, Bits);
  51. typedef 2  TXFPIPrec; // tx fixedpoint integer precision
  52. typedef 14 TXFPFPrec; // tx fixedpoint fractional precision
  53. typedef 2  RXFPIPrec; // rx fixedpoint integer precision
  54. typedef 14 RXFPFPrec; // rx fixedpoint fractional precision
  55. typedef TXGlobalCtrl RXGlobalCtrl; // same as tx
  56. // Local Parameters:
  57. // Scrambler:
  58. typedef 12 ScramblerDataSz;    
  59. typedef  7 ScramblerShifterSz;
  60. Bit#(ScramblerShifterSz) scramblerGenPoly = 'b1001000;
  61. typedef ScramblerCtrl#(ScramblerDataSz,ScramblerShifterSz) 
  62. TXScramblerCtrl;
  63. typedef struct {
  64.    TXScramblerCtrl  scramblerCtrl;
  65.    TXGlobalCtrl     globalCtrl;
  66. } TXScramblerAndGlobalCtrl deriving(Eq, Bits); 
  67. function TXScramblerCtrl 
  68.    scramblerMapCtrl(TXScramblerAndGlobalCtrl ctrl);
  69.    return ctrl.scramblerCtrl;
  70. endfunction
  71. function TXGlobalCtrl 
  72.    scramblerConvertCtrl(TXScramblerAndGlobalCtrl ctrl);
  73.     return ctrl.globalCtrl;
  74. endfunction
  75. // Conv. Encoder:
  76. typedef 12 ConvEncoderInDataSz;
  77. typedef TMul#(2,ConvEncoderInDataSz) ConvEncoderOutDataSz;
  78. typedef  7 ConvEncoderHistSz;
  79. Bit#(ConvEncoderHistSz) convEncoderG1 = 'b1011011;
  80. Bit#(ConvEncoderHistSz) convEncoderG2 = 'b1111001;
  81. // Puncturer:
  82. typedef ConvEncoderOutDataSz        PuncturerInDataSz;
  83. typedef 24                          PuncturerOutDataSz;
  84. //typedef TMul#(2,PuncturerInDataSz)  PuncturerInBufSz;  // to be safe 2x inDataSz
  85. //typedef TMul#(2,PuncturerOutDataSz) PuncturerOutBufSz; // to be safe 2x outDataSz 
  86. typedef TAdd#(PuncturerInDataSz,10)                PuncturerInBufSz;
  87. typedef TAdd#(PuncturerInBufSz,PuncturerOutDataSz) PuncturerOutBufSz; 
  88. //typedef TDiv#(PuncturerInDataSz,4)  PuncturerF1Sz; // no. of 2/3 in parallel
  89. //typedef TDiv#(PuncturerInDataSz,6)  PuncturerF2Sz; // no. of 3/4 in parallel
  90. //typedef TDiv#(PuncturerInDataSz,10) PuncturerF3Sz; // no. of 5/6 in parallel
  91. typedef 1  PuncturerF1Sz; // no. of 2/3 in parallel
  92. typedef 1  PuncturerF2Sz; // no. of 3/4 in parallel
  93. typedef 1  PuncturerF3Sz; // no. of 5/6 in parallel
  94. function Bit#(3) puncturerF1 (Bit#(4) x);
  95.    return x[2:0];
  96. endfunction // Bit
  97.    
  98. function Bit#(4) puncturerF2 (Bit#(6) x);
  99.    return {x[5],x[2:0]};
  100. endfunction // Bit
  101. // not used in WiFi   
  102. function Bit#(6) puncturerF3 (Bit#(10) x);
  103.    return 0;
  104. endfunction // Bit
  105. function PuncturerCtrl puncturerMapCtrl(TXGlobalCtrl ctrl);
  106.    return case (ctrl.rate)
  107.      R0: Half;
  108.      R1: ThreeFourth;
  109.      R2: Half;
  110.      R3: ThreeFourth;
  111.      R4: Half;
  112.      R5: ThreeFourth;
  113.      R6: TwoThird;
  114.      R7: ThreeFourth;
  115.   endcase; // case(rate)
  116. endfunction // Bit  
  117. // Encoder: (Construct from ConvEncoder & Puncturer for wifi)
  118. typedef ConvEncoderInDataSz EncoderInDataSz;
  119. typedef PuncturerOutDataSz  EncoderOutDataSz;
  120. // Interleaver:
  121. typedef PuncturerOutDataSz  InterleaverDataSz;
  122. typedef 48                  MinNcbps;
  123. // used for both interleaver, mapper
  124. function Modulation modulationMapCtrl(TXGlobalCtrl ctrl);
  125.    return case (ctrl.rate)
  126.      R0: BPSK;
  127.      R1: BPSK;
  128.      R2: QPSK;
  129.      R3: QPSK;
  130.      R4: QAM_16;
  131.      R5: QAM_16;
  132.      R6: QAM_64;
  133.      R7: QAM_64;
  134.           endcase;
  135. endfunction
  136. function Integer interleaverGetIdx(Modulation m, Integer k);
  137.    Integer s = 1;  
  138.    Integer ncbps = valueOf(MinNcbps);
  139.    case (m)
  140.       BPSK:   
  141.       begin
  142.  ncbps = ncbps;
  143.  s = 1;
  144.       end
  145.       QPSK:   
  146.       begin
  147.  ncbps = 2*ncbps;
  148.  s = 1;
  149.       end
  150.       QAM_16: 
  151.       begin
  152.  ncbps = 4*ncbps;
  153.  s = 2;
  154.       end
  155.       QAM_64: 
  156.       begin
  157.  ncbps = 6*ncbps;
  158.  s = 3;
  159.       end
  160.    endcase // case(m)
  161.    Integer i = (ncbps/16) * (k%16) + k/16;
  162.    Integer f = (i/s); // expect floor
  163.    Integer j = s*f + (i + ncbps - (16*i/ncbps))%s;
  164.    return (k >= ncbps) ? k : j;
  165. endfunction
  166. //Mapper:
  167. typedef InterleaverDataSz MapperInDataSz;
  168. typedef 48                MapperOutDataSz;
  169. Bool mapperNegateInput = False;
  170. //Pilot:
  171. typedef  MapperOutDataSz  PilotInDataSz;
  172. typedef  64               PilotOutDataSz;
  173. typedef   7               PilotPRBSSz;
  174. Bit#(PilotPRBSSz) pilotPRBSMask = 'b1001000;
  175. Bit#(PilotPRBSSz) pilotInitSeq  = 'b1111111;
  176. function PilotInsertCtrl pilotMapCtrl(TXGlobalCtrl ctrl);
  177.    return ctrl.firstSymbol ? PilotRst : PilotNorm;
  178. endfunction 
  179. function Symbol#(PilotOutDataSz,TXFPIPrec,TXFPFPrec) 
  180.    pilotAdder(Symbol#(PilotInDataSz,TXFPIPrec,TXFPFPrec) x,
  181.       Bit#(1) ppv);
  182.    
  183.    Integer i =0, j = 0;
  184.    // assume all guards initially
  185.    Symbol#(PilotOutDataSz,TXFPIPrec,TXFPFPrec) syms = replicate(cmplx(0,0));
  186.    
  187.    // data subcarriers
  188.    for(i = 6; i < 11; i = i + 1, j = j + 1)
  189.       syms[i] = x[j];
  190.    for(i = 12; i < 25; i = i + 1, j = j + 1)
  191.       syms[i] = x[j]; 
  192.    for(i = 26; i < 32 ; i = i + 1, j = j + 1)
  193.       syms[i] = x[j];  
  194.    for(i = 33; i < 39 ; i = i + 1, j = j + 1)
  195.       syms[i] = x[j];   
  196.    for(i = 40; i < 53 ; i = i + 1, j = j + 1)
  197.       syms[i] = x[j];
  198.    for(i = 54; i < 59 ; i = i + 1, j = j + 1)
  199.       syms[i] = x[j];
  200.    //pilot subcarriers
  201.    syms[11] = mapBPSK(False, ppv); // map 1 to -1, 0 to 1
  202.    syms[25] = mapBPSK(False, ppv); // map 1 to -1, 0 to 1
  203.    syms[39] = mapBPSK(False, ppv); // map 1 to -1, 0 to 1
  204.    syms[53] = mapBPSK(True,  ppv); // map 0 to -1, 1 to 1
  205.    
  206.    return syms;
  207. endfunction
  208. // FFT/IFFT:
  209. typedef PilotOutDataSz FFTIFFTSz;
  210. typedef 32             FFTIFFTNoBfly;
  211. // CPInsert:
  212. typedef FFTIFFTSz CPInsertDataSz;
  213. function CPInsertCtrl cpInsertMapCtrl(TXGlobalCtrl ctrl);
  214.    let fstEle = ctrl.firstSymbol ? SendBoth : SendNone;
  215.    return tuple2(fstEle, CP0);
  216. endfunction
  217. // Synchronizer:
  218. // specific for OFDM specification
  219. typedef 16  SSLen;        // short symbol length (auto correlation delay 16)
  220. typedef 64  LSLen;        // long symbol length (auto correlation delay 64)
  221. typedef 160 LSStart;      // when the long symbol start
  222. typedef 320 SignalStart;  // when the signal (useful data) start
  223. typedef 80  SymbolLen;    // one symbol length
  224. // implementation parameters
  225. typedef 96  SSyncPos;      // short symbol synchronization position ( 2*SSLen <= this value < LBStart)
  226. typedef 224 LSyncPos;      // long symbol synchronization position  ( LSStart <= this value < SinglaStart)       
  227. typedef 16  FreqMeanLen;   // how many samples we collect to calculate CFO (power of 2, at most 32, bigger == more tolerant to noise)
  228. typedef 480 TimeResetPos;  // reset time if coarCounter is larger than this, must be bigger than SignalStart
  229. typedef 2   CORDICPipe;    // number of pipeline stage of the cordic
  230. typedef 16  CORDICIter;    // number of cordic iterations (max 16 iterations, must be multiple of CORDICPIPE)
  231. typedef RXFPIPrec  SyncIntPrec;   // number of integer bits for internal arithmetic
  232. typedef RXFPFPrec  SyncFractPrec; // number of fractional bits for internal arithmetic 
  233. // Unserializer:
  234. typedef FFTIFFTSz  UnserialOutDataSz;
  235. // ChannelEstimator:
  236. typedef UnserialOutDataSz  CEstInDataSz;
  237. typedef PilotInDataSz      CEstOutDataSz;
  238. function Symbol#(CEstOutDataSz,RXFPIPrec,RXFPFPrec) pilotRemover
  239.    (Symbol#(CEstInDataSz,RXFPIPrec,RXFPFPrec) x);   
  240.    Integer i =0, j = 0;
  241.    // assume all guards initially
  242.    Symbol#(CEstOutDataSz,RXFPIPrec,RXFPFPrec) syms = newVector;
  243.   
  244.    // data subcarriers
  245.    for(i = 6; i < 11; i = i + 1, j = j + 1)
  246.       syms[j] = x[i];
  247.    for(i = 12; i < 25; i = i + 1, j = j + 1)
  248.       syms[j] = x[i]; 
  249.    for(i = 26; i < 32 ; i = i + 1, j = j + 1)
  250.       syms[j] = x[i];  
  251.    for(i = 33; i < 39 ; i = i + 1, j = j + 1)
  252.       syms[j] = x[i];   
  253.    for(i = 40; i < 53 ; i = i + 1, j = j + 1)
  254.       syms[j] = x[i];
  255.    for(i = 54; i < 59 ; i = i + 1, j = j + 1)
  256.       syms[j] = x[i];  
  257.    return syms;
  258. endfunction
  259. // Demapper:
  260. typedef CEstOutDataSz  DemapperInDataSz;
  261. typedef MapperInDataSz DemapperOutDataSz;
  262. Bool demapperNegateOutput = mapperNegateInput;
  263. // Deinterleaver:
  264. typedef DemapperOutDataSz DeinterleaverDataSz;
  265. function Integer deinterleaverGetIndex(Modulation m, Integer j);
  266.    Integer s = 1;  
  267.    Integer ncbps = valueOf(MinNcbps);
  268.    case (m)
  269.       BPSK:  
  270.       begin
  271.  ncbps = ncbps;
  272.  s = 1;
  273.       end
  274.       QPSK:  
  275.       begin
  276.  ncbps = 2*ncbps;
  277.  s = 1;
  278.       end
  279.       QAM_16:
  280.       begin
  281.  ncbps = 4*ncbps;
  282.  s = 2;
  283.       end
  284.       QAM_64:
  285.       begin
  286.  ncbps = 6*ncbps;
  287.  s = 3;
  288.       end
  289.    endcase // case(m)
  290.    Integer f = (j/s);
  291.    Integer i = s*f + (j + (16*j/ncbps))%s;
  292.    Integer k = 16*i-(ncbps-1)*(16*i/ncbps);
  293.    return (j >= ncbps) ? j : k;
  294. endfunction   
  295. // Depuncturer:
  296. typedef DemapperOutDataSz              DepuncturerInDataSz;
  297. typedef PuncturerInDataSz              DepuncturerOutDataSz;
  298. typedef TMul#(2,DepuncturerInDataSz)   DepuncturerInBufSz;  // to be safe 2x inDataSz
  299. typedef TMul#(2,DepuncturerOutDataSz)  DepuncturerOutBufSz; // to be safe 2x outDataSz 
  300. // typedef TDiv#(DepuncturerOutDataSz,4)  DepuncturerF1Sz;     // no. of 2/3 in parallel
  301. // typedef TMul#(DepuncturerF1Sz,3)       DepuncturerF1InSz;   
  302. // typedef TMul#(DepuncturerF1Sz,4)       DepuncturerF1OutSz;
  303. // typedef TDiv#(DepuncturerOutBufSz,6)   DepuncturerF2Sz;     // no. of 3/4 in parallel
  304. // typedef TMul#(DepuncturerF2Sz,4)       DepuncturerF2InSz;   
  305. // typedef TMul#(DepuncturerF2Sz,6)       DepuncturerF2OutSz;
  306. // typedef TDiv#(DepuncturerOutDataSz,10) DepuncturerF3Sz;     // no. of 5/6 in parallel
  307. // typedef TMul#(DepuncturerF3Sz,6)       DepuncturerF3InSz;   
  308. // typedef TMul#(DepuncturerF3Sz,10)      DepuncturerF3OutSz;
  309. typedef 1  DepuncturerF1Sz;     // no. of 2/3 in parallel
  310. typedef 3  DepuncturerF1InSz;   
  311. typedef 4  DepuncturerF1OutSz;
  312. typedef 1  DepuncturerF2Sz;     // no. of 3/4 in parallel
  313. typedef 4  DepuncturerF2InSz;   
  314. typedef 6  DepuncturerF2OutSz;
  315. typedef 1  DepuncturerF3Sz;     // no. of 5/6 in parallel
  316. typedef 6  DepuncturerF3InSz;   
  317. typedef 10 DepuncturerF3OutSz;
  318. function DepunctData#(4) dp1 (DepunctData#(3) x);
  319.    DepunctData#(4) outVec = replicate(4);
  320.    outVec[0] = x[0];
  321.    outVec[1] = x[1];
  322.    outVec[2] = x[2];
  323.    return outVec;
  324. endfunction // Bit
  325.    
  326. function DepunctData#(6) dp2 (DepunctData#(4) x);
  327.    DepunctData#(6) outVec = replicate(4);
  328.    outVec[0] = x[0];
  329.    outVec[1] = x[1];
  330.    outVec[2] = x[2];
  331.    outVec[5] = x[3];
  332.    return outVec;
  333. endfunction // Bit
  334. // not used in wifi   
  335. function DepunctData#(10) dp3 (DepunctData#(6) x);
  336.    DepunctData#(10) outVec = replicate(4);
  337.    return outVec;
  338. endfunction // Bit
  339. // Viterbi:
  340. typedef ConvEncoderOutDataSz ViterbiInDataSz;
  341. typedef ConvEncoderInDataSz  ViterbiOutDataSz;
  342. typedef ConvEncoderHistSz    KSz;       // no of input bits
  343. typedef 35                   TBLength;  // the minimum TB length for each output
  344. typedef 5                    NoOfDecodes;    // no of traceback per stage, TBLength dividible by this value
  345. typedef 3                    MetricSz;  // input metric
  346. typedef 1                    FwdSteps;  // forward step per cycle
  347. typedef 4                    FwdRadii;  // 2^(FwdRadii+FwdSteps*ConvInSz) <= 2^(KSz-1)
  348. typedef 1                    ConvInSz;  // conv input size
  349. typedef 2                    ConvOutSz; // conv output size
  350. // Decoder: (Construct from Depuncturer and Viterbifor wifi)
  351. typedef DepuncturerInDataSz DecoderInDataSz;
  352. typedef ViterbiOutDataSz    DecoderOutDataSz;
  353. // Descrambler:
  354. typedef ScramblerDataSz    DescramblerDataSz;    
  355. typedef ScramblerShifterSz DescramblerShifterSz;
  356. Bit#(DescramblerShifterSz) descramblerGenPoly = scramblerGenPoly;
  357. typedef TXScramblerCtrl    RXDescramblerCtrl;
  358. typedef struct {
  359.    RXDescramblerCtrl  descramblerCtrl;
  360.    Bit#(12)           length;               
  361.    RXGlobalCtrl       globalCtrl;
  362. } RXDescramblerAndGlobalCtrl deriving(Eq, Bits); 
  363. function RXDescramblerCtrl 
  364.    descramblerMapCtrl(RXDescramblerAndGlobalCtrl ctrl);
  365.    return ctrl.descramblerCtrl;
  366. endfunction
  367. // typedef struct {
  368. //    RXDescramblerCtrl  descramblerCtrl;
  369. //    RXGlobalCtrl       globalCtrl;
  370. // } RXDescramblerAndGlobalCtrl deriving(Eq, Bits); 
  371. // function RXDescramblerCtrl 
  372. //    descramblerMapCtrl(RXDescramblerAndGlobalCtrl ctrl);
  373. //    return ctrl.descramblerCtrl;
  374. // endfunction
  375. // function Bit#(0) 
  376. //    descramblerConvertCtrl(RXDescramblerAndGlobalCtrl ctrl);
  377. //     return ?;
  378. // endfunction