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();
- /**
- * Cordic algorithm
- */
- //Input arguments
- real angle_deg=45;
- parameter integer iterations=20;
- parameter integer FXP_SCALE=10000;
- parameter integer data_vec_size=15;
- //program constants
- reg signed [data_vec_size:0] pi=3.1415926535897932384626433832795;
- reg signed [data_vec_size:0] t_angle = (pi*angle_deg)*FXP_SCALE/180; //Input parameter. The angle
- //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;
- initial //Execute only once
- begin
- 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 ;
- $display("sin=%f, cos=%f, with factor scale = %d", sin_out, cos_out, FXP_SCALE);
- end
- endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement