?? fft_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 + -