Puncturer.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 Controls::*;
  27. import DataTypes::*;
  28. import FIFO::*;
  29. import GetPut::*;
  30. import Interfaces::*;
  31. import StreamFIFO::*;
  32. import Vector::*;
  33. // for generating parallel functions
  34. function Vector#(f_sz, Bit#(o_sz)) 
  35.    parFunc(Bit#(f_sz) dummyVal,
  36.    function Bit#(o_sz) func(Bit#(i_sz) x),
  37.    Vector#(f_sz, Bit#(i_sz)) xs);
  38.    return map(func, xs);
  39. endfunction
  40.    
  41. // mkPuncturer using streamFIFO
  42. // in_buf_sz > in_sz + Max(in_sz mod {f1/f2/f3}_in_sz)
  43. // out_buf_sz > Max({f1/f2/f3}_out_sz + ({f1/f2/f3}_out_sz mod out_sz)) 
  44. module mkPuncturer#(function PuncturerCtrl 
  45.        puncturerCtrl(ctrl_t rate),
  46.     function Vector#(f1_sz, Bit#(3)) 
  47.        twoThird(Vector#(f1_sz, Bit#(4)) x),
  48.     function Vector#(f2_sz, Bit#(4)) 
  49.        threeFourth(Vector#(f2_sz, Bit#(6)) x),
  50.                 function Vector#(f3_sz, Bit#(6)) 
  51.        fiveSixth(Vector#(f3_sz, Bit#(10)) x))
  52.    (Puncturer#(ctrl_t, in_sz, out_sz, in_buf_sz, out_buf_sz))
  53.    provisos (Bits#(Vector#(f1_sz,Bit#(4)), f1_in_sz),
  54.      Bits#(Vector#(f2_sz,Bit#(6)), f2_in_sz),
  55.      Bits#(Vector#(f3_sz,Bit#(10)), f3_in_sz),
  56.      Add#(xxA,in_sz,in_buf_sz),
  57.      Add#(xxB,f1_in_sz,in_buf_sz),
  58.      Add#(xxC,f2_in_sz,in_buf_sz),
  59.      Add#(xxD,f3_in_sz,in_buf_sz),
  60.      Bits#(Vector#(f1_sz,Bit#(3)), f1_out_sz),
  61.      Bits#(Vector#(f2_sz,Bit#(4)), f2_out_sz),
  62.      Bits#(Vector#(f3_sz,Bit#(6)), f3_out_sz),
  63.      Add#(xxE,out_sz,out_buf_sz),
  64.      Add#(xxF,in_sz,out_buf_sz),
  65.      Add#(xxG,f1_out_sz,out_buf_sz),
  66.      Add#(xxH,f2_out_sz,out_buf_sz),
  67.      Add#(xxI,f3_out_sz,out_buf_sz),
  68.      Bits#(ctrl_t,ctrl_sz),
  69.      Add#(in_buf_sz,1,in_buf_sz_p_1),
  70.      Log#(in_buf_sz_p_1,in_s_sz),
  71.      Add#(out_buf_sz,1,out_buf_sz_p_1),
  72.      Log#(out_buf_sz_p_1,out_s_sz),
  73.      Eq#(ctrl_t));
  74.        
  75.    // constants
  76.    Bit#(in_s_sz) inSz = fromInteger(valueOf(in_sz));
  77.    Bit#(in_s_sz) f0InSz = inSz;
  78.    Bit#(in_s_sz) f1InSz = fromInteger(valueOf(f1_in_sz));
  79.    Bit#(in_s_sz) f2InSz = fromInteger(valueOf(f2_in_sz));
  80.    Bit#(in_s_sz) f3InSz = fromInteger(valueOf(f3_in_sz));
  81.    Bit#(out_s_sz) outSz = fromInteger(valueOf(out_sz));
  82.    Bit#(out_s_sz) f0OutSz = fromInteger(valueOf(in_sz));        
  83.    Bit#(out_s_sz) f1OutSz = fromInteger(valueOf(f1_out_sz));
  84.    Bit#(out_s_sz) f2OutSz = fromInteger(valueOf(f2_out_sz));
  85.    Bit#(out_s_sz) f3OutSz = fromInteger(valueOf(f3_out_sz));
  86.        
  87.    // state elements
  88.    Reg#(ctrl_t) lastCtrl <- mkRegU;
  89.    FIFO#(EncoderMesg#(ctrl_t, in_sz)) inQ <- mkLFIFO;
  90.    FIFO#(EncoderMesg#(ctrl_t, out_sz)) outQ <- mkSizedFIFO(2);
  91.    StreamFIFO#(in_buf_sz,in_s_sz,Bit#(1)) inStreamQ <- mkStreamLFIFO;
  92.    StreamFIFO#(out_buf_sz,out_s_sz,Bit#(1)) outStreamQ <- mkStreamLFIFO;
  93.       
  94.    let inMsg = inQ.first;
  95.    let inCtrl = inMsg.control;
  96.    let inData = inMsg.data;
  97.    let inPCtrl = puncturerCtrl(inCtrl);   
  98.    let lastPCtrl = puncturerCtrl(lastCtrl);
  99.    match {.fInSz, .fOutSz} = case (lastPCtrl)
  100. Half: tuple2(f0InSz, f0OutSz);
  101. TwoThird: tuple2(f1InSz,f1OutSz);
  102. ThreeFourth: tuple2(f2InSz,f2OutSz);
  103. FiveSixth: tuple2(f3InSz,f3OutSz);
  104.      endcase; 
  105.    let canEnqInStreamQ = inStreamQ.notFull(inSz);
  106.    let canDeqInStreamQ = inStreamQ.notEmpty(fInSz);
  107.    let canEnqOutStreamQ = outStreamQ.notFull(fOutSz);
  108.    let canDeqOutStreamQ = outStreamQ.notEmpty(outSz); 
  109.    
  110.    rule enqInStreamQ(canEnqInStreamQ && (lastCtrl == inCtrl || (!canDeqInStreamQ && !canDeqOutStreamQ)));
  111.       if (lastCtrl != inCtrl)
  112.  lastCtrl <= inCtrl;
  113.       inQ.deq;
  114.       inStreamQ.enq(inSz,unpack(zeroExtend(inData)));
  115.    endrule
  116.    rule puncture(canDeqInStreamQ && canEnqOutStreamQ);
  117.       let data = inStreamQ.first;
  118.       case (lastPCtrl)
  119.  Half:
  120.  begin
  121.     Bit#(in_sz) f0InData = truncate(pack(data));
  122.     Vector#(out_buf_sz,Bit#(1)) f0OutData = unpack(zeroExtend(f0InData));
  123.     inStreamQ.deq(f0InSz);
  124.     outStreamQ.enq(f0OutSz,f0OutData);
  125.  end
  126.  TwoThird:
  127.  begin
  128.     Vector#(f1_sz,Bit#(4)) f1InData = unpack(truncate(pack(data)));
  129.     Vector#(out_buf_sz,Bit#(1)) f1OutData = unpack(zeroExtend(pack(twoThird(f1InData))));
  130.     inStreamQ.deq(f1InSz);
  131.     outStreamQ.enq(f1OutSz,f1OutData);
  132.  end
  133.  ThreeFourth:
  134.  begin
  135.     Vector#(f2_sz,Bit#(6)) f2InData = unpack(truncate(pack(data)));
  136.     Vector#(out_buf_sz,Bit#(1)) f2OutData = unpack(zeroExtend(pack(threeFourth(f2InData))));
  137.     inStreamQ.deq(f2InSz);
  138.     outStreamQ.enq(f2OutSz,f2OutData);
  139.  end
  140.  FiveSixth:
  141.  begin
  142.     Vector#(f3_sz,Bit#(10)) f3InData = unpack(truncate(pack(data)));
  143.     Vector#(out_buf_sz,Bit#(1)) f3OutData = unpack(zeroExtend(pack(fiveSixth(f3InData))));
  144.     inStreamQ.deq(f3InSz);
  145.     outStreamQ.enq(f3OutSz,f3OutData);
  146.  end
  147.       endcase
  148.    endrule
  149.        
  150.    rule deqOutStreamQ(canDeqOutStreamQ);
  151.       Bit#(out_sz) outData = truncate(pack(outStreamQ.first));
  152.       let outMsg = Mesg { control: lastCtrl,
  153.   data: outData};
  154.       outStreamQ.deq(outSz);
  155.       outQ.enq(outMsg);
  156.    endrule
  157.    
  158.    interface Put in = fifoToPut(inQ);
  159.    interface Get out = fifoToGet(outQ);
  160.    
  161. endmodule   
  162.    
  163.