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

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. import Controls::*;
  27. import DataTypes::*;
  28. import FIFO::*;
  29. import FPComplex::*;
  30. import GetPut::*;
  31. import Interfaces::*;
  32. import Vector::*;
  33. typedef enum{
  34.    ProcNew,    // process new symbol
  35.    ShortCP,    // sending short preamble CP
  36.    ShortData,  // sending short preamble data
  37.    LongCP,     // sending long preamble CP
  38.    LongData,   // sending long preamble data
  39.    SymbolCP,   // sending symbol CP
  40.    SymbolData  // sending symbol data   
  41. } CPState deriving (Bits, Eq);
  42. module mkCPInsert#(function CPInsertCtrl mapCtrl (ctrl_t ctrl),
  43.    Symbol#(pn, i_prec, f_prec) sPreamble,
  44.    Symbol#(pn, i_prec, f_prec) lPreamble)
  45.    (CPInsert#(ctrl_t,n,i_prec,f_prec))
  46.    provisos (Bits#(ctrl_t,ctrl_sz),
  47.      Log#(n,n_idx),
  48.      Log#(pn,pn_idx));
  49.    
  50.    // constants
  51.    Integer nInt = valueOf(n);
  52.    Integer pnInt = valueOf(pn);
  53.    Bit#(n_idx) maxN = fromInteger(nInt - 1);
  54.    Bit#(pn_idx) maxPN = fromInteger(pnInt - 1); 
  55.    Bit#(n_idx) nCP0Start = fromInteger(nInt - nInt/4);
  56.    Bit#(n_idx) nCP1Start = fromInteger(nInt - nInt/8);
  57.    Bit#(n_idx) nCP2Start = fromInteger(nInt - nInt/16);
  58.    Bit#(n_idx) nCP3Start = fromInteger(nInt - nInt/32);
  59.    Bit#(pn_idx) pnCP0Start = fromInteger(pnInt - pnInt/4);
  60.    Bit#(pn_idx) pnCP1Start = fromInteger(pnInt - pnInt/8);
  61.    Bit#(pn_idx) pnCP2Start = fromInteger(pnInt - pnInt/16);
  62.    Bit#(pn_idx) pnCP3Start = fromInteger(pnInt - pnInt/32);
  63.       
  64.    // state elements
  65.    FIFO#(CPInsertMesg#(ctrl_t,n,i_prec,f_prec)) inQ <- mkLFIFO;
  66.    FIFO#(DACMesg#(i_prec,f_prec)) outQ <- mkSizedFIFO(2);
  67.    Reg#(CPState)      state <- mkReg(ProcNew);
  68.    Reg#(Bit#(n_idx))   nCnt <- mkReg(0);
  69.    Reg#(Bit#(pn_idx)) pnCnt <- mkReg(0);
  70.       
  71.    // wires
  72.    let inMesg = inQ.first;
  73.    let inCtrl = inMesg.control;
  74.    let inData = inMesg.data;
  75.    let inCPCtrl = mapCtrl(inCtrl);
  76.    let sendPre  = tpl_1(inCPCtrl);
  77.    let cpSize   = tpl_2(inCPCtrl);
  78.    let pnCPStart = case (cpSize)
  79.       CP0: pnCP0Start; 
  80.       CP1: pnCP1Start;
  81.       CP2: pnCP2Start;
  82.       CP3: pnCP3Start;
  83.    endcase;
  84.    // rules
  85.    rule procNew(state == ProcNew);
  86.       let nCPStart = case (cpSize)
  87. CP0: nCP0Start; 
  88. CP1: nCP1Start;
  89. CP2: nCP2Start;
  90. CP3: nCP3Start;
  91.      endcase;
  92.       if (sendPre == SendLong || sendPre == SendBoth) 
  93.  begin
  94.     outQ.enq((sendPre == SendLong) ? 
  95.      lPreamble[pnCPStart] :
  96.      sPreamble[pnCPStart]);
  97.     state <= (sendPre == SendLong) ? LongCP : ShortCP;
  98.     pnCnt <= pnCPStart + 1;
  99.     nCnt <= nCPStart;
  100.  end
  101.       else
  102.  begin
  103.     outQ.enq(inData[nCPStart]);
  104.     state <= SymbolCP;
  105.     nCnt <= nCPStart + 1; 
  106.  end
  107.    endrule
  108.    rule procPreamble(state == ShortCP || state == ShortData ||
  109.      state == LongCP || state == LongData);
  110.       if (pnCnt == maxPN)
  111.  begin
  112.     state <= case (state)
  113. ShortCP: ShortData;
  114. ShortData: LongCP;
  115. LongCP: LongData;
  116. LongData: SymbolCP;
  117.      endcase;
  118.     pnCnt <= (state == ShortData) ? pnCPStart : 0;
  119.  end
  120.       else
  121.  pnCnt <= pnCnt + 1;
  122.       if (state == ShortCP || state == ShortData)
  123.  outQ.enq(sPreamble[pnCnt]);
  124.       else
  125.  outQ.enq(lPreamble[pnCnt]);
  126.    endrule      
  127.    rule procSymbol(state == SymbolCP || state == SymbolData);
  128.       if (nCnt == maxN)
  129.  begin
  130.     nCnt <= 0;
  131.     if (state == SymbolData)
  132.        begin
  133.   state <= ProcNew;
  134.   inQ.deq;
  135.        end
  136.     else
  137.        state <= SymbolData;
  138.  end
  139.       else
  140.  nCnt <= nCnt + 1;
  141.       outQ.enq(inData[nCnt]);
  142.    endrule      
  143.       
  144.    interface in = fifoToPut(inQ);
  145.    interface out = fifoToGet(outQ);
  146.    
  147. endmodule