Viterbi.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 Interfaces::*;
  27. import FIFO::*;
  28. import Vector::*;
  29. import Monad::*;
  30. import VParams::*;
  31. import IViterbi::*;
  32. import DataTypes::*;
  33. import GetPut::*;
  34. import Parameters::*;
  35. //`define isDebug True // uncomment this line to display error
  36. module mkViterbi (Viterbi#(ctrl_t,n2,n))
  37.    provisos(Add#(n,n,n2),
  38.     Add#(n2,1,n2p1),
  39.     Add#(n,1,np1),
  40.     Log#(n2p1,ln2),
  41.     Log#(np1,ln),
  42.     Bits#(ctrl_t, ctrl_sz));
  43.    
  44.    // constants
  45.    Bit#(ln)  checkN  = fromInteger(valueOf(n));
  46.    Bit#(ln2) checkN2 = fromInteger(valueOf(n2));
  47.    Integer  tbLength = valueOf(TBLength);
  48.    Integer  tbStages = valueOf(NoOfTBStage);
  49.    Integer   ctrlQSz = ((tbLength + tbStages)/valueOf(n)) + 1; 
  50.    
  51.    // state elements
  52. //   Reg#(ctrl_t) ctrl <- mkRegU;
  53.    IViterbi viterbi <- mkIViterbiTB;     // murali TB
  54. //   IViterbi viterbi <- mkIViterbiTBPath;   // alfred TB
  55.    Reg#(Vector#(n2,ViterbiMetric)) inData <- mkReg(newVector);
  56.    Reg#(Bit#(ln2)) inDataCount <- mkReg(checkN2);
  57.    Reg#(Vector#(n,Bit#(1))) outData <- mkReg(newVector);
  58.    Reg#(Bit#(ln)) outDataCount <- mkReg(0);
  59.    FIFO#(ctrl_t) ctrlQ <- mkSizedFIFO(ctrlQSz);
  60.   rule pushDataToViterbi (inDataCount != checkN2);
  61.      VInType vData = newVector;
  62.      Vector#(ConvOutSz, VMetric) tempV = newVector;
  63.      for (Integer i = 0; i < fwd_steps; i = i + 1)
  64. begin
  65.    for (Integer j = 0; j < conv_out_sz; j = j + 1)
  66.       begin
  67.  let offset = i * conv_out_sz + j;
  68.    tempV[j] = inData[inDataCount + fromInteger(offset)];
  69.       end
  70.    vData[i] = tempV;
  71. end
  72.      viterbi.putData(vData);
  73.      inDataCount <= inDataCount + fromInteger(fwd_steps * conv_out_sz);
  74.      `ifdef isDebug
  75.         $display("pushDataToViterbi");
  76.      `endif 
  77.   endrule
  78.   rule pullDataFromViterbi (outDataCount != checkN);
  79.      VOutType vData <- viterbi.getResult ();
  80.      Vector#(n,Bit#(1)) newOutData = outData;
  81.      for (Integer n = 0 ; n < fwd_steps; n = n + 1)
  82. begin
  83.    newOutData[outDataCount+fromInteger(n)] = vData[n];
  84. end
  85.      outData <= newOutData;
  86.      outDataCount <= outDataCount + fromInteger(fwd_steps);
  87.      `ifdef isDebug
  88.         $display("pullDataFromViterbi");
  89.      `endif
  90.   endrule
  91.   interface Put in;
  92.       method Action put(DecoderMesg#(ctrl_t,n2,ViterbiMetric) dataIn) 
  93.  if(inDataCount == checkN2);
  94.          inData <= dataIn.data;
  95.          inDataCount <= 0;
  96.          ctrlQ.enq(dataIn.control);
  97.  `ifdef
  98.     $display("viterbi in");
  99.  `endif
  100.       endmethod
  101.   endinterface
  102.   interface Get out;
  103.       method ActionValue#(DecoderMesg#(ctrl_t,n,Bit#(1))) get() 
  104.  if(outDataCount == checkN);
  105.  ctrlQ.deq;
  106.          outDataCount <= 0;
  107.  `ifdef isDebug
  108.     $display("viterbi out");
  109.  `endif
  110.          return Mesg{control: ctrlQ.first, data:outData};
  111.       endmethod
  112.   endinterface
  113. endmodule