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

3G开发

开发平台:

Others

  1. // The MIT License
  2. //
  3. // Copyright (c) 2006 Nirav Dave (ndave@csail.mit.edu)
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. // *************************************************************************
  23. //  Scrambler.bsv 
  24. // *************************************************************************
  25. import DataTypes::*;
  26. import Interfaces::*;
  27. import LibraryFunctions::*;
  28. import FIFO::*;
  29. import RWire::*;
  30. import Vector::*;
  31. interface Interleaver#(type n, type m );
  32.    //inputs
  33.   method Action fromEncoder(RateData#(n) txSVec);
  34.   
  35.    //outputs
  36.   method ActionValue#(RateData#(m))       toMapper(); 
  37. endinterface
  38. (* synthesize *)
  39. module mkInterleaver(Interleaver#(48, 48));
  40.   
  41.   Reg#(Bit#(2))                     outCnt <- mkReg(0);
  42.   FIFO#(Tuple2#(Rate, Bit#(192)))     buff <- mkFIFO();
  43.  
  44.   match {.buff_rate, .buff_data} = buff.first();
  45.   
  46.   Reg#(Rate)                     cur_rate <- mkReg(RNone);
  47.   Reg#(Bit#(2))                     inCnt <- mkReg(0); 
  48.   Reg#(Bit#(192))                    mapR <- mkReg(0);
  49.      
  50.   method Action fromEncoder(RateData#(48) i);
  51.     //calc new value
  52.     Rate this_rate = (i.rate == RNone) ? cur_rate : i.rate;
  53.     Bit#(48)    in = i.data;
  54.      
  55.     cur_rate <=  this_rate;
  56.     function Bit#(48) f1(Bit#(48) x);
  57.        Vector#(16, Bit#(1)) va = bitBreak(x[47:32]),
  58.                             vb = bitBreak(x[31:16]),
  59.                             vc = bitBreak(x[15: 0]);
  60.        function merge(a,b,c) = {a,b,c};
  61.    
  62.        let data_out = bitMerge(zipWith3(merge,va,vb,vc));
  63.        return data_out;
  64.     endfunction 
  65.        
  66.     function Bit#(96) f2(Bit#(48) x, Bit#(48) y);
  67.        Vector#(16, Bit#(3)) va = bitBreak(y),
  68.                             vb = bitBreak(f1(x));
  69.             
  70.        function merge(a,b) = {a,b};
  71.    
  72.        let data_out = bitMerge(zipWith(merge,va,vb));
  73.        return {data_out,0};
  74.     endfunction 
  75.      
  76.     function Bit#(192) switchBits(Bit#(192) x);
  77.        Vector#(8 , Bit#(24)) va = bitBreak(x);
  78.        function Bit#(24) swap(Bit#(24) b) = {b[23:10],b[8],b[9],b[7:4],b[2],b[3],b[1:0]};
  79.        let out = bitMerge(map(swap,va));
  80.        return out;
  81.     endfunction
  82.        
  83.     Bit#(192) new_mapR =
  84.        case (inCnt) 
  85.          0 : return {?,f1(in)};
  86.          1 : return {f2(in,mapR[47:0]),?};
  87.          2 : return {mapR[191:96],?,f1(in)};
  88.          3 : return switchBits({mapR[191:96],f2(in, mapR[47:0])});
  89.        endcase;      
  90.     Bit#(2) new_inCnt = pack(tuple2(cur_rate == R4, cur_rate != R1)) & (inCnt + 1);
  91.     inCnt <= new_inCnt;
  92.     if (new_inCnt == 2'b00) // we're done
  93.       buff.enq(tuple2(cur_rate,new_mapR));
  94.     else //store
  95.       mapR <= new_mapR;
  96.       
  97.   endmethod   
  98.   method ActionValue#(RateData#(48)) toMapper();
  99.      Bit#(48) res = case (outCnt)
  100.        2'b00: return buff_data[191:144];
  101.                        2'b01: return buff_data[143:96];
  102.                        2'b10: return buff_data[95:48];
  103.        2'b11: return buff_data[47:0];
  104.     endcase;
  105.      Bit#(2) new_outCnt = pack(tuple2(buff_rate == R4, buff_rate != R1)) & (outCnt + 1);
  106.      outCnt <= new_outCnt;
  107.    
  108.      if(new_outCnt == 2'b00)
  109.        buff.deq();
  110.      
  111.      return RateData{
  112.                rate: buff_rate,
  113.        data: res
  114.       };
  115.   endmethod
  116.      
  117.      
  118. endmodule