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

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 FIFO::*;
  30. import GetPut::*;
  31. import LibraryFunctions::*;
  32. import Vector::*;
  33. function a choose(Bool b, a x, a y);
  34.    return b ? x : y;
  35. endfunction
  36. function Tuple2#(Bit#(1),Bit#(shifter_sz)) 
  37.    scramble(Bit#(shifter_sz) genPoly,
  38.     Tuple2#(Bit#(1),Bit#(shifter_sz)) tup,
  39.     Bit#(1) inBit)
  40.    provisos (Add#(1,xxA,shifter_sz));
  41.    let curSeq = tpl_2(tup);
  42.    let fback = genXORFeedback(genPoly,curSeq);
  43.    Vector#(shifter_sz,Bit#(1)) oVec = shiftInAt0(unpack(curSeq),fback);
  44.    let oSeq = pack(oVec);
  45.    let oBit = fback ^ inBit;
  46.    return tuple2(oBit,oSeq);
  47. endfunction
  48. module mkScrambler#(function ScramblerCtrl#(n,shifter_sz) 
  49.        mapCtrl(i_ctrl_t ctrl),
  50.                     function o_ctrl_t convertCtrl(i_ctrl_t ctrl),
  51.                     Bit#(shifter_sz) genPoly)
  52.    (Scrambler#(i_ctrl_t,o_ctrl_t,n,n))
  53.    provisos(Add#(1,xxA,shifter_sz),
  54.     Bits#(i_ctrl_t,i_ctrl_sz),
  55.     Bits#(o_ctrl_t,o_ctrl_sz));
  56.    
  57.    // state elements
  58.    Reg#(Bit#(shifter_sz)) shiftReg <- mkRegU;
  59.    FIFO#(ScramblerMesg#(i_ctrl_t,n)) inQ <- mkLFIFO;
  60.    FIFO#(EncoderMesg#(o_ctrl_t,n))  outQ <- mkSizedFIFO(2);
  61.    // rule
  62.    rule execScramble(True);
  63.       let mesg = inQ.first;
  64.       let ctrl = mesg.control;
  65.       let data = mesg.data;
  66.       Vector#(n,Bit#(1)) iDataVec = unpack(data);
  67.       let sCtrl = mapCtrl(ctrl);
  68.       let initTup = tuple2(0,fromMaybe(shiftReg,sCtrl.seed));
  69.       let oCtrl = convertCtrl(ctrl);
  70.       let oVec = sscanl(scramble(genPoly),initTup,iDataVec);
  71.       match {.oDataVec,.seqVec} = unzip(oVec);
  72.       Vector#(n,Bool) bypassVec = unpack(sCtrl.bypass);
  73.       let oData = pack(map3(choose,bypassVec,iDataVec,oDataVec));
  74.       inQ.deq;
  75.       shiftReg <= seqVec[valueOf(n)-1]; // last seq is what we want
  76.       outQ.enq(Mesg{control:oCtrl, data:oData});
  77.    endrule
  78.    
  79.    //methods
  80.    interface in = fifoToPut(inQ);
  81.    interface out = fifoToGet(outQ);
  82. endmodule