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

📄 fft_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 circle transform
//          |based the CORDIC theoy.
//****************************************************//
module FFT_CORDIC
(
	RealIn,
	ImagIn,
	Angle,
	clk,
	RealOut,
	ImagOut
);

//==================================================
//				Input/Output Ports
//==================================================
input signed [INWIDTH-1:0]RealIn,ImagIn;
input signed [ANGLEWIDTH-1:0]Angle;
input clk;
output signed [OUTWIDTH-1:0]RealOut,ImagOut;

//==================================================
//				Parameter Declaration
//==================================================
parameter INWIDTH = 18,  //input data width
		  OUTWIDTH = 18, //output data width
		  MIDWIDTH = 20, //the temporary data width
		  ANGLEWIDTH =14;//the angle width

//positive actan() data ,use for add operation
parameter ARCTANG_0  = 13'b100_01100_10100,	//45     expand with 100 times is +4500
		  ARCTANG_1  = 12'b10_10011_00001,	//26.57  expand with 100 times is +2657
		  ARCTANG_2  = 11'b1_01011_11100,	//14.04  expand with 100 times is +1404
		  ARCTANG_3  = 10'b10110_01001,	//7.13   expand with 100 times is +713
		  ARCTANG_4  = 9'b1011_00110,	//3.58   expand with 100 times is +358
		  ARCTANG_5  = 8'b101_10011,	//1.79   expand with 100 times is +179
          ARCTANG_6  = 7'b10_11010,	//0.90   expand with 100 times is +90
          ARCTANG_7  = 6'b1_01101,	//0.45   expand with 100 times is +45
          ARCTANG_8  = 5'b10110,	//0.22   expand with 100 times is +22
          ARCTANG_9  = 4'b1011,//0.11   expand with 100 times is +11
          ARCTANG_10 = 3'b110,//0.06   expand with 100 times is +6
          ARCTANG_11 = 2'b11,//0.03   expand with 100 times is +3
          ARCTANG_12 = 1'b1;//0.01   expand with 100 times is +1

//==================================================
//				Register Declaration
//==================================================
reg signed [MIDWIDTH-1:0]xData1,xData2,xData3,xData4,xData5,xData6,
                         xData7,xData8,xData9,xData10,xData11,xData12,
			    		 xData13,xData14,xData15,xData16,xData17,
				         yData1,yData2,yData3,yData4,yData5,yData6,
				         yData7,yData8,yData9,yData10,yData11,yData12,
			    		 yData13,yData14,yData15,yData16,yData17;
reg signed [ANGLEWIDTH-1:0]angle1,angle2,angle3,angle4,angle5,angle6,
					       angle7,angle8,angle9,angle10,angle11,angle12;

//==================================================
//				Wire Declaration
//==================================================
//==================================================
//				Integer Declaration
//==================================================


//==================================================
//				Concurrent Assignment
//==================================================
//divide with 2 and shorten 2bits
assign RealOut = {xData17[MIDWIDTH-1],xData17[MIDWIDTH-3:1]};
assign ImagOut = {yData17[MIDWIDTH-1],yData17[MIDWIDTH-3:1]};

//==================================================
//				Always Construct
//==================================================
always@(posedge clk)
begin
    // if z < 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 <= Angle[ANGLEWIDTH-1]?(RealIn + ImagIn):(RealIn - ImagIn);
	yData1 <= Angle[ANGLEWIDTH-1]?(ImagIn - RealIn):(ImagIn + RealIn);
	angle1 <= Angle[ANGLEWIDTH-1]?(Angle + ARCTANG_0):(Angle - ARCTANG_0);

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

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

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

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

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

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

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

    // i = 8
    xData9 <= angle8[ANGLEWIDTH-1]?(xData8 + {{9{yData8[MIDWIDTH-1]}},yData8[MIDWIDTH-2:8]}):(xData8 - {{9{yData8[MIDWIDTH-1]}},yData8[MIDWIDTH-2:8]});
	yData9 <= angle8[ANGLEWIDTH-1]?(yData8 - {{9{xData8[MIDWIDTH-1]}},xData8[MIDWIDTH-2:8]}):(yData8 + {{9{xData8[MIDWIDTH-1]}},xData8[MIDWIDTH-2:8]});
	angle9 <= angle8[ANGLEWIDTH-1]?(angle8 + ARCTANG_8):(angle8 - ARCTANG_8);
    
    // i = 9
    xData10 <= angle9[ANGLEWIDTH-1]?(xData9 + {{10{yData9[MIDWIDTH-1]}},yData9[MIDWIDTH-2:9]}):(xData9 - {{10{yData9[MIDWIDTH-1]}},yData9[MIDWIDTH-2:9]});
	yData10 <= angle9[ANGLEWIDTH-1]?(yData9 - {{10{xData9[MIDWIDTH-1]}},xData9[MIDWIDTH-2:9]}):(yData9 + {{10{xData9[MIDWIDTH-1]}},xData9[MIDWIDTH-2:9]});
	angle10 <= angle9[ANGLEWIDTH-1]?(angle9 + ARCTANG_9):(angle9 - ARCTANG_9);
	
	// i = 10
    xData11 <= angle10[ANGLEWIDTH-1]?(xData10 + {{11{yData10[MIDWIDTH-1]}},yData10[MIDWIDTH-2:10]}):(xData10 - {{11{yData10[MIDWIDTH-1]}},yData10[MIDWIDTH-2:10]});
	yData11 <= angle10[ANGLEWIDTH-1]?(yData10 - {{11{xData10[MIDWIDTH-1]}},xData10[MIDWIDTH-2:10]}):(yData10 + {{11{xData10[MIDWIDTH-1]}},xData10[MIDWIDTH-2:10]});
	angle11 <= angle10[ANGLEWIDTH-1]?(angle10 + ARCTANG_10):(angle10 - ARCTANG_10);

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

	// i = 12
    xData13 <= angle12[ANGLEWIDTH-1]?(xData12 + {{13{yData12[MIDWIDTH-1]}},yData12[MIDWIDTH-2:12]}):(xData12 - {{13{yData12[MIDWIDTH-1]}},yData12[MIDWIDTH-2:12]});
	yData13 <= angle12[ANGLEWIDTH-1]?(yData12 - {{13{xData12[MIDWIDTH-1]}},xData12[MIDWIDTH-2:12]}):(yData12 + {{13{xData12[MIDWIDTH-1]}},xData12[MIDWIDTH-2:12]});


    //adjust the mod of amplitude 
    // i = +3
    xData14 <= (xData13 + {{4{xData13[MIDWIDTH-1]}},xData13[MIDWIDTH-2:3]});
	yData14 <= (yData13 + {{4{yData13[MIDWIDTH-1]}},yData13[MIDWIDTH-2:3]});

    // i = +4
    xData15 <= (xData14 + {{5{xData14[MIDWIDTH-1]}},xData14[MIDWIDTH-2:4]});
	yData15 <= (yData14 + {{5{yData14[MIDWIDTH-1]}},yData14[MIDWIDTH-2:4]});

    // i = +6
    xData16 <= (xData15 + {{7{xData15[MIDWIDTH-1]}},xData15[MIDWIDTH-2:6]});
	yData16 <= (yData15 + {{7{yData15[MIDWIDTH-1]}},yData15[MIDWIDTH-2:6]});

	// i = +11
    xData17 <= (xData16 + {{12{xData16[MIDWIDTH-1]}},xData16[MIDWIDTH-2:11]});
	yData17 <= (yData16 + {{12{yData16[MIDWIDTH-1]}},yData16[MIDWIDTH-2:11]});

end	

//==================================================
//				Module Instantiation
//==================================================

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

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

endmodule

⌨️ 快捷键说明

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