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

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 Connectable::*;
  28. import FIFO::*;
  29. import GetPut::*;
  30. import Vector::*;
  31. import Controls::*;
  32. import DataTypes::*;
  33. import Interfaces::*;
  34. import Parameters::*;
  35. import TXController::*;
  36. import StreamFIFO::*;
  37. typedef TXVector RXFeedback;
  38. interface PreFFTRXController;
  39.    interface Put#(SPMesgFromSync#(UnserialOutDataSz,RXFPIPrec,RXFPFPrec)) 
  40.       inFromPreFFT;
  41.    interface Get#(FFTMesg#(RXGlobalCtrl,FFTIFFTSz,RXFPIPrec,RXFPFPrec))   
  42.       outToPreDescrambler;
  43.    interface Put#(RXFeedback) inFeedback;
  44. endinterface
  45. interface PreDescramblerRXController;
  46.    interface Put#(DecoderMesg#(RXGlobalCtrl,ViterbiOutDataSz,Bit#(1)))    
  47.       inFromPreDescrambler;
  48.    interface Get#(DescramblerMesg#(RXDescramblerAndGlobalCtrl,DescramblerDataSz)) 
  49.       outToDescrambler;
  50.    interface Get#(Bit#(11))   outLength;
  51.    interface Put#(RXFeedback) inFeedback;
  52. endinterface
  53. interface PostDescramblerRXController;
  54.    interface Put#(EncoderMesg#(RXDescramblerAndGlobalCtrl,DescramblerDataSz))                
  55.       inFromDescrambler;
  56.    interface Get#(Bit#(8))  outData;
  57. endinterface      
  58. interface RXController;
  59.    interface Put#(SPMesgFromSync#(UnserialOutDataSz,RXFPIPrec,RXFPFPrec)) 
  60.       inFromPreFFT;
  61.    interface Get#(FFTMesg#(RXGlobalCtrl,FFTIFFTSz,RXFPIPrec,RXFPFPrec))   
  62.       outToPreDescrambler;
  63.    interface Put#(DecoderMesg#(RXGlobalCtrl,ViterbiOutDataSz,Bit#(1)))    
  64.       inFromPreDescrambler;
  65.    interface Get#(DescramblerMesg#(RXDescramblerAndGlobalCtrl,DescramblerDataSz)) 
  66.       outToDescrambler;
  67.    interface Put#(EncoderMesg#(RXDescramblerAndGlobalCtrl,DescramblerDataSz))                
  68.       inFromDescrambler;
  69.    interface Put#(RXFeedback) inFeedback;
  70.    interface Get#(Bit#(11)) outLength;
  71.    interface Get#(Bit#(8))  outData;
  72. endinterface
  73.       
  74. typedef enum{
  75.    RX_IDLE,     // idle
  76.    RX_DATA,     // decoding data
  77.    RX_DTAIL     // sending zeros after data
  78. } RXCtrlState deriving(Eq,Bits);
  79. (* synthesize *)
  80. module mkPreFFTRXController(PreFFTRXController);
  81.    // state elements
  82.    FIFO#(FFTMesg#(RXGlobalCtrl,FFTIFFTSz,RXFPIPrec,RXFPFPrec)) outQ <- mkLFIFO;
  83.    Reg#(RXCtrlState) rxState <- mkReg(RX_IDLE); // the current state
  84.    Reg#(Bit#(3))     zeroCount <- mkRegU;       // count no of zeros symbol sent
  85.    Reg#(Rate)        rxRate <- mkRegU;          // the packet rate for receiving
  86.    Reg#(Bit#(11))    rxLength <- mkRegU;        // the remaining of data to be received (in terms of bits)
  87.    FIFO#(RXFeedback) rxVecQ <- mkSizedFIFO(4);  // to be save
  88.        
  89.    // constants
  90.    // uncoded data bytes per ofdm symbol 
  91.    function Bit#(11) getDBPS(Rate rate);
  92.       return case (rate) 
  93. R0: 12;
  94. R1: 24;
  95. R2: 36;
  96. R3: 48;
  97. R4: 72;
  98. R5: 96;
  99. R6: 108;
  100.      endcase;
  101.    endfunction
  102.    let dbps = getDBPS(rxRate);
  103.    
  104.    // rules
  105.    // send 2 extra symbol of zeros to push out data from vitebri (also reset the viterbi state)
  106.    rule sendZeros(rxState == RX_DTAIL);
  107.       RXGlobalCtrl rxCtrl = RXGlobalCtrl{firstSymbol: False,
  108.  cpSize: CP0,
  109.  rate: R0};
  110.       Symbol#(FFTIFFTSz,RXFPIPrec,RXFPFPrec) zeroSymbol = replicate(cmplx(0,0));
  111.       outQ.enq(FFTMesg{control:rxCtrl, data: zeroSymbol});
  112.       if (zeroCount < 4)
  113.  begin
  114.     zeroCount <= zeroCount + 1;
  115.  end
  116.       else
  117.  begin
  118.     rxState <= RX_IDLE;
  119.  end
  120.       $display("PreFFTRXCtrllr sendZeros rxState:%d rxLength:%d",rxState,rxLength);
  121.    endrule 
  122.    
  123.    // interface methods
  124.    interface Put inFromPreFFT;
  125.       method Action put(SPMesgFromSync#(UnserialOutDataSz,RXFPIPrec,RXFPFPrec) mesg) 
  126.  if (rxState != RX_DTAIL);
  127.  case (rxState)
  128.     RX_IDLE: 
  129.     begin
  130.        if (mesg.control) // only process if it is a new packet, otherwise, drop it
  131.   begin
  132.      let rxVec = rxVecQ.first;
  133.      let checkLen = getDBPS(rxVec.rate) - 1;
  134.      if (rxVec.length > checkLen)
  135. begin
  136.        rxRate <= rxVec.rate;
  137.    rxLength <= rxVec.length - checkLen;
  138.    rxState <= RX_DATA;
  139. end
  140.      RXGlobalCtrl rxCtrl = RXGlobalCtrl{firstSymbol: True,
  141. cpSize: CP0,
  142. rate: rxVec.rate};
  143.      outQ.enq(FFTMesg{control:rxCtrl, data: mesg.data});
  144.      rxVecQ.deq;
  145.   end  
  146.        end
  147.     RX_DATA:
  148.     begin
  149.        RXGlobalCtrl rxCtrl = RXGlobalCtrl{firstSymbol: False,
  150.   cpSize: CP0,
  151.   rate: rxRate};
  152.        outQ.enq(FFTMesg{control:rxCtrl, data: mesg.data});
  153.        if (rxLength <= dbps) // last symbol
  154.   begin
  155.      rxState <= RX_DTAIL;
  156.      zeroCount <= 0;
  157.   end
  158.        else
  159.   begin
  160.      rxLength <= rxLength - dbps;
  161.   end
  162.     end
  163.  endcase
  164.  $display("PreFFTRXCtrllr inFromPreFFT rxState:%d rxLength:%d",rxState,rxLength);
  165.       endmethod
  166.    endinterface
  167.  
  168.    interface inFeedback = fifoToPut(rxVecQ);
  169.    interface outToPreDescrambler = fifoToGet(outQ);
  170. endmodule
  171. (* synthesize *)
  172. module mkPreDescramblerRXController(PreDescramblerRXController);
  173.    // state elements
  174.    FIFO#(DescramblerMesg#(RXDescramblerAndGlobalCtrl,DescramblerDataSz)) outMesgQ <- mkLFIFO;
  175.    FIFO#(RXFeedback)         rxVecQ <- mkSizedFIFO(4);
  176.    FIFO#(Bit#(11))       outLengthQ <- mkLFIFO;
  177.    Reg#(Bit#(11))          rxLength <- mkRegU;
  178.    Reg#(Bit#(7))              count <- mkReg(0);
  179.    
  180.    // constants
  181.    Bit#(7) vDataSz = fromInteger(valueOf(ViterbiOutDataSz)/8);
  182.    
  183.    // interface methods
  184.    interface Put inFromPreDescrambler;
  185.       method Action put(DecoderMesg#(RXGlobalCtrl,ViterbiOutDataSz,Bit#(1)) mesg);
  186.  if (mesg.control.firstSymbol && count == 0)
  187.     begin
  188.        let rxVec = rxVecQ.first; 
  189.        let dCtrl = RXDescramblerCtrl{bypass: 0, 
  190.      seed: tagged Valid (makeSeed(rxVec))};
  191.        let rCtrl = RXDescramblerAndGlobalCtrl{descramblerCtrl: dCtrl,
  192.       length: rxVec.length,
  193.       isNewPacket: True};
  194.        Bit#(DescramblerDataSz) data = pack(mesg.data);
  195.        let mesg = DescramblerMesg{control: rCtrl,
  196.   data: data};
  197.        outMesgQ.enq(mesg);
  198.        outLengthQ.enq(rxVec.length);
  199.        rxLength <= rxVec.length; 
  200.        rxVecQ.deq;
  201.        count <= maxPadding(rxVec.rate) - vDataSz;        
  202.     end
  203.  else
  204.     begin
  205.        let dCtrl = RXDescramblerCtrl{bypass: 0, 
  206.      seed: tagged Invalid};
  207.        let rCtrl = RXDescramblerAndGlobalCtrl{descramblerCtrl: dCtrl,
  208.       length: rxLength,
  209.       isNewPacket: False};
  210.        Bit#(DescramblerDataSz) data = pack(mesg.data);
  211.        let mesg = DescramblerMesg{control: rCtrl,
  212.   data: data};
  213.        outMesgQ.enq(mesg);
  214.        if (count > 0)
  215.   count <= count - vDataSz;        
  216.     end
  217.  $display("PreDescramlerRXCtrllr inFromPreDesc rxLength:%d",rxLength);
  218.       endmethod
  219.    endinterface
  220.    
  221.    interface outToDescrambler = fifoToGet(outMesgQ);   
  222.    interface outLength = fifoToGet(outLengthQ);   
  223.    interface inFeedback = fifoToPut(rxVecQ);
  224. endmodule 
  225. (* synthesize *)
  226. module mkPostDescramblerRXController(PostDescramblerRXController);
  227.    // state elements
  228.    FIFO#(EncoderMesg#(RXDescramblerAndGlobalCtrl,DescramblerDataSz)) inMesgQ <- mkLFIFO;
  229.    FIFO#(Bit#(8)) outDataQ <- mkLFIFO;
  230.    StreamFIFO#(32,6,Bit#(1)) streamQ <- mkStreamLFIFO;
  231.    Reg#(Bit#(11)) rxLength <- mkRegU; // no of bytes remains to be received
  232.    Reg#(RXCtrlState) rxState <- mkReg(RX_IDLE);
  233.    
  234.    // constants
  235.    Bit#(6) dInSz = fromInteger(valueOf(DescramblerDataSz));
  236.    let streamQ_usage = streamQ.usage;
  237.    let streamQ_free  = streamQ.free;
  238.    
  239.    // rules
  240.    rule processInMesgQ(streamQ_free >= dInSz);
  241.       let mesg = inMesgQ.first;
  242.       inMesgQ.deq;
  243.       if ((rxState == RX_IDLE && mesg.control.isNewPacket) || rxState != RX_IDLE)
  244.  begin
  245.     if (rxState == RX_IDLE)
  246.        begin
  247.   rxState <= RX_DATA;
  248.   rxLength <= mesg.control.length;
  249.        end
  250.     streamQ.enq(dInSz,append(unpack(mesg.data),replicate(0)));
  251.  end
  252.       else
  253.  begin
  254.     streamQ.clear;
  255.  end
  256.       $display("PostDescramblerRXCtrllr processInMesgQ rxState:%d rxLength:%d",rxState,rxLength);      
  257.    endrule
  258.    
  259.    rule processStreamQ(streamQ_usage >= 8);
  260.       Bit#(8) outData = truncate(pack(streamQ.first));
  261.       streamQ.deq(8);
  262.       outDataQ.enq(outData);
  263.       if (rxLength > 1)
  264.  begin
  265.     rxLength <= rxLength - 1;
  266.  end
  267.       else
  268.  begin
  269.     rxState <= RX_IDLE;
  270.  end
  271.       $display("PostDescramblerRXCtrllr processStreamQ rxState:%d rxLength:%d",rxState,rxLength);      
  272.    endrule
  273.    
  274.    // interface methods
  275.    interface inFromDescrambler = fifoToPut(inMesgQ);
  276.    interface outData = fifoToGet(outDataQ);
  277. endmodule
  278. (* synthesize *)
  279. module mkRXController(RXController);
  280.    // state elements
  281.    let preFFTCtrllr          <- mkPreFFTRXController;
  282.    let preDescramblerCtrllr  <- mkPreDescramblerRXController;
  283.    let postDescramblerCtrllr <- mkPostDescramblerRXController;
  284.    
  285.    // methods
  286.    interface inFromPreFFT = preFFTCtrllr.inFromPreFFT;
  287.    interface outToPreDescrambler = preFFTCtrllr.outToPreDescrambler;
  288.    interface inFromPreDescrambler = preDescramblerCtrllr.inFromPreDescrambler;
  289.    interface outToDescrambler = preDescramblerCtrllr.outToDescrambler;
  290.    interface inFromDescrambler = postDescramblerCtrllr.inFromDescrambler;
  291.    interface outLength = preDescramblerCtrllr.outLength;
  292.    interface outData   = postDescramblerCtrllr.outData;
  293.       
  294.    interface Put inFeedback;
  295.       method Action put(RXFeedback feedback);
  296.  preFFTCtrllr.inFeedback.put(feedback);
  297.  preDescramblerCtrllr.inFeedback.put(feedback);
  298.       endmethod    
  299.    endinterface
  300.       
  301. endmodule