Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 03/20/2018 08:47:34 PM
  7. // Design Name:
  8. // Module Name: Cordic_base
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21.  
  22.  
  23. module cordic_beh();
  24. /**
  25. * Cordic algorithm
  26. */
  27. //Input arguments
  28. real angle_deg=45;
  29. parameter integer iterations=20;
  30.  
  31.  
  32. parameter integer FXP_SCALE=10000;
  33. parameter integer data_vec_size=15;
  34.  
  35. //program constants
  36. reg signed [data_vec_size:0] pi=3.1415926535897932384626433832795;
  37. reg signed [data_vec_size:0] t_angle = (pi*angle_deg)*FXP_SCALE/180; //Input parameter. The angle
  38.  
  39. //Table of arctan (1/2^i)
  40. // Note. Table initialization below is not correct for Verilog. Select System-Verilog mode
  41. // in your simulator in the case of syntax errors
  42. reg signed [data_vec_size:0] arctan[0:23] = {
  43. 0.78539816339745*FXP_SCALE ,  0.46364760900081*FXP_SCALE  , 0.24497866312686*FXP_SCALE ,  0.12435499454676*FXP_SCALE,
  44. 0.06241880999596*FXP_SCALE ,  0.03123983343027*FXP_SCALE ,  0.01562372862048*FXP_SCALE  , 0.00781234106010*FXP_SCALE,
  45. 0.00390623013197*FXP_SCALE ,  0.00195312251648*FXP_SCALE  , 0.00097656218956*FXP_SCALE  , 0.00048828121119*FXP_SCALE,
  46. 0.00024414062015*FXP_SCALE ,  0.00012207031189*FXP_SCALE ,  0.00006103515617*FXP_SCALE  , 0.00003051757812*FXP_SCALE,
  47. 0.00001525878906*FXP_SCALE ,  0.00000762939453*FXP_SCALE ,  0.00000381469727*FXP_SCALE ,  0.00000190734863*FXP_SCALE,
  48. 0.00000095367432*FXP_SCALE ,  0.00000047683716*FXP_SCALE  , 0.00000023841858*FXP_SCALE  , 0.00000011920929*FXP_SCALE
  49. };
  50. reg signed [data_vec_size:0] Kn[0:23] ={
  51. 0.70710678118655*FXP_SCALE,   0.63245553203368*FXP_SCALE,   0.61357199107790*FXP_SCALE,   0.60883391251775*FXP_SCALE,
  52. 0.60764825625617*FXP_SCALE,   0.60735177014130*FXP_SCALE,   0.60727764409353*FXP_SCALE,   0.60725911229889*FXP_SCALE,
  53. 0.60725447933256*FXP_SCALE,   0.60725332108988*FXP_SCALE,   0.60725303152913*FXP_SCALE,   0.60725295913894*FXP_SCALE,
  54. 0.60725294104140*FXP_SCALE,  0.60725293651701 *FXP_SCALE,   0.60725293538591*FXP_SCALE,   0.60725293510314*FXP_SCALE,
  55. 0.60725293503245*FXP_SCALE,   0.60725293501477*FXP_SCALE,   0.60725293501035*FXP_SCALE,   0.60725293500925*FXP_SCALE,
  56. 0.60725293500897*FXP_SCALE,   0.60725293500890*FXP_SCALE,  0.60725293500889 *FXP_SCALE,   0.60725293500888*FXP_SCALE
  57. }; //Cordic scaling factor for 10 iterations
  58. //Variables
  59. reg signed [data_vec_size:0] cos=1*FXP_SCALE; //Initial vector x coordinate
  60. reg signed [data_vec_size:0] sin=0; //and y coordinate
  61. reg signed [data_vec_size:0] angle = 0.0; //A running angle
  62. integer i, d;
  63. reg signed [data_vec_size:0] tmp;
  64.  
  65. reg signed [data_vec_size*2:0] sin_out;
  66. reg signed [data_vec_size*2:0] cos_out;
  67.  
  68. initial //Execute only once
  69. begin
  70.  for ( i = 0; i < iterations-1; i = i + 1) //Ten algorithm iterations
  71.  begin
  72.  if( t_angle > angle )
  73.      begin
  74.          angle = angle + arctan[i];
  75.          tmp = cos - ( sin / 2**i );
  76.          sin = ( cos / 2**i ) + sin;
  77.          cos = tmp;
  78.      end
  79.  else
  80.      begin
  81.          angle = angle - arctan[i];
  82.          tmp = cos + ( sin / 2**i );
  83.          sin = - ( cos / 2**i) + sin;
  84.          cos = tmp;
  85.      end //if
  86.  end //for
  87.  //Scale sin/cos values
  88. sin_out = Kn[iterations-1] * sin;
  89. cos_out = Kn[iterations-1] * cos;
  90. sin_out =sin_out/FXP_SCALE;
  91. cos_out =cos_out/FXP_SCALE ;
  92. $display("sin=%f, cos=%f, with factor scale = %d", sin_out, cos_out, FXP_SCALE);
  93. end
  94. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement