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

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. ///////////////////////////////////////////////////////////////////////////////////////////
  27. //
  28. // File: CORDIC.bsv
  29. // Description: Provides cos, sin and arctan using CORDIC
  30. // Author: Man C Ng, Email: mcn02@mit.edu
  31. // Date: 26, June, 2006
  32. // Last Modified: 10, Oct, 2006
  33. //
  34. //////////////////////////////////////////////////////////////////////////////////////////
  35. import FIFO::*;
  36. import FixedPoint::*;
  37. import Pipelines::*;
  38. import Vector::*;
  39. /////////////////////////////////////////////////////////////////////////////////////////
  40. // Begin of Data Types
  41. // a pair of values representing the result of cos and sin to the same angle
  42. typedef struct
  43. {
  44.   FixedPoint#(ai, af) cos;
  45.   FixedPoint#(ai, af) sin;
  46.  } CosSinPair#(type ai, type af) deriving (Bits, Eq);
  47. // use this type to specify the mode the cordic is operating at
  48. // RotateMode = calculate cos, sin
  49. // VectorMode = calculate arctan
  50. typedef enum {RotateMode, VectorMode} OpMode deriving (Bits, Eq);
  51. // data used at each stage of the CORDIC operations
  52. typedef struct
  53. {
  54.  FixedPoint#(2, vfsz) x;      // coord x
  55.  FixedPoint#(2, vfsz) y;      // coord y
  56.  FixedPoint#(1, afsz) beta;   // angle
  57.  OpMode               mode;   // operation mode
  58.  Bit#(2)              quad;   // this show the quadrant of the input located    
  59.  } CORDICData#(numeric type vfsz, numeric type afsz) deriving (Bits, Eq);  
  60. // End of Data Types
  61. /////////////////////////////////////////////////////////////////////////////////////////
  62. /////////////////////////////////////////////////////////////////////////////////////////
  63. // Begin of Interfaces
  64. // visz = no. of bits for the integer part of the output values, 
  65. // vfsz = no. of bits for the fractional part of the output values
  66. // aisz = no. of bits for the integer part of the input angle, 
  67. // afsz = no. of bits for the fractional part of the input angle,
  68. interface CosAndSin#(numeric type visz, numeric type vfsz, numeric type aisz, numeric type afsz);
  69.   method Action putAngle(FixedPoint#(aisz,afsz) x); // input angle
  70.   method ActionValue#(CosSinPair#(visz,vfsz)) getCosSinPair(); // return tuple2 (cos(x),sin(x))
  71. endinterface
  72. // visz = no. of bits for the integer part of the input values, 
  73. // vfsz = no. of bits for the fractional part of the input values
  74. // aisz = no. of bits for the integer part of the output angle, 
  75. // afsz = no. of bits for the fractional part of the output angle,
  76. interface ArcTan#(numeric type visz, numeric type vfsz, numeric type aisz, numeric type afsz);
  77.   method Action putXY(FixedPoint#(visz,vfsz) x, FixedPoint#(visz,vfsz) y); // val of x, y coordinate
  78.   method ActionValue#(FixedPoint#(aisz,afsz)) getArcTan(); // return arcTan(y/x) 
  79. endinterface
  80. // vfsz = no of bits to represent the fractional part of values
  81. // afsz = no of bits to represent the fractional part of angle
  82. interface CORDIC#(numeric type vfsz, numeric type afsz);
  83.   method Action putCORDICData(CORDICData#(vfsz,afsz) x);
  84.   method ActionValue#(CORDICData#(vfsz,afsz)) getCORDICData();
  85. endinterface
  86. // End of Interfaces
  87. /////////////////////////////////////////////////////////////////////////////////////////
  88. /////////////////////////////////////////////////////////////////////////////////////////
  89. // Begin of Functions
  90. // begin of auxiliary functions
  91. function CORDICData#(vfsz,afsz) executeStage(Bit#(4) stage, CORDICData#(vfsz, afsz) inData)
  92.   provisos (Arith#(FixedPoint#(2,vfsz)), 
  93.     Arith#(FixedPoint#(1,afsz)));
  94.       Vector#(16, FixedPoint#(1,afsz)) arcTan_LUT = Vector::toVector(List::cons(
  95.   fromRational(450000000000,3600000000000), List::cons(  //45.0000000000
  96.                                                   fromRational(265650511771,3600000000000), List::cons(  //26.5650511771
  97.                                                   fromRational(140362434679,3600000000000), List::cons(  //14.0362434679
  98.                                                   fromRational( 71250163489,3600000000000), List::cons(  // 7.1250163489
  99.                                                   fromRational( 35763343749,3600000000000), List::cons(  // 3.5763343749
  100.                                                   fromRational( 17899106082,3600000000000), List::cons(  // 1.7899106082
  101.                                                   fromRational(  8951737102,3600000000000), List::cons(  // 0.8951737102
  102.                                                   fromRational(  4476141709,3600000000000), List::cons(  // 0.4476141709
  103.                                                   fromRational(  2238105004,3600000000000), List::cons(  // 0.2238105004
  104.                                                   fromRational(  1119056771,3600000000000), List::cons(  // 0.1119056771
  105.                                                   fromRational(   559528919,3600000000000), List::cons(  // 0.0559528919
  106.                                                   fromRational(   279764526,3600000000000), List::cons(  // 0.0279764526
  107.                                                   fromRational(   139882271,3600000000000), List::cons(  // 0.0139882271
  108.                                                   fromRational(    69941138,3600000000000), List::cons(  // 0.0069941138
  109.                                                   fromRational(    34970569,3600000000000), List::cons(  // 0.0034970569
  110.                                                   fromRational(    17485284,3600000000000),        // 0.0017485284
  111.                                                   List::nil)))))))))))))))));
  112.       let rotateClockwise = (inData.mode == RotateMode) ? (inData.beta < 0) : (inData.y > 0); // rotation depends on operation
  113.       let gamma = arcTan_LUT[stage];
  114.       let shiftedx = inData.x >> stage; //signed right shift
  115.       let shiftedy = inData.y >> stage; //signed right shift
  116.       let newx = inData.x + (rotateClockwise ? shiftedy : negate(shiftedy));
  117.       let newy = inData.y + (rotateClockwise ? negate(shiftedx) : shiftedx);
  118.       let newBeta = inData.beta + (rotateClockwise ? gamma : negate(gamma));
  119.       return CORDICData{x:newx, y:newy, beta:newBeta, mode:inData.mode, quad:inData.quad};
  120. endfunction
  121. function CORDICData#(vfsz,afsz) execute(CORDICData#(vfsz,afsz) inData, Integer steps)
  122.   provisos (Arith#(FixedPoint#(1,afsz)),
  123.     Arith#(FixedPoint#(2,vfsz)));
  124.       CORDICData#(vfsz,afsz) v = inData;
  125.       Integer maxN = (steps > 16) ? 15 : steps - 1;
  126.       for(Integer i = 0; i < maxN ; i = i + 1)
  127. begin
  128.    Bit#(4) stage = fromInteger(i);
  129.    v = executeStage(stage, v);
  130. end
  131.       return v;
  132. endfunction // CORDICData
  133. // right shift
  134. function FixedPoint#(1,rf) convertFP(FixedPoint#(ni,nf) x)
  135.   provisos (Add#(xxA, nf, rf), 
  136.     Add#(xxA, 1, ni), 
  137.     Add#(xxA, TAdd#(ni,nf), TAdd#(ni,rf)),
  138.     Add#(xxB, TAdd#(1,rf), TAdd#(ni,rf)));
  139.       FixedPoint#(ni,rf) inX = fxptSignExtend(x) >> valueOf(xxA);
  140.       FixedPoint#(1,rf) outX =  fxptTruncate(inX); // as if doing right shift by xxA  
  141.       return outX;
  142. endfunction // FixedPoint
  143. // setup the input for cordic data in rotation mode
  144. function CORDICData#(vfsz,afsz) getRotateModeInData(FixedPoint#(aisz,afsz) beta)
  145.   provisos (Add#(xxA,1,aisz),
  146.     Add#(2,afszl2,afsz),
  147.     Add#(3,afszl2,TAdd#(1,afsz)),
  148.     Add#(aisz,afsz,TAdd#(aisz,afsz)),
  149.     Literal#(FixedPoint#(2,vfsz)));
  150.       Bit#(afsz) tempBeta = pack(fxptGetFrac(beta));
  151.       Tuple2#(Bit#(2), Bit#(afszl2)) {inQuad, betaLSBs} = split(pack(tempBeta));
  152.       FixedPoint#(1,afsz) inBeta = unpack(zeroExtend(betaLSBs));      
  153.       return CORDICData{x:fromRational(607253,1000000),y:0,beta:inBeta,mode:RotateMode, quad:inQuad};
  154. endfunction // CORDICData
  155. // setup the input for cordic data in vector mode
  156. function CORDICData#(rfsz,afsz) getVectorModeInData(FixedPoint#(visz,vfsz) a, FixedPoint#(visz,vfsz) b)
  157.   provisos (Add#(xxA, vfsz, rfsz), 
  158.     Add#(xxA, 1, visz), 
  159.     Add#(xxA, TAdd#(visz,vfsz), TAdd#(visz,rfsz)),
  160.     Add#(xxB, TAdd#(1,rfsz), TAdd#(visz,rfsz)),
  161.     Add#(1,TAdd#(1,rfsz),TAdd#(2,rfsz)),
  162.     Arith#(FixedPoint#(1,rfsz)),
  163.     Literal#(FixedPoint#(1,afsz)));
  164.       
  165.       FixedPoint#(1,rfsz) x = convertFP(a); // right shifD      FixedPoint#(1,rf) inY = convertFP(y);
  166.       FixedPoint#(1,rfsz) y = convertFP(b); // right shifD      FixedPoint#(1,rf) inY = convertFP(y);
  167.       let xIsNeg = x < 0;
  168.       let yIsNeg = y < 0;
  169.       let absX = xIsNeg ? negate(x) : x;
  170.       let absY = yIsNeg ? negate(y) : y;
  171.       let swap = absY > absX;
  172.       let {inX, inY} = swap ? tuple2(absY, x) : tuple2(absX, y);
  173.       Bit#(2) inQuad = {pack(swap), pack(swap ? yIsNeg : xIsNeg)};
  174.       return CORDICData{x:fxptSignExtend(inX),y:fxptSignExtend(inY),beta:0,mode:VectorMode, quad:inQuad};
  175. endfunction // CORDICData
  176. // setup the input for cordic
  177. function CORDICData#(vfsz,afsz) getCORDICInData(CORDICData#(vfsz,afsz) inData)
  178.   provisos (Add#(1, afsz, TAdd#(1, afsz)),
  179.     Add#(1, TAdd#(1, vfsz), TAdd#(2, vfsz)),
  180.     Add#(2, afszl2, afsz),
  181.     Add#(3, afszl2, TAdd#(1, afsz)),
  182.     Arith#(FixedPoint::FixedPoint#(1, vfsz)),
  183.     Literal#(FixedPoint::FixedPoint#(2, vfsz)));
  184.       FixedPoint#(1,vfsz) inX = fxptTruncate(inData.x);
  185.       FixedPoint#(1,vfsz) inY = fxptTruncate(inData.y);
  186.       let result = (inData.mode == RotateMode) ? 
  187.    getRotateModeInData(inData.beta) : 
  188.    getVectorModeInData(inX,inY);
  189.       return result;
  190. endfunction // CORDICData
  191. // translate the cordic data into result rotation mode
  192. function CosSinPair#(visz,vfsz) getRotateModeOutData(CORDICData#(vfsz,afsz) cData)
  193.   provisos (Add#(1,TAdd#(1,vfsz),TAdd#(2,vfsz)),
  194.     Add#(xxA,1,visz),
  195.     Add#(xxA,TAdd#(1,vfsz),TAdd#(visz,vfsz)),
  196.     Arith#(FixedPoint#(1,vfsz)),
  197.     Literal#(FixedPoint#(2,vfsz)));
  198.       
  199.       FixedPoint#(1,vfsz) max = maxBound;
  200.       let tempX = (cData.x >= 1) ? max : ((cData.x < 0) ? 0 : fxptTruncate(cData.x)); // overflow detection
  201.       let tempY = (cData.y >= 1) ? max : ((cData.y < 0) ? 0 : fxptTruncate(cData.y)); // overflow detection
  202.       let negateX = negate(tempX);
  203.       let negateY = negate(tempY);
  204.       let {cosV, sinV} = case (cData.quad)
  205.    2'b00: tuple2(tempX, tempY);
  206.    2'b01: tuple2(negateY, tempX);
  207.    2'b10: tuple2(negateX, negateY);
  208.    2'b11: tuple2(tempY, negateX);
  209.  endcase; // case(cData.quad)
  210.       return CosSinPair{cos: fxptSignExtend(cosV), sin: fxptSignExtend(sinV)};    
  211. endfunction // CORDICData
  212. // translate the cordic data into result vector mode
  213. // output range: (-0.5,0.5]
  214. function FixedPoint#(aisz,afsz) getVectorModeOutData(CORDICData#(vfsz,afsz) cData)
  215.   provisos (Add#(xxA,1,aisz),
  216.     Add#(xxA,TAdd#(1,afsz),TAdd#(aisz,afsz)),
  217.     Arith#(FixedPoint#(1,afsz)));
  218.       let angle = cData.beta;
  219.       Tuple2#(FixedPoint#(1,afsz),FixedPoint#(1,afsz))
  220. tempTuple = case (cData.quad)
  221. 2'b00 : tuple2(0, angle);
  222. 2'b01 : tuple2(((angle < 0) ? fromRational(-1,2) : fromRational(1,2)), negate(angle));
  223. 2'b10 : tuple2(fromRational(1,4), negate(angle));
  224. 2'b11 : tuple2(fromRational(-1,4), angle);
  225.       endcase;
  226.       FixedPoint#(1,afsz) result = tpl_1(tempTuple) + tpl_2(tempTuple);
  227.       return fxptSignExtend(result);
  228. endfunction // CORDICData
  229. // translate the cordic data into result
  230. function CORDICData#(vfsz,afsz) getCORDICOutData(CORDICData#(vfsz,afsz) cData)
  231.   provisos (Add#(1,TAdd#(1,vfsz),TAdd#(2,vfsz)),
  232.     Arith#(FixedPoint#(1,vfsz)),
  233.     Arith#(FixedPoint#(1,afsz)),
  234.     Literal#(FixedPoint#(2,vfsz)));
  235.       CosSinPair#(1,vfsz) cosSinPair = getRotateModeOutData(cData);
  236.       FixedPoint#(2,vfsz) cosV = fxptSignExtend(cosSinPair.cos);
  237.       FixedPoint#(2,vfsz) sinV = fxptSignExtend(cosSinPair.sin);
  238.       let atan = getVectorModeOutData(cData);
  239.       return CORDICData{x:cosV, y:sinV, beta:atan, mode:cData.mode, quad:cData.quad};
  240. endfunction // CORDICData
  241. // end of auxiliary functions
  242. // input: angle (in terms of no of full circle, e.g. pi = 1/2)
  243. //        steps (no of iterations executed, max 16)
  244. // output: tuple2(cos(angle), sin(angle))
  245. function CosSinPair#(ni, nf) getCosSinPair(FixedPoint#(hi, hf) angle, Integer steps)
  246.   provisos (Add#(xxA,1,hi),
  247.     Add#(2,hfl2,hf),
  248.     Add#(3,hfl2,TAdd#(1,hf)),
  249.     Add#(hi,hf,TAdd#(hi,hf)),
  250.     Literal#(FixedPoint#(2,nf)),
  251.     Add#(1,TAdd#(1,nf),TAdd#(2,nf)),
  252.     Add#(xxB,1,ni),
  253.     Add#(xxB,TAdd#(1,nf),TAdd#(ni,nf)),
  254.     Arith#(FixedPoint#(1,nf)),
  255.     Literal#(FixedPoint#(2,nf)),
  256.     Arith#(FixedPoint#(1,hf)),
  257.     Arith#(FixedPoint#(2,nf)));
  258.           
  259.       CORDICData#(nf,hf) inData  = getRotateModeInData(angle);
  260.       CORDICData#(nf,hf) outData = execute(inData, steps);
  261.       CosSinPair#(ni,nf)  result  = getRotateModeOutData(outData);
  262.       return CosSinPair{cos: result.cos, sin: result.sin};
  263. endfunction // CosSinPair
  264. // input: angle (in terms of no of full circle, e.g. pi = 1/2)
  265. //        steps (no of iterations executed, max 16)
  266. // output: cos(angle)
  267. function FixedPoint#(ni, nf) cos(FixedPoint#(hi, hf) angle, Integer steps)
  268.   provisos (Add#(xxA,1,hi),
  269.     Add#(2,hfl2,hf),
  270.     Add#(3,hfl2,TAdd#(1,hf)),
  271.     Add#(hi,hf,TAdd#(hi,hf)),
  272.     Literal#(FixedPoint#(2,nf)),
  273.     Add#(1,TAdd#(1,nf),TAdd#(2,nf)),
  274.     Add#(xxB,1,ni),
  275.     Add#(xxB,TAdd#(1,nf),TAdd#(ni,nf)),
  276.     Arith#(FixedPoint#(1,nf)),
  277.     Literal#(FixedPoint#(2,nf)),
  278.     Arith#(FixedPoint#(1,hf)),
  279.     Arith#(FixedPoint#(2,nf)));
  280.       let result = getCosSinPair(angle, steps);
  281.       return result.cos;
  282. endfunction // FixedPoint
  283. // input: angle (in terms of no of full circle, e.g. pi = 1/2)
  284. //        steps (no of iterations executed, max 16)
  285. // output: sin(angle)
  286. function FixedPoint#(ni, nf) sin(FixedPoint#(hi, hf) angle, Integer precision)
  287.   provisos (Add#(xxA,1,hi),
  288.     Add#(2,hfl2,hf),
  289.     Add#(3,hfl2,TAdd#(1,hf)),
  290.     Add#(hi,hf,TAdd#(hi,hf)),
  291.     Literal#(FixedPoint#(2,nf)),
  292.     Add#(1,TAdd#(1,nf),TAdd#(2,nf)),
  293.     Add#(xxB,1,ni),
  294.     Add#(xxB,TAdd#(1,nf),TAdd#(ni,nf)),
  295.     Arith#(FixedPoint#(1,nf)),
  296.     Literal#(FixedPoint#(2,nf)),
  297.     Arith#(FixedPoint#(1,hf)),
  298.     Arith#(FixedPoint#(2,nf)));
  299.       let result = getCosSinPair(angle, precision);
  300.       return result.sin;
  301. endfunction // FixedPoint
  302. // input: x, y (coord value for x, y axes)
  303. //        precision (no of iterations executed, max 16)
  304. // output: atan(y/x) (in terms of no of full circle, e.g. pi = 1/2) 
  305. function FixedPoint#(hi, hf) atan(FixedPoint#(ni, nf) x, FixedPoint#(ni,nf) y, Integer steps)
  306.   provisos (Add#(xxA, nf, rf), 
  307.     Add#(xxA, TAdd#(ni,nf), TAdd#(ni,rf)),
  308.     Add#(xxA, 1, ni),
  309.     Add#(xxB, TAdd#(1,rf), TAdd#(ni,rf)),
  310.     Add#(xxC, TAdd#(1,hf), TAdd#(hi,hf)),
  311.     Add#(xxC, 1, hi),
  312.     Add#(1,TAdd#(1,rf),TAdd#(2,rf)),
  313.     Arith#(FixedPoint#(1,rf)),
  314.     Arith#(FixedPoint#(1,hf)),
  315.     Arith#(FixedPoint#(2,rf)),
  316.     Literal#(FixedPoint#(1,hf)));
  317.       CORDICData#(rf,hf) inData  = getVectorModeInData(x,y);
  318.       CORDICData#(rf,hf) outData = execute(inData, steps);
  319.       FixedPoint#(1,hf)  result  = getVectorModeOutData(outData);
  320.       return fxptSignExtend(result);
  321. endfunction // FixedPoint
  322.       
  323. // End of Functions
  324. /////////////////////////////////////////////////////////////////////////////////////////
  325. /////////////////////////////////////////////////////////////////////////////////////////
  326. // Begin of Modules
  327. module [Module] mkCORDIC#(Module#(Pipeline#(CORDICData#(vfsz,afsz))) mkP)
  328.               (CORDIC#(vfsz,afsz));
  329.    Pipeline#(CORDICData#(vfsz,afsz)) p <- mkP(); 
  330.   
  331.    method Action putCORDICData(CORDICData#(vfsz,afsz) x);
  332.    begin
  333.       p.put(x);
  334.    end
  335.    endmethod
  336.    // output to cyclic extend queue method
  337.    method ActionValue#(CORDICData#(vfsz,afsz)) getCORDICData();
  338.    begin
  339.       let result <- p.get();
  340.       return result;
  341.    end
  342.    endmethod
  343. endmodule
  344. // for making cordic pipeline
  345. module [Module] mkCORDIC_Pipe#(Integer numStages, Integer step)(CORDIC#(vfsz,afsz))
  346.   provisos (Arith#(FixedPoint#(2, vfsz)),
  347.     Add#(1, afsz, TAdd#(1, afsz)),
  348.     Arith#(FixedPoint#(1, vfsz)),
  349.     Add#(3, afszl2, TAdd#(1, afsz)),
  350.     Add#(2, afszl2, afsz),
  351.     Add#(1, TAdd#(1, vfsz), TAdd#(2, vfsz)));
  352.    
  353.    CORDIC#(vfsz,afsz) cordic <- mkCORDIC(mkPipeline_Sync(numStages, step, executeStage));
  354.    method Action putCORDICData(CORDICData#(vfsz,afsz) x);
  355.       cordic.putCORDICData(getCORDICInData(x));
  356.    endmethod
  357.      
  358.    method ActionValue#(CORDICData#(vfsz,afsz)) getCORDICData();
  359.       let outData <- cordic.getCORDICData();
  360.       return getCORDICOutData(outData);
  361.    endmethod
  362. endmodule
  363. // for making CosAndSin pipeline
  364. module [Module] mkCosAndSin_Pipe#(Integer numStages, Integer step)(CosAndSin#(visz, vfsz, aisz, afsz))
  365.   provisos (Arith#(FixedPoint#(2, vfsz)),
  366.     Arith#(FixedPoint#(1, afsz)),
  367.     Add#(xxA, 1, aisz),
  368.     Add#(2, afszl2, afsz),
  369.     Add#(3, afszl2, TAdd#(1, afsz)),
  370.     Add#(aisz, afsz, TAdd#(aisz, afsz)),
  371.     Add#(1, TAdd#(1, vfsz), TAdd#(2, vfsz)),
  372.     Add#(xxB, 1, visz),
  373.     Add#(xxB, TAdd#(1, vfsz), TAdd#(visz, vfsz)),
  374.     Arith#(FixedPoint#(1, vfsz)));
  375.    
  376.    CORDIC#(vfsz,afsz) cordic <- mkCORDIC(mkPipeline_Sync(numStages, step, executeStage));
  377.    method Action putAngle(FixedPoint#(aisz,afsz) beta);
  378.       cordic.putCORDICData(getRotateModeInData(beta));
  379.    endmethod
  380.      
  381.    method ActionValue#(CosSinPair#(visz,vfsz)) getCosSinPair();
  382.       let outData <- cordic.getCORDICData();
  383.       return getRotateModeOutData(outData);
  384.    endmethod
  385. endmodule
  386. // for making ArcTan  pipeline
  387. module [Module] mkArcTan_Pipe#(Integer numStages, Integer step)(ArcTan#(visz,vfsz,aisz,afsz))
  388.   provisos (Add#(xxA, vfsz, rf), 
  389.     Add#(xxA, TAdd#(visz,vfsz), TAdd#(visz,rf)),
  390.     Add#(xxA, 1, visz),
  391.     Add#(xxB, TAdd#(1,rf), TAdd#(visz,rf)),
  392.     Add#(xxC, TAdd#(1,afsz), TAdd#(aisz,afsz)),
  393.     Add#(xxC, 1, aisz),
  394.     Add#(1,TAdd#(1,rf),TAdd#(2,rf)),
  395.     Arith#(FixedPoint#(1,rf)),
  396.     Arith#(FixedPoint#(1,afsz)),
  397.     Arith#(FixedPoint#(2,rf)),
  398.     Literal#(FixedPoint#(1,afsz)));
  399.    
  400.    CORDIC#(rf,afsz) cordic <- mkCORDIC(mkPipeline_Sync(numStages, step, executeStage));
  401.    method Action putXY(FixedPoint#(visz,vfsz) x, FixedPoint#(visz,vfsz) y);
  402.       CORDICData#(rf,afsz) inData = getVectorModeInData(x,y);
  403.       cordic.putCORDICData(inData);
  404.    endmethod
  405.      
  406.    method ActionValue#(FixedPoint#(aisz,afsz)) getArcTan();
  407.       let outData <- cordic.getCORDICData();
  408.       return getVectorModeOutData(outData);
  409.    endmethod
  410. endmodule // mkArcTan_Pipe
  411. // End of Modules
  412. /////////////////////////////////////////////////////////////////////////////////////////