Unserializer.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 Complex::*;
  27. import DataTypes::*;
  28. import FIFO::*;
  29. import FixedPoint::*;
  30. import Interfaces::*;
  31. import Vector::*;
  32. import Controls::*;
  33. import GetPut::*;
  34. //`define debug_mode True // uncomment this line for displaying text
  35. // internal state
  36. typedef enum{ UN_Bypass, UN_Skip } UnserialState deriving (Bits,Eq);
  37.      
  38. module mkUnserializer(Unserializer#(n,i_prec,f_prec))
  39.    provisos (Log#(n,n_idx));
  40.    
  41.    // state elements
  42.    FIFO#(UnserializerMesg#(i_prec,f_prec))  inQ <- mkLFIFO;
  43.    FIFO#(SPMesgFromSync#(n,i_prec,f_prec)) outQ <- mkSizedFIFO(2);
  44.    Reg#(SyncCtrl) ctrl <- mkRegU;
  45.    Reg#(Symbol#(n,i_prec,f_prec)) tempDataVec <- mkReg(newVector);
  46.    Reg#(Bit#(n_idx)) index <- mkReg(0);
  47.    Reg#(UnserialState) state <- mkRegU;
  48.    // constants/ wires
  49.    Integer nInt = valueOf(n);
  50.    Bit#(n_idx) bypassCheckSz = fromInteger(nInt - 1);
  51.    Bit#(n_idx) skipCheckSz = case (ctrl.cpSize) 
  52. CP0: fromInteger(nInt/4 - 1);
  53. CP1: fromInteger(nInt/8 - 1);
  54. CP2: fromInteger(nInt/16 - 1);
  55. CP3: fromInteger(nInt/32 - 1);
  56.      endcase;
  57.    let inMsg = inQ.first();
  58.    let isNewMsg = inMsg.control.isNewPacket;
  59.    let inData = inMsg.data;
  60.    let isSkip = state == UN_Skip;
  61.    let isBypass = state == UN_Bypass;
  62.    rule getNewCtrl(isNewMsg);
  63.    begin
  64.       inQ.deq();
  65.       index <= 1;
  66.       state <= UN_Skip;
  67.       ctrl <= inMsg.control;
  68.       `ifdef debug_mode
  69.          $display("Rule getNewCtrl fired");
  70.       `endif
  71.    end
  72.    endrule
  73.    rule skipMsg(!isNewMsg && isSkip);
  74.    begin
  75.       inQ.deq();
  76.       if (index == 0)
  77.  ctrl <= inMsg.control;
  78.       if (index == skipCheckSz)
  79.  begin
  80.     index <= 0;
  81.     state <= UN_Bypass;
  82.  end
  83.       else
  84.  index <= index + 1;
  85.       `ifdef debug_mode
  86.          $display("Rule skipMsg fired %d times", index);
  87.       `endif
  88.    end
  89.    endrule
  90.    rule bypassMsg(!isNewMsg && isBypass);
  91.    begin
  92.       inQ.deq();
  93.       if (index == bypassCheckSz)
  94.  begin
  95.     index <= 0;
  96.     state <= UN_Skip;
  97.     outQ.enq(SPMesgFromSync{control: ctrl.isNewPacket, data: Vector::update(tempDataVec,index,inData)});
  98.  end
  99.       else
  100.  begin
  101.     index <= index + 1;
  102.     tempDataVec <= Vector::update(tempDataVec,index,inData);
  103.  end
  104.       `ifdef debug_mode
  105.  $display("Rule bypassMsg fired %d times",index);
  106.       `endif
  107.    end
  108.    endrule
  109.    
  110.    // interfaces
  111.    interface in  = fifoToPut(inQ);
  112.    interface out = fifoToGet(outQ);
  113. endmodule