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

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 DataTypes::*;
  27. import Interfaces::*;
  28. import Controls::*;
  29. import FPComplex::*;
  30. import Complex::*;
  31. import FixedPoint::*;
  32. import LibraryFunctions::*;
  33. import Vector::*;
  34. import FIFO::*;
  35. import GetPut::*;
  36. // mkMapper definition, 
  37. // i_n must be multiple of 12
  38. // o_n must equal no of data carriers, dividable by i_n
  39. module mkMapper#(function Modulation mapCtrl(ctrl_t ctrl),
  40.  Bool negateInput)
  41.     (Mapper#(ctrl_t,i_n,o_n,i_prec,f_prec))
  42.     provisos(Bits#(ctrl_t, ctrl_sz),
  43.              Add#(1,x,i_prec),
  44.              Literal#(FixedPoint#(i_prec,f_prec)),
  45.      Mul#(qpsk_n,2,i_n),
  46.      Mul#(qam_16_n,4,i_n),
  47.      Mul#(qam_64_n,6,i_n),
  48.      Mul#(i_n,xxA,o_n),
  49.      Mul#(qpsk_n,xxB,o_n),
  50.      Mul#(qam_16_n,xxC,o_n),
  51.      Mul#(qam_64_n,xxD,o_n),
  52.      Log#(xxD,s_sz));
  53.    // constants
  54.    Bit#(s_sz) bpskSz = fromInteger(valueOf(xxA)-1);
  55.    Bit#(s_sz) qpskSz = fromInteger(valueOf(xxB)-1);
  56.    Bit#(s_sz) qam16Sz = fromInteger(valueOf(xxC)-1);
  57.    Bit#(s_sz) qam64Sz = fromInteger(valueOf(xxD)-1);
  58.    // state elements
  59.    FIFO#(MapperMesg#(ctrl_t, i_n)) inQ <- mkLFIFO;
  60.    FIFO#(PilotInsertMesg#(ctrl_t,o_n,i_prec,f_prec)) outQ;
  61.    outQ <- mkSizedFIFO(2);
  62.    Reg#(ctrl_t) lastCtrl <- mkRegU;
  63.    Reg#(Bit#(s_sz)) counter <- mkReg(0);
  64.    Reg#(Vector#(o_n,FPComplex#(i_prec,f_prec))) buffer <- mkRegU;
  65.    
  66.    // rules
  67.    rule map(True);
  68.       let mesg   = inQ.first();
  69.       let data   = mesg.data;
  70.       let ctrl = (counter == 0) ? mesg.control : lastCtrl;
  71.       let format = mapCtrl(ctrl);
  72.       let checkSz = case (format)
  73.        BPSK: bpskSz;
  74.        QPSK: qpskSz;
  75.        QAM_16: qam16Sz;
  76.        QAM_64: qam64Sz;
  77.     endcase;
  78.       let newCounter = (counter == checkSz) ? 0 : counter + 1;
  79.       Vector#(i_n,Bit#(1)) bpskDataVec = unpack(data);
  80.       let bpskMapVec = map(mapBPSK(negateInput),bpskDataVec);
  81.       Vector#(qpsk_n,Bit#(2)) qpskDataVec = unpack(data);
  82.       let qpskMapVec = map(mapQPSK(negateInput),qpskDataVec);
  83.       Vector#(qam_16_n,Bit#(4)) qam16DataVec = unpack(data);
  84.       let qam16MapVec = map(mapQAM_16(negateInput),qam16DataVec);
  85.       Vector#(qam_64_n,Bit#(6)) qam64DataVec = unpack(data);
  86.       let qam64MapVec = map(mapQAM_64(negateInput),qam64DataVec);
  87.       Vector#(o_n, FPComplex#(i_prec,f_prec)) finalVec = buffer;
  88.       finalVec = case (format)
  89.     BPSK: sv_truncate(append(finalVec,bpskMapVec));
  90.     QPSK: sv_truncate(append(finalVec,qpskMapVec));
  91.     QAM_16: sv_truncate(append(finalVec,qam16MapVec));
  92.     QAM_64: sv_truncate(append(finalVec,qam64MapVec));
  93.  endcase;
  94.       inQ.deq();
  95.       lastCtrl <= ctrl;
  96.       buffer <= finalVec;
  97.       counter <= newCounter;
  98.       if (counter == checkSz)
  99.  outQ.enq(Mesg{control: ctrl, data: finalVec});
  100.    endrule
  101.    
  102.    // methods
  103.    interface in  = fifoToPut(inQ);
  104.    interface out = fifoToGet(outQ);
  105. endmodule