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

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 LibraryFunctions::*;
  30. import Vector::*;
  31. import FIFO::*;
  32. import GetPut::*;
  33. function Vector#(sz,data_t) permute(function Integer getIdx(Integer k), 
  34.     Vector#(sz,data_t) inVec)
  35.    provisos (Log#(sz,n));
  36.    Integer j = 0;
  37.    Vector#(sz,data_t) outVec = newVector;
  38.    for(Integer i = 0; i < valueOf(sz); i = i + 1)
  39.       begin
  40.  j = getIdx(i);
  41.  outVec[j] = inVec[i];
  42.       end
  43.    return outVec;        
  44. endfunction
  45.    
  46. // n must be multiple of 12
  47. // minNcbps must be dividible by n    
  48. module mkInterleaveBlock#(function Modulation mapCtrl(ctrl_t ctrl),
  49.   function Integer getIdx(Modulation m, 
  50.   Integer k))
  51.    (InterleaveBlock#(ctrl_t,n,n,data_t,minNcbps))
  52.    provisos(Mul#(6,minNcbps,maxNcbps),
  53.     Mul#(cntr_n,n,maxNcbps),
  54.     Log#(cntr_n,cntr_sz),
  55.     Bits#(ctrl_t,ctrl_sz),
  56.     Bits#(data_t,data_sz),
  57.     Bits#(Vector#(maxNcbps,data_t),total_sz),
  58.     Bits#(Vector#(cntr_n,Vector#(n,data_t)),total_sz));
  59.    // constants
  60.    Bit#(cntr_sz) bpskSz = fromInteger(valueOf(cntr_n)/6-1);
  61.    Bit#(cntr_sz) qpskSz = fromInteger(valueOf(cntr_n)/3-1);
  62.    Bit#(cntr_sz) qam16Sz = fromInteger(valueOf(cntr_n)*2/3-1);
  63.    Bit#(cntr_sz) qam64Sz = fromInteger(valueOf(cntr_n)-1);
  64.    // state elements
  65.    FIFO#(Mesg#(ctrl_t,Vector#(n,data_t)))    inQ <- mkLFIFO;  
  66.    FIFO#(Mesg#(ctrl_t,Vector#(n,data_t)))   outQ <- mkSizedFIFO(2);
  67.    Reg#(Bit#(cntr_sz))                    inCntr <- mkReg(0);
  68.    Reg#(Bit#(cntr_sz))                   outCntr <- mkReg(0);      
  69.    Reg#(ctrl_t)                         lastCtrl <- mkRegU;
  70.    Reg#(Vector#(cntr_n,Vector#(n,data_t))) inBuffer;
  71.    inBuffer <- mkReg(newVector);
  72.    FIFO#(Mesg#(ctrl_t,Vector#(cntr_n,Vector#(n,data_t)))) outBufferQ;
  73.    outBufferQ <- mkLFIFO;
  74.    
  75.    // rules
  76.    rule putInput(True);
  77.       let mesg = inQ.first;
  78.       let ctrl = (inCntr == 0) ? 
  79.                   mesg.control :
  80.                   lastCtrl;
  81.       let data = mesg.data;
  82.       let lCtrl = mapCtrl(ctrl);
  83.       let checkSz = case (lCtrl)
  84.        BPSK: bpskSz;
  85.        QPSK: qpskSz;
  86.        QAM_16: qam16Sz;
  87.        QAM_64: qam64Sz;
  88.     endcase;
  89.       let newBuffer = inBuffer;
  90.       newBuffer[inCntr] = data;
  91.       Vector#(maxNcbps,data_t) permData = unpack(pack(newBuffer));      
  92.       permData = case (lCtrl)
  93.     BPSK: permute(getIdx(BPSK),permData);
  94.     QPSK: permute(getIdx(QPSK),permData);
  95.     QAM_16: permute(getIdx(QAM_16),permData);
  96.     QAM_64: permute(getIdx(QAM_64),permData);
  97.  endcase;
  98.       Vector#(cntr_n,Vector#(n,data_t)) outVec = unpack(pack(permData)); 
  99.       inQ.deq;
  100.       if (inCntr == checkSz)
  101.  begin
  102.     inCntr <= 0;
  103.     outBufferQ.enq(Mesg{control: ctrl, data: outVec});
  104.  end
  105.       else
  106.  begin
  107.     lastCtrl <= ctrl;
  108.     inCntr <= inCntr + 1;
  109.     inBuffer <= newBuffer;
  110.  end    
  111.    endrule
  112.  
  113.    rule getOutput(True);
  114.       let mesg = outBufferQ.first;
  115.       let ctrl = mesg.control;
  116.       let dataVec = mesg.data;
  117.       let lCtrl = mapCtrl(ctrl);
  118.       let checkSz = case (lCtrl)
  119.        BPSK: bpskSz;
  120.        QPSK: qpskSz;
  121.        QAM_16: qam16Sz;
  122.        QAM_64: qam64Sz;
  123.     endcase;
  124.       let oData = dataVec[outCntr];
  125.       outCntr <= (outCntr == checkSz)? 0 : outCntr + 1;
  126.       outQ.enq(Mesg{control:ctrl, data: oData});
  127.       if (outCntr == checkSz)
  128.     outBufferQ.deq;
  129.    endrule
  130.  
  131.    // methods
  132.    interface in = fifoToPut(inQ);
  133.    interface out = fifoToGet(outQ);
  134. endmodule
  135.    
  136. module mkInterleaver#(function Modulation mapCtrl(ctrl_t ctrl),
  137.       function Integer getIdx(Modulation m, 
  138.       Integer k))
  139.    (Interleaver#(ctrl_t,n,n,minNcbps))
  140.    provisos(Mul#(6,minNcbps,maxNcbps),
  141.     Mul#(cntr_n,n,maxNcbps),
  142.     Log#(cntr_n,cntr_sz),
  143.     Bits#(ctrl_t,ctrl_sz),
  144.     Bits#(Vector#(maxNcbps,Bit#(1)),total_sz),
  145.     Bits#(Vector#(cntr_n,Vector#(n,Bit#(1))),total_sz));
  146.    
  147.    InterleaveBlock#(ctrl_t,n,n,Bit#(1),minNcbps) block;
  148.    block <- mkInterleaveBlock(mapCtrl,getIdx);
  149.  
  150.    interface Put in;
  151.       method Action put(InterleaverMesg#(ctrl_t,n) mesg);
  152.  let ctrl = mesg.control;
  153.  Vector#(n,Bit#(1)) data = unpack(mesg.data);
  154.  block.in.put(Mesg{control:ctrl,data:data});
  155.       endmethod
  156.    endinterface
  157.  
  158.    interface Get out;
  159.       method ActionValue#(MapperMesg#(ctrl_t,n)) get();
  160.  let mesg <- block.out.get;
  161.  return (Mesg{control:mesg.control,data:pack(mesg.data)});
  162.       endmethod
  163.    endinterface
  164. endmodule
  165.    
  166. module mkDeinterleaver#(function Modulation mapCtrl(ctrl_t ctrl),
  167. function Integer getIdx(Modulation m, 
  168. Integer k))
  169.    (Deinterleaver#(ctrl_t,n,n,decode_t,minNcbps))
  170.    provisos(Mul#(6,minNcbps,maxNcbps),
  171.     Mul#(cntr_n,n,maxNcbps),
  172.     Log#(cntr_n,cntr_sz),
  173.     Bits#(ctrl_t,ctrl_sz),
  174.     Bits#(decode_t,decode_sz),
  175.     Bits#(Vector#(maxNcbps,decode_t),total_sz),
  176.     Bits#(Vector#(cntr_n,Vector#(n,decode_t)),total_sz));
  177.       
  178.    InterleaveBlock#(ctrl_t,n,n,decode_t,minNcbps) block;
  179.    block <- mkInterleaveBlock(mapCtrl,getIdx);
  180.    return block;
  181. endmodule