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

3G开发

开发平台:

Others

  1. // The MIT License // // Copyright (c) 2006 Nirav Dave (ndave@csail.mit.edu) // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // *************************************************************************
  2. //  ConvEncoder.bsv 
  3. // *************************************************************************
  4. import DataTypes::*;
  5. import Interfaces::*;
  6. import LibraryFunctions::*;
  7. import FIFO::*;
  8. (* synthesize *)
  9. module mkConvEncoder_24_48(ConvEncoder#(24, 48));
  10.   let _c <- mkConvEncoder();
  11.   return(_c); 
  12. endmodule
  13. // n has to be 24 here
  14. module mkConvEncoder(ConvEncoder#(n, nn))
  15.        provisos
  16.          (Add#(n,n,nn),Add#(6,n,n6));
  17.   //-----------------------------------------
  18.   // State
  19.   //-----------------------------------------
  20.   
  21.   // input queues
  22.   FIFO#(Header#(n))           headerQ <- mkLFIFO();
  23.   FIFO#(RateData#(n))           dataQ <- mkLFIFO();
  24.   // internal state
  25.   FIFO#(RateData#(n))        orderedQ <- mkLFIFO();
  26.   Reg#(Bool)                getHeader <- mkReg(True);
  27.   Reg#(Bit#(5))               timeOut <- mkReg(24);
  28.   Reg#(Bit#(6))               histVal <- mkReg(0);
  29.   
  30.   // output queue
  31.   FIFO#(RateData#(nn))               outputQ <- mkLFIFO();
  32.   //-----------------------------------------
  33.   // Rules
  34.   //-----------------------------------------
  35.   
  36.   rule sort(True);
  37.   
  38.     // look at heads of header and data input queues
  39.     Header#(n)       header = headerQ.first();
  40.     RateData#(n)     data = dataQ.first();
  41.   
  42.     // if we've not started a header  and the data rate is nonzero, enq a header
  43.     if(getHeader && data.rate != RNone)
  44.        begin
  45.           orderedQ.enq(RateData{
  46.       rate: R1,
  47.        data: header
  48.       });
  49.           headerQ.deq();
  50.   let ntimeOut = (timeOut - fromInteger(valueOf(n)));
  51.   
  52.           timeOut <= (ntimeOut > 0) ? ntimeOut : 24; // reset
  53.           if (!(ntimeOut > 0))
  54.              getHeader <= False;
  55.        end
  56.     else // otherwise, enq a data
  57.        begin
  58.   if (data.rate != RNone) // newpacket
  59.      getHeader <= True;
  60.   
  61.           dataQ.deq();
  62.           orderedQ.enq(data);
  63.        end
  64.   endrule
  65.    
  66.   rule compute(True);
  67.   
  68.     // get input out of input queues
  69.     Bit#(n) input_data = reverseBits((orderedQ.first).data);
  70.     Rate    input_rate  = (orderedQ.first).rate;
  71.     orderedQ.deq();
  72.     // if this is a new message, reset history
  73.     Bit#(n6)       history;
  74.     if(input_rate == RNone) // new entry
  75.       history = {input_data, histVal};
  76.     else
  77.       history = {input_data, 6'b0};
  78.     // local variables
  79.     Bit#(nn) rev_output_data = 0;
  80.     Bit#(1)  shared = 0; 
  81.     Bit#(6)  newHistVal = histVal;
  82.     // convolutionally encode data
  83.     for(Integer i = 0; i < valueOf(n); i = i + 1)
  84.       begin
  85.       shared = input_data[i] ^ history[i + 4] ^ history[i + 3] ^ history[i + 0];
  86.       rev_output_data[(2*i) + 0] = shared ^ history[i + 1];
  87.       rev_output_data[(2*i) + 1] = shared ^ history[i + 5];
  88.       newHistVal = {input_data[i], newHistVal[5:1]}; // only last update will be saved
  89.       end
  90.     // enqueue result
  91.     RateData#(nn) retval = RateData{
  92.                              rate: input_rate,
  93.                              data: reverseBits(rev_output_data)
  94.                             };
  95.     outputQ.enq(retval);
  96.     // setup for next cycle
  97.     histVal <= newHistVal;
  98.   endrule
  99.   
  100.   //-----------------------------------------
  101.   // Methods
  102.   //-----------------------------------------
  103.   // input from controller queue method
  104.   method Action encode_fromController(Header#(n) header);
  105.     headerQ.enq(header);
  106.   endmethod
  107.   // input from scrambler queue method
  108.   method Action encode_fromScrambler(RateData#(n) data);
  109.     dataQ.enq(data);
  110.   endmethod
  111.   // output to interleaver queue method
  112.   method ActionValue#(RateData#(nn)) getOutput();
  113.     outputQ.deq();
  114.     return(outputQ.first());
  115.   endmethod
  116. endmodule