Advertisement
Guest User

Untitled

a guest
Mar 21st, 2018
317
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(angle_in,
  24.                   start,
  25.                   ready,
  26.                   out_sin,
  27.                   out_cos
  28.                   );
  29. /**
  30. * Cordic algorithm
  31. */
  32. //Input arguments
  33.  
  34. input signed [12:10] angle_in;
  35. input [1:0] start;
  36. output[1:0]  ready;
  37. output signed out_sin[12:10];
  38. output signed out_cos[12:10];
  39.                  
  40.                  
  41. real angle_deg=30;
  42. parameter integer iterations=12;
  43.  
  44.  
  45.  
  46. parameter integer data_vec_size=20;
  47. parameter integer FXP_SCALE=2**(data_vec_size-1);
  48. //program constants
  49. reg signed [data_vec_size*2:0] pi=3.1415926535897932384626433832795*FXP_SCALE;
  50. reg signed [data_vec_size:0] t_angle = 0;
  51.  
  52. //Table of arctan (1/2^i)
  53. // Note. Table initialization below is not correct for Verilog. Select System-Verilog mode
  54. // in your simulator in the case of syntax errors
  55. reg signed [data_vec_size:0] arctan[0:23] = {
  56. 0.78539816339745*FXP_SCALE ,  0.46364760900081*FXP_SCALE  , 0.24497866312686*FXP_SCALE ,  0.12435499454676*FXP_SCALE,
  57. 0.06241880999596*FXP_SCALE ,  0.03123983343027*FXP_SCALE ,  0.01562372862048*FXP_SCALE  , 0.00781234106010*FXP_SCALE,
  58. 0.00390623013197*FXP_SCALE ,  0.00195312251648*FXP_SCALE  , 0.00097656218956*FXP_SCALE  , 0.00048828121119*FXP_SCALE,
  59. 0.00024414062015*FXP_SCALE ,  0.00012207031189*FXP_SCALE ,  0.00006103515617*FXP_SCALE  , 0.00003051757812*FXP_SCALE,
  60. 0.00001525878906*FXP_SCALE ,  0.00000762939453*FXP_SCALE ,  0.00000381469727*FXP_SCALE ,  0.00000190734863*FXP_SCALE,
  61. 0.00000095367432*FXP_SCALE ,  0.00000047683716*FXP_SCALE  , 0.00000023841858*FXP_SCALE  , 0.00000011920929*FXP_SCALE
  62. };
  63. reg signed [data_vec_size:0] Kn[0:23] ={
  64. 0.70710678118655*FXP_SCALE,   0.63245553203368*FXP_SCALE,   0.61357199107790*FXP_SCALE,   0.60883391251775*FXP_SCALE,
  65. 0.60764825625617*FXP_SCALE,   0.60735177014130*FXP_SCALE,   0.60727764409353*FXP_SCALE,   0.60725911229889*FXP_SCALE,
  66. 0.60725447933256*FXP_SCALE,   0.60725332108988*FXP_SCALE,   0.60725303152913*FXP_SCALE,   0.60725295913894*FXP_SCALE,
  67. 0.60725294104140*FXP_SCALE,  0.60725293651701 *FXP_SCALE,   0.60725293538591*FXP_SCALE,   0.60725293510314*FXP_SCALE,
  68. 0.60725293503245*FXP_SCALE,   0.60725293501477*FXP_SCALE,   0.60725293501035*FXP_SCALE,   0.60725293500925*FXP_SCALE,
  69. 0.60725293500897*FXP_SCALE,   0.60725293500890*FXP_SCALE,  0.60725293500889 *FXP_SCALE,   0.60725293500888*FXP_SCALE
  70. }; //Cordic scaling factor for 10 iterations
  71. //Variables
  72. reg signed [data_vec_size:0] cos=1*FXP_SCALE; //Initial vector x coordinate
  73. reg signed [data_vec_size:0] sin=0; //and y coordinate
  74. reg signed [data_vec_size:0] angle = 0.0; //A running angle
  75. integer i, d;
  76. reg signed [data_vec_size:0] tmp;
  77.  
  78. reg signed [data_vec_size*2:0] sin_out;
  79. reg signed [data_vec_size*2:0] cos_out;
  80.  
  81.  
  82. reg signed [1:0] input_flag=0;
  83. reg signed [1:0] output_flag=0;
  84.  
  85. //reg signed [data_vec_size*2:0] cos_print;
  86. //reg signed [data_vec_size*2:0] sin_print;
  87. real cos_print;
  88. real sin_print;
  89. initial //Execute only once
  90.  
  91. begin
  92. t_angle = (pi*angle_deg)/180;
  93.  for ( i = 0; i < iterations-1; i = i + 1) //Ten algorithm iterations
  94.  begin
  95.  if( t_angle > angle )
  96.      begin
  97.          angle = angle + arctan[i];
  98.          tmp = cos - ( sin / 2**i );
  99.          sin = ( cos / 2**i ) + sin;
  100.          cos = tmp;
  101.      end
  102.  else
  103.      begin
  104.          angle = angle - arctan[i];
  105.          tmp = cos + ( sin / 2**i );
  106.          sin = - ( cos / 2**i) + sin;
  107.          cos = tmp;
  108.      end //if
  109.  end //for
  110.  //Scale sin/cos values
  111. sin_out = Kn[iterations-1] * sin;
  112. cos_out = Kn[iterations-1] * cos;
  113. sin_out =sin_out/FXP_SCALE;
  114. cos_out =cos_out/FXP_SCALE ;
  115.  
  116. cos_print=cos_out;
  117. sin_print=sin_out;
  118. cos_print=cos_print/FXP_SCALE;
  119. sin_print=sin_print/FXP_SCALE;
  120. $display("sin=%f, cos=%f, with factor scale = %d", sin_out, cos_out, FXP_SCALE);
  121. $display("sin=%f, cos=%f, with factor scale = %d", sin_print, cos_print, FXP_SCALE);
  122.  
  123. end
  124. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement