Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- `timescale 1ns / 1ps
- //////////////////////////////////////////////////////////////////////////////////
- // Company:
- // Engineer:
- //
- // Create Date: 03/20/2018 08:47:34 PM
- // Design Name:
- // Module Name: Cordic_base
- // Project Name:
- // Target Devices:
- // Tool Versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- module cordic_beh(angle_in,
- start,
- ready,
- out_sin,
- out_cos
- );
- /**
- * Cordic algorithm
- */
- //Input arguments
- input signed [12:10] angle_in;
- input [1:0] start;
- output[1:0] ready;
- output signed out_sin[12:10];
- output signed out_cos[12:10];
- real angle_deg=30;
- parameter integer iterations=12;
- parameter integer data_vec_size=20;
- parameter integer FXP_SCALE=2**(data_vec_size-1);
- //program constants
- reg signed [data_vec_size*2:0] pi=3.1415926535897932384626433832795*FXP_SCALE;
- reg signed [data_vec_size:0] t_angle = 0;
- //Table of arctan (1/2^i)
- // Note. Table initialization below is not correct for Verilog. Select System-Verilog mode
- // in your simulator in the case of syntax errors
- reg signed [data_vec_size:0] arctan[0:23] = {
- 0.78539816339745*FXP_SCALE , 0.46364760900081*FXP_SCALE , 0.24497866312686*FXP_SCALE , 0.12435499454676*FXP_SCALE,
- 0.06241880999596*FXP_SCALE , 0.03123983343027*FXP_SCALE , 0.01562372862048*FXP_SCALE , 0.00781234106010*FXP_SCALE,
- 0.00390623013197*FXP_SCALE , 0.00195312251648*FXP_SCALE , 0.00097656218956*FXP_SCALE , 0.00048828121119*FXP_SCALE,
- 0.00024414062015*FXP_SCALE , 0.00012207031189*FXP_SCALE , 0.00006103515617*FXP_SCALE , 0.00003051757812*FXP_SCALE,
- 0.00001525878906*FXP_SCALE , 0.00000762939453*FXP_SCALE , 0.00000381469727*FXP_SCALE , 0.00000190734863*FXP_SCALE,
- 0.00000095367432*FXP_SCALE , 0.00000047683716*FXP_SCALE , 0.00000023841858*FXP_SCALE , 0.00000011920929*FXP_SCALE
- };
- reg signed [data_vec_size:0] Kn[0:23] ={
- 0.70710678118655*FXP_SCALE, 0.63245553203368*FXP_SCALE, 0.61357199107790*FXP_SCALE, 0.60883391251775*FXP_SCALE,
- 0.60764825625617*FXP_SCALE, 0.60735177014130*FXP_SCALE, 0.60727764409353*FXP_SCALE, 0.60725911229889*FXP_SCALE,
- 0.60725447933256*FXP_SCALE, 0.60725332108988*FXP_SCALE, 0.60725303152913*FXP_SCALE, 0.60725295913894*FXP_SCALE,
- 0.60725294104140*FXP_SCALE, 0.60725293651701 *FXP_SCALE, 0.60725293538591*FXP_SCALE, 0.60725293510314*FXP_SCALE,
- 0.60725293503245*FXP_SCALE, 0.60725293501477*FXP_SCALE, 0.60725293501035*FXP_SCALE, 0.60725293500925*FXP_SCALE,
- 0.60725293500897*FXP_SCALE, 0.60725293500890*FXP_SCALE, 0.60725293500889 *FXP_SCALE, 0.60725293500888*FXP_SCALE
- }; //Cordic scaling factor for 10 iterations
- //Variables
- reg signed [data_vec_size:0] cos=1*FXP_SCALE; //Initial vector x coordinate
- reg signed [data_vec_size:0] sin=0; //and y coordinate
- reg signed [data_vec_size:0] angle = 0.0; //A running angle
- integer i, d;
- reg signed [data_vec_size:0] tmp;
- reg signed [data_vec_size*2:0] sin_out;
- reg signed [data_vec_size*2:0] cos_out;
- reg signed [1:0] input_flag=0;
- reg signed [1:0] output_flag=0;
- //reg signed [data_vec_size*2:0] cos_print;
- //reg signed [data_vec_size*2:0] sin_print;
- real cos_print;
- real sin_print;
- initial //Execute only once
- begin
- t_angle = (pi*angle_deg)/180;
- for ( i = 0; i < iterations-1; i = i + 1) //Ten algorithm iterations
- begin
- if( t_angle > angle )
- begin
- angle = angle + arctan[i];
- tmp = cos - ( sin / 2**i );
- sin = ( cos / 2**i ) + sin;
- cos = tmp;
- end
- else
- begin
- angle = angle - arctan[i];
- tmp = cos + ( sin / 2**i );
- sin = - ( cos / 2**i) + sin;
- cos = tmp;
- end //if
- end //for
- //Scale sin/cos values
- sin_out = Kn[iterations-1] * sin;
- cos_out = Kn[iterations-1] * cos;
- sin_out =sin_out/FXP_SCALE;
- cos_out =cos_out/FXP_SCALE ;
- cos_print=cos_out;
- sin_print=sin_out;
- cos_print=cos_print/FXP_SCALE;
- sin_print=sin_print/FXP_SCALE;
- $display("sin=%f, cos=%f, with factor scale = %d", sin_out, cos_out, FXP_SCALE);
- $display("sin=%f, cos=%f, with factor scale = %d", sin_print, cos_print, FXP_SCALE);
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement