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

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 FPComplex::*;
  28. import DataTypes::*;
  29. import CORDIC::*;
  30. import FixedPoint::*;
  31. import Vector::*;
  32. import FIFO::*;
  33. import FIFOF::*;
  34. import FParams::*;
  35. import List::*;
  36. import LibraryFunctions::*;
  37. import Pipeline2::*;
  38. import GetPut::*;
  39. function FFTData genOmega(Integer idx);
  40.       Nat shift_sz = fromInteger(valueOf(LogFFTSz));
  41.       FFTAngle angle = negate(fromInteger(idx)>>shift_sz);
  42.       FFTCosSinPair omg  = getCosSinPair(angle,16);
  43.       FFTData res = cmplx(omg.cos,omg.sin);
  44.       return res;
  45. endfunction
  46. function Vector#(HalfFFTSz,FFTData) genOmegas();
  47.       return map(genOmega, genVector);
  48. endfunction
  49. function Vector#(sz,Bit#(n)) getIdxVec(Integer stage)
  50.   provisos(Log#(sz,n));
  51.       Integer logFFTSz = valueOf(n);
  52.       Nat shiftSz = fromInteger(logFFTSz - stage);
  53.       return map(leftShiftBy(shiftSz),      // shift back
  54.  map(rightShiftBy(shiftSz), // div
  55.      map(reverseBits, 
  56.  map(fromInteger, genVector))));      
  57. endfunction // Vector
  58. function Vector#(sz,FFTData) getIndVec(Vector#(sz,FFTData) inVec,
  59.        Integer stage);
  60.       return map(select(inVec),getIdxVec(stage));
  61. endfunction // Vector
  62. (* noinline *)
  63. function OmegaVecs genOmegaVecs();
  64.       Vector#(LogFFTSz, Integer) iterVec = genVector;
  65.       return map(getIndVec(genOmegas), iterVec);
  66. endfunction
  67. (* noinline *)
  68. function FFTBFlyData fftRadix2Bfly(Tuple2#(FFTData,FFTBFlyData) 
  69.    inData);
  70.       match {.omg, .dataVec} = inData;
  71.       match {.i1, .i2} = dataVec;
  72.       let newI2 = omg*i2;
  73.       let o1 = i1 + newI2;
  74.       let o2 = i1 - newI2;      
  75.       return tuple2(o1,o2);
  76. endfunction
  77. (* noinline *)
  78. function FFTBflyMesg fftBflys(FFTBflyMesg inMesg);
  79.       let outData = map(fftRadix2Bfly, inMesg);
  80.       Vector#(NoBfly,FFTData) dummyOmegas = newVector;
  81.       return zip(dummyOmegas, outData);
  82. endfunction      
  83. (* synthesize *)
  84. module mkFFTBflys_RWire(Pipeline2#(FFTBflyMesg));
  85.    Pipeline2#(FFTBflyMesg) pipeStage <- mkPipeStage_RWire(fftBflys);
  86.    return pipeStage;
  87. endmodule   
  88. (* synthesize *)
  89. module mkFFTBflys_FIFO(Pipeline2#(FFTBflyMesg));
  90.    Pipeline2#(FFTBflyMesg) pipeStage <- mkPipeStage_FIFO(fftBflys);
  91.    return pipeStage;
  92. endmodule   
  93. (* noinline *)
  94. function FFTTupleVec fftPermute(FFTDataVec inDataVec);
  95.       Vector#(HalfFFTSz, FFTData) fstHalfVec = take(inDataVec);
  96.       Vector#(HalfFFTSz, FFTData) sndHalfVec = takeTail(inDataVec);
  97.       return zip(fstHalfVec,sndHalfVec);
  98. endfunction // FFTDataVec
  99. (* noinline *)
  100. function FFTDataVec fftPermuteRes(FFTDataVec inDataVec);
  101.       Integer logFFTSz = valueOf(LogFFTSz);      
  102.       return getIndVec(inDataVec, logFFTSz);
  103. endfunction // FFTDataVec
  104. function Vector#(2,a) tuple2Vec(Tuple2#(a,a) in);
  105.       Vector#(2,a) outVec = newVector;
  106.       outVec[0] = tpl_1(in);
  107.       outVec[1] = tpl_2(in);
  108.       return outVec;
  109. endfunction // Vector
  110. (* synthesize *)
  111. module [Module] mkOneStage(Pipeline2#(FFTTuples));
  112.    Pipeline2#(FFTStageMesg) stageFU;
  113.    stageFU <- mkPipeline2_Time(mkFFTBflys_RWire);
  114.    FIFO#(FFTStage) stageQ <- mkLFIFO;
  115.    interface Put in;
  116.       method Action put(FFTTuples inMesg);
  117.       begin
  118.  let inStage = tpl_1(inMesg);
  119.  let inDataVec = tpl_2(inMesg);
  120.  let dataVec = fftPermute(inDataVec);
  121.  let omgs = genOmegaVecs[inStage];
  122.  let inVec = zip(omgs,dataVec);
  123.  stageFU.in.put(inVec);
  124.  stageQ.enq(inStage + 1);
  125.       end
  126.       endmethod
  127.    endinterface
  128.    
  129.    interface Get out;
  130.       method ActionValue#(FFTTuples) get();
  131.  let res <- stageFU.out.get;
  132.          stageQ.deq;
  133.          return tuple2(stageQ.first, concat(map(tuple2Vec, tpl_2(unzip(res)))));
  134.       endmethod
  135.    endinterface     
  136. endmodule // FFTDataVec
  137.