⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coordinate_cordic.v

📁 用verilog写的CORDIC算法实现
💻 V
字号:
//****************************************************//
//Author:   |Wei.Shen
//Edit:     |edit the CORDIC arithmetic
//Edit Date:|2005.04.26
//Update: 	|
//Edit Date:| 
//Descript: |this module used to caculate the amplitude and 
//          |angle of a signal. the angle have divide with PI
//****************************************************//
module Freqmeter_CORDIC
(
	realIn,
	imagIn,
	clk,
	amplitude,
	angle
);

//==================================================
//				Input/Output Ports
//==================================================
input signed [INWIDTH-1:0]realIn,imagIn;
input clk;
output signed [OUTWIDTH-1:0]amplitude;
output signed [ANGLEWIDTH-1:0]angle;
//==================================================
//				Parameter Declaration
//==================================================
parameter INWIDTH = 20,  //input data width
		  OUTWIDTH = 22, //output data width
		  MIDWIDTH = 23, //the temporary data width
		  ANGLEWIDTH =15;//the angle width,use degree unit and four bits precision
		                 //in fraction part,highest is sign bit

parameter ARCTANG_0  = 12'b10_01110_00100,//0.7854 expand with 10000*/PI times is +7854 = +2500
		  ARCTANG_1  = 11'b1_01110_00100,//0.4636 expand with 10000*/PI times is +4636 = +1476
		  ARCTANG_2  = 10'b11000_01100,//0.2450 expand with 10000*/PI times is +2450 = +780
		  ARCTANG_3  = 9'b1100_01100,//0.1244 expand with 10000*/PI times is +1244 = +396
		  ARCTANG_4  = 8'b110_00111,//0.0624 expand with 10000*/PI times is +624 = +199
		  ARCTANG_5  = 7'b11_00011,//0.0312 expand with 10000*/PI times is +312 = +99
          ARCTANG_6  = 6'b1_10010,//0.0156 expand with 10000*/PI times is +156 = +50
          ARCTANG_7  = 5'b11001,//0.0078 expand with 10000*/PI times is +78 = +25
          ARCTANG_8  = 4'b1100,//0.0039 expand with 10000*/PI times is +39 = +12
          ARCTANG_9  = 3'b110,//0.0020 expand with 10000*/PI times is +20 = +6
          ARCTANG_10 = 2'b11,//0.0010 expand with 10000*/PI times is +10 = +3
          ARCTANG_11 = 2'b10;//0.0005 expand with 10000*/PI times is +5 = +2
parameter HALFPI = 13'b100_11100_01000;//+15708/PI = +5000

//==================================================
//				Register Declaration
//==================================================
reg signed [MIDWIDTH-1:0]xData1,xData2,xData3,xData4,xData5,xData6,
                         xData7,xData8,xData9,xData10,xData11,xData12,
				         yData1,yData2,yData3,yData4,yData5,yData6,
				         yData7,yData8,yData9,yData10,yData11,yData12;

reg signed [ANGLEWIDTH-1:0]angle1,angle2,angle3,angle4,angle5,angle6,
					       angle7,angle8,angle9,angle10,angle11,angle12;


//==================================================
//				Wire Declaration
//==================================================
wire signed [MIDWIDTH-1:0]reIn,imIn;
wire signed [ANGLEWIDTH-1:0]ang;
//==================================================
//				Integer Declaration
//==================================================


//==================================================
//				Concurrent Assignment
//==================================================

assign reIn = realIn[INWIDTH-1]?(imagIn[INWIDTH-1]?-imagIn:imagIn):realIn;
assign imIn = realIn[INWIDTH-1]?(imagIn[INWIDTH-1]?realIn:-realIn):imagIn;
assign ang = realIn[INWIDTH-1]?(imagIn[INWIDTH-1]?-HALFPI:HALFPI):1'b0;
/*
//change 23 bits to 22 bits
assign amplitude = {xData13[MIDWIDTH-1],xData13[MIDWIDTH-3:0]};
//angle have expand with 10000 times
assign angle = angle13;
*/
assign amplitude = {xData12[MIDWIDTH-1],xData12[MIDWIDTH-3:0]};
assign angle = angle12;
//==================================================
//				Always Construct
//==================================================
always@(posedge clk)
begin
    // if y < 0 then d = 1;
    // x = x - y.d.2^-i;
    // y = y + x.d.2^-i;
    // z = z - d.arctan(2^-i);

    // i = 0   
    xData1 <= imIn[MIDWIDTH-1]?(reIn - imIn):(reIn + imIn);
	yData1 <= imIn[MIDWIDTH-1]?(imIn + reIn):(imIn - reIn);
	angle1 <= imIn[MIDWIDTH-1]?(ang - ARCTANG_0):(ang + ARCTANG_0);

    // i = 1
    xData2 <= yData1[MIDWIDTH-1]?(xData1 - {{2{yData1[MIDWIDTH-1]}},yData1[MIDWIDTH-2:1]}):(xData1 + {{2{yData1[MIDWIDTH-1]}},yData1[MIDWIDTH-2:1]});
	yData2 <= yData1[MIDWIDTH-1]?(yData1 + {{2{xData1[MIDWIDTH-1]}},xData1[MIDWIDTH-2:1]}):(yData1 - {{2{xData1[MIDWIDTH-1]}},xData1[MIDWIDTH-2:1]});
	angle2 <= yData1[MIDWIDTH-1]?(angle1 - ARCTANG_1):(angle1 + ARCTANG_1);

    // i = 2
    xData3 <= yData2[ANGLEWIDTH-1]?(xData2 - {{3{yData2[MIDWIDTH-1]}},yData2[MIDWIDTH-2:2]}):(xData2 + {{3{yData2[MIDWIDTH-1]}},yData2[MIDWIDTH-2:2]});
	yData3 <= yData2[ANGLEWIDTH-1]?(yData2 + {{3{xData2[MIDWIDTH-1]}},xData2[MIDWIDTH-2:2]}):(yData2 - {{3{xData2[MIDWIDTH-1]}},xData2[MIDWIDTH-2:2]});
	angle3 <= yData2[ANGLEWIDTH-1]?(angle2 - ARCTANG_2):(angle2 + ARCTANG_2);

    // i = 3
    xData4 <= yData3[ANGLEWIDTH-1]?(xData3 - {{4{yData3[MIDWIDTH-1]}},yData3[MIDWIDTH-2:3]}):(xData3 + {{4{yData3[MIDWIDTH-1]}},yData3[MIDWIDTH-2:3]});
	yData4 <= yData3[ANGLEWIDTH-1]?(yData3 + {{4{xData3[MIDWIDTH-1]}},xData3[MIDWIDTH-2:3]}):(yData3 - {{4{xData3[MIDWIDTH-1]}},xData3[MIDWIDTH-2:3]});
	angle4 <= yData3[ANGLEWIDTH-1]?(angle3 - ARCTANG_3):(angle3 + ARCTANG_3);

    // i = 4
    xData5 <= yData4[ANGLEWIDTH-1]?(xData4 - {{5{yData4[MIDWIDTH-1]}},yData4[MIDWIDTH-2:4]}):(xData4 + {{5{yData4[MIDWIDTH-1]}},yData4[MIDWIDTH-2:4]});
	yData5 <= yData4[ANGLEWIDTH-1]?(yData4 + {{5{xData4[MIDWIDTH-1]}},xData4[MIDWIDTH-2:4]}):(yData4 - {{5{xData4[MIDWIDTH-1]}},xData4[MIDWIDTH-2:4]});
	angle5 <= yData4[ANGLEWIDTH-1]?(angle4 - ARCTANG_4):(angle4 + ARCTANG_4);

    // i = 5
    xData6 <= yData5[ANGLEWIDTH-1]?(xData5 - {{6{yData5[MIDWIDTH-1]}},yData5[MIDWIDTH-2:5]}):(xData5 + {{6{yData5[MIDWIDTH-1]}},yData5[MIDWIDTH-2:5]});
	yData6 <= yData5[ANGLEWIDTH-1]?(yData5 + {{6{xData5[MIDWIDTH-1]}},xData5[MIDWIDTH-2:5]}):(yData5 - {{6{xData5[MIDWIDTH-1]}},xData5[MIDWIDTH-2:5]});
	angle6 <= yData5[ANGLEWIDTH-1]?(angle5 - ARCTANG_5):(angle5 + ARCTANG_5);

    // i = 6
    xData7 <= yData6[ANGLEWIDTH-1]?(xData6 - {{7{yData6[MIDWIDTH-1]}},yData6[MIDWIDTH-2:6]}):(xData6 + {{7{yData6[MIDWIDTH-1]}},yData6[MIDWIDTH-2:6]});
	yData7 <= yData6[ANGLEWIDTH-1]?(yData6 + {{7{xData6[MIDWIDTH-1]}},xData6[MIDWIDTH-2:6]}):(yData6 - {{7{xData6[MIDWIDTH-1]}},xData6[MIDWIDTH-2:6]});
	angle7 <= yData6[ANGLEWIDTH-1]?(angle6 - ARCTANG_6):(angle6 + ARCTANG_6);

    // i = 7
    xData8 <= yData7[ANGLEWIDTH-1]?(xData7 - {{8{yData7[MIDWIDTH-1]}},yData7[MIDWIDTH-2:7]}):(xData7 + {{8{yData7[MIDWIDTH-1]}},yData7[MIDWIDTH-2:7]});
	yData8 <= yData7[ANGLEWIDTH-1]?(yData7 + {{8{xData7[MIDWIDTH-1]}},xData7[MIDWIDTH-2:7]}):(yData7 - {{8{xData7[MIDWIDTH-1]}},xData7[MIDWIDTH-2:7]});
	angle8 <= yData7[ANGLEWIDTH-1]?(angle7 - ARCTANG_7):(angle7 + ARCTANG_7);

    // i = 8
    xData9 <= yData8[ANGLEWIDTH-1]?(xData8 - {{9{yData8[MIDWIDTH-1]}},yData8[MIDWIDTH-2:8]}):(xData8 + {{9{yData8[MIDWIDTH-1]}},yData8[MIDWIDTH-2:8]});
	yData9 <= yData8[ANGLEWIDTH-1]?(yData8 + {{9{xData8[MIDWIDTH-1]}},xData8[MIDWIDTH-2:8]}):(yData8 - {{9{xData8[MIDWIDTH-1]}},xData8[MIDWIDTH-2:8]});
	angle9 <= yData8[ANGLEWIDTH-1]?(angle8 - ARCTANG_8):(angle8 + ARCTANG_8);

    // i = 9
    xData10 <= yData9[ANGLEWIDTH-1]?(xData9 - {{10{yData9[MIDWIDTH-1]}},yData9[MIDWIDTH-2:9]}):(xData9 + {{10{yData9[MIDWIDTH-1]}},yData9[MIDWIDTH-2:9]});
	yData10 <= yData9[ANGLEWIDTH-1]?(yData9 + {{10{xData9[MIDWIDTH-1]}},xData9[MIDWIDTH-2:9]}):(yData9 - {{10{xData9[MIDWIDTH-1]}},xData9[MIDWIDTH-2:9]});
	angle10 <= yData9[ANGLEWIDTH-1]?(angle9 - ARCTANG_9):(angle9 + ARCTANG_9);

    // i = 10
    xData11 <= yData10[ANGLEWIDTH-1]?(xData10 - {{11{yData10[MIDWIDTH-1]}},yData10[MIDWIDTH-2:10]}):(xData10 + {{11{yData10[MIDWIDTH-1]}},yData10[MIDWIDTH-2:10]});
	yData11 <= yData10[ANGLEWIDTH-1]?(yData10 + {{11{xData10[MIDWIDTH-1]}},xData10[MIDWIDTH-2:10]}):(yData10 - {{11{xData10[MIDWIDTH-1]}},xData10[MIDWIDTH-2:10]});
	angle11 <= yData10[ANGLEWIDTH-1]?(angle10 - ARCTANG_10):(angle10 + ARCTANG_10);

    // i = 11
    xData12 <= yData11[ANGLEWIDTH-1]?(xData11 - {{12{yData11[MIDWIDTH-1]}},yData11[MIDWIDTH-2:11]}):(xData11 + {{12{yData11[MIDWIDTH-1]}},yData11[MIDWIDTH-2:11]});
	yData12 <= yData11[ANGLEWIDTH-1]?(yData11 + {{12{xData11[MIDWIDTH-1]}},xData11[MIDWIDTH-2:11]}):(yData11 - {{12{xData11[MIDWIDTH-1]}},xData11[MIDWIDTH-2:11]});
	angle12 <= yData11[ANGLEWIDTH-1]?(angle11 - ARCTANG_11):(angle11 + ARCTANG_11);
end	
//==================================================
//				Module Instantiation
//==================================================

//==================================================
//				Task Declaration
//==================================================

//==================================================
//				Function Declaration
//==================================================

endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -