OpenCores
URL https://opencores.org/ocsvn/pipelined_fft_128/pipelined_fft_128/trunk

Subversion Repositories pipelined_fft_128

[/] [pipelined_fft_128/] [trunk/] [SRC/] [fft128.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 unicore
/////////////////////////////////////////////////////////////////////
2
////                                                             ////
3
////  FFT/IFFT 128 points transform                              ////
4
////                                                             ////
5
////  Authors: Anatoliy Sergienko, Volodya Lepeha                ////
6
////  Company: Unicore Systems http://unicore.co.ua              ////
7
////                                                             ////
8
////  Downloaded from: http://www.opencores.org                  ////
9
////                                                             ////
10
/////////////////////////////////////////////////////////////////////
11
////                                                             ////
12
//// Copyright (C) 2006-2010 Unicore Systems LTD                 ////
13
//// www.unicore.co.ua                                           ////
14
//// o.uzenkov@unicore.co.ua                                     ////
15
////                                                             ////
16
//// This source file may be used and distributed without        ////
17
//// restriction provided that this copyright statement is not   ////
18
//// removed from the file and that any derivative work contains ////
19
//// the original copyright notice and the associated disclaimer.////
20
////                                                             ////
21
//// THIS SOFTWARE IS PROVIDED "AS IS"                           ////
22
//// AND ANY EXPRESSED OR IMPLIED WARRANTIES,                    ////
23
//// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED                  ////
24
//// WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT              ////
25
//// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.        ////
26
//// IN NO EVENT SHALL THE UNICORE SYSTEMS OR ITS                ////
27
//// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,            ////
28
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL            ////
29
//// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT         ////
30
//// OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,               ////
31
//// DATA, OR PROFITS; OR BUSINESS INTERRUPTION)                 ////
32
//// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,              ////
33
//// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT              ////
34
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING                 ////
35
//// IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,                 ////
36
//// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.          ////
37
////                                                             ////
38
/////////////////////////////////////////////////////////////////////
39
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~           
40
// DESCRIPTION  :       Top level  of the  high speed FFT  core
41
// FUNCTION:     Structural model of the high speed 128-complex point FFT 
42
//                      core intended for synthesizing 
43
//                      for  any type FPGAs and ASIC.
44
// FILES:       FFT128.v - root unit, this file,   
45
//        FFT128_CONFIG.inc - core configuration file
46
//                      BUFRAM128C.v    - 1-st,2-nd,3-d data buffer, contains:
47
//                 RAM2x128C.v - dual ported synchronous RAM, contains:         
48
//                                         RAM128.v -single ported synchronous RAM
49
//                      FFT16.v- 1-st,2-nd stages implementing 16-point FFTs, contains
50
//                 MPU707.v, MPU707_2.v - multiplier to the factor 0.707.
51
//                      ROTATOR256.v - unit for rotating complex vectors, contains
52
//                  WROM256.v - ROM of twiddle factors.    
53
//         CNORM.v - normalization stages   
54
//              UNFFT256_TB.v - testbench file, includes:
55
//                               Wave_ROM256.v - ROM with input data and result reference data
56
//                              SineROM256_gen.pl - PERL script to generate the Wave_ROM256.v file
57
//
58
// PROPERTIES: 1. Fully pipelined, 1 complex data in, 1 complex result out each clock cycle
59
//                                                 2. Input data, output data, coefficient widths are adjustable  in range 8..16
60
//                                         3. Normalization stages trigger the data overflow and shift data right 
61
//                            to prevent the overflow     
62
//                                                 4. Core can contain 2 or 3 data buffers. In the configuration of 2 buffers 
63
//                            the results are in the shuffled order but provided with the proper address.
64
//                        5. The core operation can be slowed down by the control of the ED input
65
//                        6. The reset RST is synchronous one
66
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
67
`timescale 1 ns / 1 ps
68
`include "FFT128_CONFIG.inc"
69
 
70
module FFT128 ( CLK ,RST ,ED ,START ,SHIFT ,DR ,DI ,RDY ,OVF1 ,OVF2 ,ADDR ,DOR ,DOI );
71
        `FFT128paramnb                                  //nb is the data bit width
72
 
73
        output RDY ;                    // in the next cycle after RDY=1 the 0-th result is present 
74
        wire RDY ;
75
        output OVF1 ;                   // 1 signals that an overflow occured in the 1-st stage 
76
        wire OVF1 ;
77
        output OVF2 ;                   // 1 signals that an overflow occured in the 2-nd stage 
78
        wire OVF2 ;
79
        output [6:0] ADDR ;      //result data address/number
80
        wire [6:0] ADDR ;
81
        output [nb+3:0] DOR ;//Real part of the output data, 
82
        wire [nb+3:0] DOR ;       // the bit width is nb+4, can be decreased when instantiating the core 
83
        output [nb+3:0] DOI ;//Imaginary part of the output data
84
        wire [nb+3:0] DOI ;
85
 
86
        input CLK ;                             //Clock signal is less than 300 MHz for the Xilinx Virtex5 FPGA        
87
        wire CLK ;
88
        input RST ;                             //Reset signal, is the synchronous one with respect to CLK
89
        wire RST ;
90
        input ED ;                                      //=1 enables the operation (eneabling CLK)
91
        wire ED ;
92
        input START ;                   // its falling edge starts the transform or the serie of transforms  
93
        wire START ;                            // and resets the overflow detectors
94
        input [3:0] SHIFT ;              // bits 1,0 -shift left code in the 1-st stage
95
        wire [3:0] SHIFT ;               // bits 3,2 -shift left code in the 2-nd stage
96
        input [nb-1:0] DR ;              // Real part of the input data,  0-th data goes just after 
97
        wire [nb-1:0] DR ;           // the START signal or after 255-th data of the previous transform
98
        input [nb-1:0] DI ;              //Imaginary part of the input data
99
        wire [nb-1:0] DI ;
100
 
101
        wire [nb-1:0] dr1,di1;
102
        wire [nb+1:0] dr3,di3,dr4,di4, dr5,di5 ;
103
        wire [nb+2:0] dr2,di2;
104
        wire [nb+5:0] dr6,di6;
105
        wire [nb+3:0] dr7,di7,dr8,di8;
106
        wire rdy1,rdy2,rdy3,rdy4,rdy5,rdy6,rdy7,rdy8;
107
        reg [7:0] addri ;
108
                                                                                                    // input buffer =8-bit inversion ordering
109
        BUFRAM128C_1 #(nb) U_BUF1(.CLK(CLK), .RST(RST), .ED(ED),        .START(START),
110
        .DR(DR),        .DI(DI),                        .RDY(rdy1),     .DOR(dr1), .DOI(di1));
111
 
112
        //1-st stage of FFT
113
        FFT8 #(nb) U_FFT1(.CLK(CLK), .RST(RST), .ED(ED),
114
                .START(rdy1),.DIR(dr1),.DII(di1),
115
                .RDY(rdy2),     .DOR(dr2),.     DOI(di2));
116
 
117
        wire    [1:0] shiftl=     SHIFT[1:0];
118
        CNORM_1 #(nb) U_NORM1( .CLK(CLK),       .ED(ED),  //1-st normalization unit
119
                .START(rdy2),   // overflow detector reset
120
                .DR(dr2),       .DI(di2),
121
                .SHIFT(shiftl), //shift left bit number
122
                .OVF(OVF1),
123
                .RDY(rdy3),
124
                .DOR(dr3),.DOI(di3));
125
 
126
        // rotator to the angles proportional to PI/64
127
        ROTATOR128 #(nb+2) U_MPU (.CLK(CLK),.RST(RST),.ED(ED),
128
                .START(rdy3),. DR(dr3),.DI(di3),
129
                .RDY(rdy4), .DOR(dr4),  .DOI(di4));
130
 
131
        BUFRAM128C_2 #(nb+2) U_BUF2(.CLK(CLK),.RST(RST),.ED(ED),        // intermediate buffer =8-bit inversion ordering
132
                .START(rdy4),. DR(dr4),.DI(di4),
133
                .RDY(rdy5), .DOR(dr5),  .DOI(di5));
134
 
135
        //2-nd stage of FFT
136
        FFT16 #(nb+2) U_FFT2(.CLK(CLK), .RST(RST), .ED(ED),
137
                .START(rdy5),. DIR(dr5),.DII(di5),
138
                .RDY(rdy6), .DOR(dr6),  .DOI(di6));
139
 
140
        wire    [1:0] shifth=     SHIFT[3:2];
141
        //2-nd normalization unit
142
        CNORM_2 #(nb+2) U_NORM2 ( .CLK(CLK),    .ED(ED),
143
                .START(rdy6),   // overflow detector reset
144
                .DR(dr6),       .DI(di6),
145
                .SHIFT(shifth), //shift left bit number
146
                .OVF(OVF2),
147
                .RDY(rdy7),
148
                .DOR(dr7),      .DOI(di7));
149
 
150
 
151
                BUFRAM128C  #(nb+4)     Ubuf3(.CLK(CLK),.RST(RST),.ED(ED),      // intermediate buffer =8-bit inversion ordering
152
                .START(rdy7),. DR(dr7),.DI(di7),
153
                .RDY(rdy8), .DOR(dr8),  .DOI(di8));
154
 
155
 
156
 
157
 
158
        `ifdef FFT128parambuffers3              // 3-data buffer configuratiion                    
159
        always @(posedge CLK)   begin   //POINTER to the result samples
160
                        if (RST)
161
                                addri<=7'b000_0000;
162
                        else if (rdy8==1 )
163
                                addri<=7'b000_0000;
164
                        else if (ED)
165
                                addri<=addri+1;
166
                end
167
 
168
                assign ADDR=  addri ;
169
        assign  DOR=dr8;
170
        assign  DOI=di8;
171
        assign  RDY=rdy8;
172
 
173
        `else
174
                always @(posedge CLK)   begin   //POINTER to the result samples
175
                        if (RST)
176
                                addri<=7'b000_0000;
177
                        else if (rdy7)
178
                                addri<=7'b000_0000;
179
                        else if (ED)
180
                        addri<=addri+1;
181
                end
182
        assign #1        ADDR=  {addri[2:0] , addri[6:3]} ;
183
        assign #2       DOR= dr7;
184
        assign #2  DOI= di7;
185
        assign          RDY= rdy7;
186
        `endif
187
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.