SynchronizerLibrary.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 ComplexLibrary::*;
  28. import CORDIC::*;
  29. import DataTypes::*;
  30. import FIFOF::*;
  31. import FixedPoint::*;
  32. import FixedPointLibrary::*;
  33. import FPComplex::*;
  34. import SParams::*;
  35. import ShiftRegs::*;
  36. import Vector::*;
  37. import Parameters::*;
  38. // convert FPComplex to single bit complex
  39. function Complex#(Bit#(1)) toSingleBitCmplx(FPComplex#(ai,af) a)
  40.   provisos (Add#(1,x,ai), Add#(ai,af,TAdd#(ai,af)));
  41.       return cmplx(pack(a.rel < 0), pack(a.img < 0));
  42. endfunction // Complex
  43. // for single bit multiply, treat 1 = -1, 0 = +1
  44. function Bit#(2) singleBitMult(Bit#(1) x, Bit#(1) y);
  45.       return {x^y,1};
  46. endfunction
  47. // for complex single bit multiply
  48. function Complex#(Bit#(3)) singleBitCmplxMult(Complex#(Bit#(1)) a, Complex#(Bit#(1)) b);
  49.       let rel = signExtend(singleBitMult(a.rel, b.rel)) - signExtend(singleBitMult(a.img, b.img));
  50.       let img = signExtend(singleBitMult(a.rel, b.img)) + signExtend(singleBitMult(a.img, b.rel));
  51.       return cmplx(rel, img);
  52. endfunction
  53. // for complex single bit conj
  54. function Complex#(Bit#(1)) singleBitCmplxConj(Complex#(Bit#(1)) a);
  55.       return cmplx(a.rel, invert(a.img));
  56. endfunction // Complex
  57. // for complex single bit multiply
  58. function Complex#(Bit#(rsz)) cmplxSignExtend(Complex#(Bit#(asz)) a)
  59.   provisos (Add#(xxA,asz,rsz));
  60.       let rel = signExtend(a.rel);
  61.       let img = signExtend(a.img);
  62.       return cmplx(rel, img);
  63. endfunction // Complex
  64. // for complex modulus = rel^2 + img^2, ri = 2ai + 1, rf = 2af
  65. function Bit#(ri)  cmplxModSq(Complex#(Bit#(ai)) a)
  66.   provisos (Add#(ai,ai,ci), Add#(1,ci,ri), Add#(xxA,ai,ri));
  67.       return ((signExtend(a.rel) * signExtend(a.rel))  + (signExtend(a.img) * signExtend(a.img)));
  68. endfunction // FixedPoint
  69. // single bit cross correlation
  70. function Complex#(Bit#(TAdd#(logn,3))) singleBitCrossCorrelation(Vector#(n, Complex#(Bit#(1))) v1, Vector#(n, Complex#(Bit#(1))) v2)
  71.   provisos (Log#(n,logn), Add#(logn,3,TAdd#(logn,3)), Add#(1,xxA,n));
  72.       Vector#(n, Complex#(Bit#(1))) v2Conj = Vector::map(singleBitCmplxConj, v2);
  73.       Vector#(n, Complex#(Bit#(3))) multV = Vector::zipWith(singleBitCmplxMult, v1, v2Conj);
  74.       Vector#(n, Complex#(Bit#(TAdd#(logn,3)))) extendedResultV = Vector::map(cmplxSignExtend, multV);
  75.       Complex#(Bit#(TAdd#(logn,3))) result = Vector::fold(+ ,extendedResultV); //build a binary tree structure
  76.       return result;
  77. endfunction // Complex           
  78. // complex conjugate
  79. function Complex#(a) cmplxConj(Complex#(a) x)
  80.   provisos (Arith#(a));
  81.       return cmplx(x.rel, negate(x.img));
  82. endfunction // Complex
  83. // for fixedpoint complex multiplication 
  84. function FPComplex#(ri,rf) fpcmplxMult(FPComplex#(ai,af) a, FPComplex#(bi,bf) b)
  85.         provisos (Add#(ai,bi,ci),  Add#(af,bf,rf), Add#(TAdd#(ai,af), TAdd#(bi,bf), TAdd#(ci,rf)), 
  86.   Arith#(FixedPoint#(ri,rf)), Add#(1,ci,ri), Add#(1, TAdd#(ci,rf), TAdd#(ri,rf)));
  87.       let rel = fxptSignExtend(fxptMult(a.rel, b.rel)) - fxptSignExtend(fxptMult(a.img, b.img));
  88.       let img = fxptSignExtend(fxptMult(a.rel, b.img)) + fxptSignExtend(fxptMult(a.img, b.rel));
  89.       return cmplx(rel, img);
  90. endfunction // Complex
  91. //for fixedpoint complex signextend
  92. function FPComplex#(ri,rf) fpcmplxSignExtend(FPComplex#(ai,af) a)
  93.   provisos (Add#(xxA,ai,ri), Add#(fdiff,af,rf), Add#(xxC,TAdd#(ai,af),TAdd#(ri,rf)));
  94.       return cmplx(fxptSignExtend(a.rel), fxptSignExtend(a.img));
  95. endfunction // Complex
  96. //for fixedpoint complex truncate
  97. function FPComplex#(ri,rf) fpcmplxTruncate(FPComplex#(ai,af) a)
  98.   provisos (Add#(xxA,ri,ai), Add#(xxB,rf,af), Add#(xxC,TAdd#(ri,rf),TAdd#(ai,af)));
  99.       return cmplx(fxptTruncate(a.rel), fxptTruncate(a.img));
  100. endfunction // Complex
  101. // for fixedpoint complex modulus = rel^2 + img^2, ri = 2ai + 1, rf = 2af
  102. function FixedPoint#(ri,rf)  fpcmplxModSq(FPComplex#(ai,af) a)
  103.   provisos (Add#(ai,ai,ci), Add#(af,af,rf), Add#(TAdd#(ai,af), TAdd#(ai,af), TAdd#(ci,rf)),
  104.     Arith#(FixedPoint#(ri,rf)), Add#(1,ci,ri), Add#(1, TAdd#(ci,rf), TAdd#(ri,rf)));
  105.       return (fxptSignExtend(fxptMult(a.rel, a.rel)) + fxptSignExtend(fxptMult(a.img, a.img)));
  106. endfunction // FixedPoint
  107. // generic function for cross correlation
  108. function FPComplex#(TAdd#(logn,ri),rf) crossCorrelation(Vector#(n, FPComplex#(vi,vf)) v1, Vector#(n, FPComplex#(vi,vf)) v2)
  109.   provisos (Add#(vi,vi,xi), Add#(vf,vf,rf), Add#(TAdd#(vi,vf), TAdd#(vi,vf),TAdd#(xi,rf)),
  110.     Arith#(FixedPoint#(vi,vf)), Arith#(FixedPoint#(ri,rf)), 
  111.     Add#(1,xi,ri), Add#(1,TAdd#(xi,rf),TAdd#(ri,rf)), Log#(n,logn),
  112.     Add#(xxA,ri,TAdd#(logn,ri)), Add#(xxC,TAdd#(ri,rf),TAdd#(TAdd#(logn,ri),rf)),
  113.     Add#(1,yy,n),Arith#(FPComplex#(TAdd#(logn,ri),rf))
  114.     );
  115.       Vector#(n, FPComplex#(vi,vf)) v2Conj = Vector::map(cmplxConj, v2);
  116.       Vector#(n, FPComplex#(ri,rf)) multV = Vector::zipWith(fpcmplxMult, v1, v2Conj);
  117.       Vector#(n, FPComplex#(TAdd#(logn,ri),rf)) extendedResultV = Vector::map(fpcmplxSignExtend, multV);
  118.       FPComplex#(TAdd#(logn,ri),rf) result = Vector::fold(+ ,extendedResultV); //build a binary tree structure
  119.       return result;
  120. endfunction // Complex
  121. function Vector#(m,a) insertCP0(Vector#(n,a) inVec)
  122.    provisos (Mul#(4,cpsz,n),Add#(xxA,cpsz,n),Add#(cpsz,n,m));
  123.    Vector#(cpsz,a) cp = takeTail(inVec);
  124.    Vector#(m,a) outVec = append(cp,inVec);
  125.    return outVec;
  126. endfunction
  127. function Vector#(m,a) insertCP1(Vector#(n,a) inVec)
  128.    provisos (Mul#(8,cpsz,n),Add#(xxA,cpsz,n),Add#(cpsz,n,m));
  129.    Vector#(cpsz,a) cp = takeTail(inVec);
  130.    Vector#(m,a) outVec = append(cp,inVec);
  131.    return outVec;
  132. endfunction
  133. function Vector#(m,a) insertCP2(Vector#(n,a) inVec)
  134.    provisos (Mul#(16,cpsz,n),Add#(xxA,cpsz,n),Add#(cpsz,n,m));
  135.    Vector#(cpsz,a) cp = takeTail(inVec);
  136.    Vector#(m,a) outVec = append(cp,inVec);
  137.    return outVec;
  138. endfunction
  139. function Vector#(m,a) insertCP3(Vector#(n,a) inVec)
  140.    provisos (Mul#(32,cpsz,n),Add#(xxA,cpsz,n),Add#(cpsz,n,m));
  141.    Vector#(cpsz,a) cp = takeTail(inVec);
  142.    Vector#(m,a) outVec = append(cp,inVec);
  143.    return outVec;
  144. endfunction
  145. (* synthesize *)
  146. module mkAutoCorr_DelayIn(ShiftRegs#(SSLen, FPComplex#(SyncIntPrec,SyncFractPrec)));
  147.    ShiftRegs#(SSLen,FPComplex#(SyncIntPrec,SyncFractPrec)) shiftRegs <- mkCirShiftRegsNoGetVec;
  148.    return shiftRegs;
  149. endmodule
  150. (* synthesize *)
  151. module mkAutoCorr_CorrSub(ShiftRegs#(SSLen, FPComplex#(MulIntPrec,SyncFractPrec)));
  152.    ShiftRegs#(SSLen,FPComplex#(MulIntPrec,SyncFractPrec)) shiftRegs <- mkCirShiftRegsNoGetVec;
  153.    return shiftRegs;
  154. endmodule
  155. (* synthesize *)
  156. module mkAutoCorr_ExtDelayIn(ShiftRegs#(LSLSSLen, FPComplex#(SyncIntPrec,SyncFractPrec)));
  157.    ShiftRegs#(LSLSSLen,FPComplex#(SyncIntPrec,SyncFractPrec)) shiftRegs <- mkCirShiftRegsNoGetVec;
  158.    return shiftRegs;
  159. endmodule
  160. (* synthesize *)
  161. module mkAutoCorr_ExtCorrSub(ShiftRegs#(LSLSSLen, FPComplex#(MulIntPrec,SyncFractPrec)));
  162.    ShiftRegs#(LSLSSLen,FPComplex#(MulIntPrec,SyncFractPrec)) shiftRegs <- mkCirShiftRegsNoGetVec;
  163.    return shiftRegs;
  164. endmodule
  165. (* synthesize *)
  166. module mkTimeEst_CoarPowSub(ShiftRegs#(SSLen, FixedPoint#(MulIntPrec,SyncFractPrec)));
  167.    ShiftRegs#(SSLen,FixedPoint#(MulIntPrec,SyncFractPrec)) shiftRegs <- mkCirShiftRegsNoGetVec;
  168.    return shiftRegs;
  169. endmodule
  170. (* synthesize *)
  171. module mkTimeEst_CoarTimeSub(ShiftRegs#(CoarTimeAccumDelaySz, Bool));
  172.    ShiftRegs#(CoarTimeAccumDelaySz, Bool) shiftRegs <- mkCirShiftRegsNoGetVec;
  173.    return shiftRegs;
  174. endmodule
  175. (* synthesize *)
  176. module mkTimeEst_FineDelaySign(ShiftRegs#(FineTimeCorrDelaySz, Complex#(Bit#(1))));
  177.    ShiftRegs#(FineTimeCorrDelaySz, Complex#(Bit#(1))) shiftRegs <- mkShiftRegs;
  178.    return shiftRegs;
  179. endmodule
  180. (* synthesize *)
  181. module mkFreqEst_FreqOffAccumSub(ShiftRegs#(FreqMeanLen, FixedPoint#(SyncIntPrec,SyncFractPrec)));
  182.    ShiftRegs#(FreqMeanLen, FixedPoint#(SyncIntPrec,SyncFractPrec)) shiftRegs <- mkShiftRegs;
  183.    return shiftRegs;
  184. endmodule
  185.  
  186. /*   
  187. // try to instantiate a crosscorrelation module for 160 elements, otherwise the code is too complicate to compile
  188. (* noinline *)
  189. function Complex#(Bit#(FineTimeCorrResSz)) crossCorrelation160(Vector#(FineTimeCorrSz, Complex#(Bit#(1))) v1, 
  190.        Vector#(FineTimeCorrSz, Complex#(Bit#(1))) v2); 
  191.       Vector#(FineTimeCorrSz, Complex#(Bit#(1))) v2Conj = Vector::map(singleBitCmplxConj, v2);
  192.       Vector#(FineTimeCorrSz, Complex#(Bit#(3))) multV = Vector::zipWith(singleBitCmplxMult, v1, v2Conj);
  193.       Vector#(FineTimeCorrSz, Complex#(Bit#(FineTimeCorrResSz))) extendedResultV = Vector::map(cmplxSignExtend, multV);
  194.       Complex#(Bit#(FineTimeCorrResSz)) result = Vector::fold(+ ,extendedResultV); //build a binary tree structure
  195.       return result;
  196. endfunction // Complex
  197. */