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

Subversion Repositories pipelined_fft_128

[/] [pipelined_fft_128/] [trunk/] [SRC/] [fft16.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  :        Stage of FFT 128 processor
41
// FUNCTION:              16-point FFT
42
// FILES:                                       FFT16.v -  stage, contains
43
//                    MPUC707.v - multiplier to the factor 0.707.
44
//                    MPUC541.v - multiplier to the factor 0.541.
45
//                    MPUC1307.v - multiplier to the factor 1.307.
46
//                    MPUC924_383.v - multiplier to the factors 0.924 and 0.383.
47
//  PROPERTIES: 1) Fully pipelined
48
//                                                      2) Each clock cycle complex datum is entered
49
//                           and complex result is outputted
50
//                                                       3) Has 16-clock cycle period starting with the START impulse
51
//                          and continuing forever
52
//                                                      4) rounding     is not used
53
//                                                      5)Algorithm is from the book "H.J.Nussbaumer FFT and convolution algorithms".
54
//                                                      6)IFFT is performed by substituting the output result order to the reversed one
55
//                                                              (by exchanging - to + and + to -)
56
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
57
//Algorithm:
58
///procedure FFT16(
59
//              X: in MEMOC;  -- âõîäíîé ìàññèâ äàííûõ
60
//              y:out MEMOC)  -- âûõîäíîé ìàññèâ ñïåêòðîâ
61
//              is   
62
//              variable t1,t2,t3,t4,t5,t6,t7,t8,t9,t10: complex;
63
//              variable t11,t12,t13,t14,t15,t16,t17,t18,t19,t20: complex;
64
//              variable t21,t22,t23,t24,t25,t26: complex;
65
//              variable m0,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10: complex;
66
//              variable m11,m12,m13,m14,m15,m16,m17: complex;
67
//              variable s1,s2,s3,s4,s5,s6,s7,s8,s9,s10: complex;
68
//              variable s11,s12,s13,s14,s15,s16,s17,s18,s19,s20: complex;
69
//      begin                                              
70
//              t1:=x(0) + x(8);                        m4:=x(0) - x(8);
71
//              t2:=x(4) + x(12);           m12:=-CBASE_j*(x(4)-x(12));
72
//              t3:=x(2) + x(10);                       t4:=x(2) - x(10);
73
//              t5:=x(6) + x(14);                       t6:=x(6) - x(14);
74
//              t7:=x(1) + x(9);                        t8:=x(1) - x(9);
75
//              t9:=x(3) + x(11);                       t10:=x(3) - x(11);
76
//              t11:=x(5) + x(13);              t12:=x(5) - x(13);
77
//              t13:=x(7) + x(15);              t14:=x(7) - x(15);
78
//              t15:=t1 + t2;                           m3:= t1 - t2;
79
//              t16:=t3 + t5;                           m11:= -CBASE_j*(t3 - t5);
80
//              t17:=t15 + t16;                 m2:= t15 - t16;
81
//              t18:=t7 + t11;                          t19:= t7 - t11;
82
//              t20:=t9 + t13;                          t21:= t9 - t13;
83
//              t22:=t18 + t20;                 m10:= -CBASE_j*(t18 - t20);
84
//              t23:=t8 + t14;                          t24:= t8 - t14;
85
//              t25:=t12 + t10;                 t26:= t12 - t10;
86
//              
87
//              m0:=t17 + t22;                          m1:=t17 - t22;
88
//              m13:=-CBASE_j*c707*(t19 + t21);                 m5:=c707*(t19 - t21);                     
89
//              m6:=c707*(t4 - t6);             m14:=-CBASE_j*c707*(t4 + t6);           
90
//      
91
//              m7:=c3*(t24+t26);
92
//              m8:=c13*(t24);
93
//              m9:=-s1_3*(t26);  
94
//              s7:= m8 - m7;                                    
95
//              s8:= m9 - m7;   
96
//              
97
//              m15:=-CBASE_j*c1*(t23 + t25);      
98
//              m16:= -CBASE_j*s1_3*(t23);         
99
//              m17:=-CBASE_j*c13*(t25);
100
//              s15:= m15 - m16;                                                         
101
//              s16:= m15 - m17;
102
//              
103
//              s1:=m3 + m5;                    s2:=m3 - m5;
104
//              s3:=m13 + m11;          s4:=m13 - m11;                          
105
//              s5:=m4 + m6;                    s6:=m4 - m6;
106
//              s9:=s5 + s7;                            s10:=s5 - s7;
107
//              s11:=s6 + s8;                   s12:=s6 - s8;
108
//              s13:=m12 + m14;         s14:=m12 - m14;                         
109
//              s17:=s13 + s15;         s18:=s13 - s15;   
110
//              s19:=s14 + s16;         s20:=s14 - s16;
111
//              
112
//              y(0):=m0;                       y(8):=m1;
113
//              y(1):=s9 + s17; y(15):=s9 - s17;
114
//              y(2):=s1 + s3;          y(14):=s1 - s3;
115
//              y(3):=s12 - s20;        y(13):=s12 + s20;
116
//              y(4):=m2 + m10; y(12):=m2 - m10;
117
//              y(5):=s11 + s19;        y(11):=s11 - s19;
118
//              y(6):=s2 + s4;          y(10):=s2 - s4;
119
//              y(7):=s10 - s18;        y(9):=s10 + s18;
120
//      end procedure;  
121
//
122
 
123
`timescale 1ns / 1ps
124
`include "FFT128_CONFIG.inc"
125
 
126
module FFT16 ( DOR ,DII ,RST ,ED ,CLK ,DOI ,START ,DIR ,RDY );
127
        `FFT128paramnb
128
 
129
        input ED ;                //slowdown impulse
130
        wire ED ;
131
        input RST ;
132
        wire RST ;
133
        input CLK ;
134
        wire CLK ;
135
        input [nb-1:0] DII ;
136
        wire [nb-1:0] DII ;
137
        input START ;
138
        wire START ;
139
        input [nb-1:0] DIR ;
140
        wire [nb-1:0] DIR ;
141
 
142
        output [nb+3:0] DOI ;
143
        wire [nb+3:0] DOI ;
144
        output [nb+3:0] DOR ;
145
        wire [nb+3:0] DOR ;
146
        output RDY ;
147
        reg RDY ;
148
 
149
        reg [3:0] ct; //main phase counter
150
        reg [5:0] ctd; //delay counter
151
 
152
        always @(   posedge CLK) begin  //Control counter
153
                        //
154
                        if (RST)        begin
155
                                        ct<=0;
156
                                        ctd<=63;
157
                                RDY<=0;  end
158
                        else if (START)   begin
159
                                        ct<=0;
160
                                        ctd<=0;
161
                                RDY<=0;   end
162
                        else if (ED) begin
163
                                        RDY<=0;
164
                                        ct<=ct+1;
165
                                        if (ctd !=6'b111111)
166
                                                ctd<=ctd+1;
167
                                        if (ctd==44-16 )
168
                                                RDY<=1;
169
                                end
170
 
171
                end
172
 
173
        reg signed      [nb-1: 0] dr,d1r,d2r,d3r,d4r,d5r,d6r,d7r,d8r,di,d1i,d2i,d3i,d4i,d5i,d6i,d7i,d8i;
174
        always @(posedge CLK)     // input register file
175
                begin
176
                        if (ED)         begin
177
                                        dr<=DIR;
178
                                        d1r<=dr;        d2r<=d1r;       d3r<=d2r;d4r<=d3r;
179
                                        d5r<=d4r;d6r<=d5r;      d7r<=d6r;       d8r<=d7r;
180
                                        di<=DII;
181
                                        d1i<=di;        d2i<=d1i;       d3i<=d2i;       d4i<=d3i;
182
                                        d5i<=d4i;       d6i<=d5i;d7i<=d6i;      d8i<=d7i;
183
                                end
184
                end
185
 
186
        reg signed      [nb:0]   s1r,s1d1r,s1d2r,s1d3r,s1d4r,s1d5r,s1d6r,s1d7r,s1d8r;    //even result sums
187
        reg signed      [nb:0]   s1i,s1d1i,s1d2i,s1d3i,s1d4i,s1d5i,s1d6i,s1d7i,s1d8i;    //even result sums
188
        reg signed      [nb:0]   s2r,s2d1r,s2d2r,s2d3r,s2d4r,s2d5r,s2d6r,s2d7r,s2d8r,m4_12r;             //odd result sums
189
        reg signed      [nb:0]   s2i,s2d1i,s2d2i,s2d3i,s2d4i,s2d5i,s2d6i,s2d7i,s2d8i,m4_12i;             //odd result sums
190
        always @(posedge CLK)   begin              // S1,S2 =t1-t14,m4,m12' and delayed
191
                        if (ED && ((ct==9) || (ct==10) || (ct==11) ||(ct==12) ||
192
                                (ct==13) || (ct==14) ||(ct==15) || (ct==0))) begin
193
                                        s1r<=d8r + dr ;
194
                                        s1i<=d8i + di ;
195
                                        s2r<=d8r - dr ;
196
                                        s2i<= d8i - di;
197
                                end
198
                        if      (ED)   begin                    //delayed results
199
                                        s1d1r<=s1r;     s1d2r<=s1d1r;   s1d1i<=s1i;     s1d2i<=s1d1i;
200
                                        s1d3r<=s1d2r;   s1d3i<=s1d2i;   s1d4r<=s1d3r;   s1d4i<=s1d3i;
201
                                        s1d5r<=s1d4r;   s1d5i<=s1d4i;   s1d6r<=s1d5r;   s1d6i<=s1d5i;
202
                                        s1d7r<=s1d6r;   s1d7i<=s1d6i;   s1d8r<=s1d7r;   s1d8i<=s1d7i;
203
 
204
                                        s2d1r<=s2r;     s2d2r<=s2d1r;   s2d1i<=s2i;             s2d2i<=s2d1i;
205
                                        s2d3r<=s2d2r;   s2d3i<=s2d2i;   s2d4r<=s2d3r;   s2d4i<=s2d3i;
206
                                        s2d5r<=s2d4r;   s2d5i<=s2d4i;   s2d6r<=s2d5r;   s2d6i<=s2d5i;
207
                                        s2d7r<=s2d6r;   s2d7i<=s2d6i;   s2d8r<=s2d7r;   s2d8i<=s2d7i;
208
                                        if (ct==2)  begin
209
                                                m4_12r<=s2d8r;  m4_12i<=s2d8i;  end
210
                                        else if  (ct==6)  begin
211
                                                        m4_12r<=s2d8i;  m4_12i<= 0 - s2d8r;
212
                                                end
213
                                end
214
                end
215
        ///////////////////////////////////////////
216
        //arm of even result calculations 
217
        ////////////////////////////////////////////
218
        reg signed [nb+1:0]      s3r,s3d1r,s3d2r,s3d3r,s3d4r,s3d5r,s3d6r;
219
        reg signed [nb+1:0]      s3i,s3d1i,s3d2i,s3d3i,s3d4i,s3d5i,s3d6i;
220
        always @(posedge CLK)   begin             //ALU S3:     
221
                        if (ED)           begin
222
                                        case (ct)
223
                                                14 ,15 : begin s3r<=  s1d4r+s1r;                   //t15 //t18
224
                                                        s3i<= s1d4i+ s1i ;end
225
 
226
                                                        s3i<= s1d6i - s1d2i ;end
227
                                                2 ,3  : begin s3r<= s1d6r +s1d2r;                //t16 ,t20
228
                                                        s3i<= s1d6i+ s1d2i ; end
229
                                                4 ,5 : begin s3r<=  s1d8r - s1d4r;               //     m11',t21
230
                                                        s3i<= s1d8i - s1d4i ; end
231
                                        endcase
232
                                        s3d1r<=s3r;     s3d1i<=s3i;     s3d2r<=s3d1r; s3d2i<=s3d1i;
233
                                        s3d3r<=s3d2r;   s3d3i<=s3d2i;   s3d4r<=s3d3r; s3d4i<=s3d3i;
234
                                        s3d5r<=s3d4r;   s3d5i<=s3d4i;   s3d6r<=s3d5r; s3d6i<=s3d5i;
235
                                end
236
                end
237
 
238
        reg signed [nb+2:0]      s4r,s4d1r,s4d2r,s4d3r,s4d4r,s4d5r,s4d6r,s4d7r,m3r;
239
        reg signed [nb+2:0]      s4i,s4d1i,s4d2i,s4d3i,s4d4i,s4d5i,s4d6i,s4d7i,m3i;
240
 
241
        always @ (posedge CLK)  begin             // S4 
242
                        if (ED) begin
243
                                        if ((ct==3) | (ct==4)) begin
244
                                                        s4r<= s3d4r + s3r; //t17           ,t22
245
                                                s4i<= s3d4i + s3i; end
246
                                        else if ((ct==5) | (ct==6) | (ct==8) ) begin
247
                                                        s4r<=s3d6r - s3d2r;                                                //m2,m10', m5'
248
                                                s4i<= s3d6i - s3d2i;  end
249
                                        else if (ct==7) begin
250
                                                        s4r<=s3d1r + s3d5r;                                              //m13
251
                                                        s4i<= s3d1i + s3d5i;
252
                                                end
253
                                        s4d1r<=s4r;             s4d1i<=s4i;             s4d2r<=s4d1r; s4d2i<=s4d1i;
254
                                        s4d3r<=s4d2r;   s4d3i<=s4d2i;   s4d4r<=s4d3r; s4d4i<=s4d3i;
255
                                        s4d5r<=s4d4r;   s4d5i<=s4d4i;   s4d6r<=s4d5r; s4d6i<=s4d5i;
256
                                        s4d7r<=s4d6r;   s4d7i<=s4d6i;
257
                                        if (ct==7) begin
258
                                                        m3r<=s3d6r;                                      //m3
259
                                                m3i<=s3d6i;  end
260
                                end
261
                end
262
 
263
        wire em707,mpyj7;
264
        assign  em707 = ((ct==8) || (ct==10 )||(ct==1) || (ct==5));     //control signals for the multiplier 
265
        assign   mpyj7 = ((ct==8) || (ct==5));
266
 
267
        reg signed [nb+2:0]      s7r,s7d1r;
268
        reg signed [nb+2:0]      s7i,s7d1i;
269
        wire signed [nb+2:0] m707r,m707i,m70r,m70i;
270
        assign m70r = ((ct==1) || (ct==5))? s7r :s4r;      //multiplexor at the multiplier input
271
        assign m70i = ((ct==1) || (ct==5))? s7i :s4i;
272
 
273
        MPUC707 #(nb+3) UM707(  .CLK(CLK),.ED(ED),.DS(em707), .MPYJ(mpyj7),      //multiplier by 0.707
274
                .DR(m70r),.DI(m70i) ,.DOR(m707r) ,.DOI(m707i));
275
 
276
 
277
        reg signed [nb+2:0]      s3jr,s3ji, m10r,m10i;
278
        always @ (posedge CLK)  begin              //multiply by J 
279
                        if (ED) begin
280
                                        case  (ct)
281
                                                11: begin s3jr<= s3d6i;                 //m11
282
                                                        s3ji<=0 - s3d6r; end
283
                                                14: begin s3jr<= s4d7i; //m10 
284
                                                        s3ji<=0 - s4d7r; end
285
                                        endcase
286
                                        if (ct==1) begin
287
                                                        m10r<=s3jr;                              //m10
288
                                                        m10i<=s3ji;
289
                                                end
290
                                end
291
                end
292
 
293
        reg     signed [nb+3:0]  s5r,s5d1r,s5d2r,s5d3r,s5d4r,s5d5r,s5d6r,s5d7r,s5d8r,s5d9r, s5d10r,m2r,m2dr;
294
        reg     signed [nb+3:0]  s5i,s5d1i,s5d2i,s5d3i,s5d4i,s5d5i,s5d6i,s5d7i,s5d8i,s5d9i,s5d10i,m2i,m2di;
295
        always @ (posedge CLK)               //         S5:
296
                if (ED)  begin
297
                                case  (ct)
298
                                10: begin       s5r<=s4d5r + s4d6r;     //m0
299
                                        s5i<=s4d5i + s4d6i; end
300
                                11: begin       s5r<=s4d7r - s4d6r;      //m1
301
                                        s5i<=s4d7i - s4d6i;     end
302
                                12: begin        s5r<=m707r + s3jr;       //S3
303
                                s5i<= m707i+s3ji;end
304
                                13: begin        s5r<=m707r - s3jr;       //S4
305
                                s5i<= m707i - s3ji;end
306
                                14: begin        s5r<= m3r+m707r;         //S1
307
                                s5i<= m3i+m707i ;end
308
                                15: begin        s5r<=m3r-m707r ;         //S2
309
                                s5i<= m3i -m707i ;end
310
                                6: begin          //S2
311
                                        s5d10r<=s5d9r ;   //S2
312
                                s5d10i<=s5d9i ;end
313
 
314
                                endcase
315
                                if       ((ct==4)||(ct==5)||(ct==6)||(ct==7)) begin
316
                                        s5d9r<=s5d8r ;   s5d9i<=s5d8i ; end
317
 
318
                                s5d1r<=s5r;             s5d1i<=s5i;         s5d2r<=s5d1r;       s5d2i<=s5d1i;
319
                                s5d3r<=s5d2r;   s5d3i<=s5d2i;   s5d4r<=s5d3r;   s5d4i<=s5d3i;
320
                                s5d5r<=s5d4r;   s5d5i<=s5d4i;   s5d6r<=s5d5r;   s5d6i<=s5d5i;
321
                                s5d7r<=s5d6r;   s5d7i<=s5d6i;   s5d8r<=s5d7r;   s5d8i<=s5d7i;
322
 
323
                                if (ct==13)  begin
324
                                        m2r<=s4d7r;     m2i<=s4d7i;     end
325
                                if (ct==1)  begin
326
                                        m2dr<=m2r;      m2di<=m2i;      end
327
 
328
                        end
329
 
330
 
331
 
332
        reg     signed [nb+3:0]  s6r,s6i ;
333
 
334
        `ifdef FFT128paramifft                          // For IFFT
335
        always @ (posedge CLK)  begin            //  S6-- result adder
336
                        if (ED)
337
                                case  (ct)
338
                                        13: begin s6r<=s5d2r;     // --  Y0
339
                                                s6i<=(s5d2i);end           //--  Y0
340
                                        15: begin
341
                                                        s6r<=s5d2r - s5r ;                        //Y2
342
                                                s6i<=s5d2i - s5i ;       end
343
                                        1:  begin
344
                                                        s6r<=m2r - s3jr ;                               //Y4
345
                                                s6i<=m2i - s3ji ;         end
346
                                        3:  begin
347
                                                        s6r<=s5d3r - s5d5r ;                     //Y6
348
                                                s6i<= s5d3i -s5d5i ;    end
349
                                        5:begin s6r<=(s5d9r) ;      //--         Y8
350
                                                s6i<=(s5d9i) ; end
351
                                        7: begin
352
                                                        s6r<= s5d7r + s5d9r ;          //        Y10
353
                                                s6i<= s5d7i + s5d9i ;      end
354
                                        9: begin                                                            //   Y12
355
                                                        s6r<=m2dr +m10r ;
356
                                                        s6i<=m2di + m10i ;
357
                                                end
358
                                        11:   begin                                                                        //   Y14
359
                                                        s6r<= s5d9r + s5d10r ;
360
                                                        s6i<= s5d9i + s5d10i ;
361
                                                end
362
                                endcase
363
                end
364
 
365
        `else
366
        always @ (posedge CLK)  begin            //  S6-- result adder
367
                        if (ED)
368
                                case  (ct)
369
                                        13: begin s6r<=s5d2r;     // --  Y0
370
                                                s6i<=s5d2i;end     //--  Y0
371
                                        15: begin
372
                                                        s6r<=s5d2r + s5r ;                        //Y2
373
                                                s6i<=s5d2i + s5i ;       end
374
                                        1:  begin
375
                                                        s6r<=m2r + s3jr ;                               //Y4
376
                                                s6i<=m2i + s3ji ;         end
377
                                        3:  begin
378
                                                        s6r<=s5d3r + s5d5r ;                     //Y6
379
                                                s6i<= s5d3i +s5d5i ;    end
380
                                        5:begin s6r<=s5d9r;         //--         Y8
381
                                                s6i<=s5d9i; end
382
                                        7: begin
383
                                                        s6r<= s5d7r - s5d9r ;          //        Y10
384
                                                s6i<= s5d7i - s5d9i ;      end
385
                                        9: begin                                                            //   Y12
386
                                                        s6r<=m2dr -m10r ;
387
                                                        s6i<=m2di - m10i ;
388
                                                end
389
                                        11:   begin                                                                        //   Y14
390
                                                        s6r<= s5d9r - s5d10r ;
391
                                                        s6i<= s5d9i - s5d10i ;
392
                                                end
393
                                endcase
394
                end
395
        `endif
396
 
397
        ///////////////////////////////////////////////////////////
398
        //arm of odd result calculations 
399
        //////////////////////////////////////////////////////////
400
 
401
        always @(posedge CLK)   begin             //ALU S7:     
402
                        if (ED)
403
                                case (ct)
404
                                        15:begin s7r<=  s2d2r-s2r;                 //t26
405
                                                s7i<= s2d2i- s2i ;end
406
                                        0: begin s7r<=  s2d4r-s2r;                  //m6'
407
                                                        s7i<= s2d4i- s2i ;
408
                                                        s7d1r<=s7r;
409
                                                s7d1i<=s7i;end
410
                                        1: begin s7r<=  s2d6r - s2r;             //t24
411
                                                s7i<= s2d6i - s2i; end
412
                                        2: begin s7r<= s7r -s7d1r;               //m7'
413
                                                s7i<= s7i- s7d1i ; end
414
                                        3: begin s7r<=  s2d8r + s2d2r;           //     t23
415
                                                s7i<= s2d8i + s2d2i ; end
416
                                        4: begin s7r<=  s2d8r + s2d4r;           //     m14'
417
                                                        s7i<= s2d8i + s2d4i ;
418
                                                        s7d1r<=s7r;
419
                                                s7d1i<=s7i;end
420
                                        5: begin s7r<=  s2d8r + s2d6r;           //     t25
421
                                                s7i<= s2d8i + s2d6i ; end
422
                                        6: begin  s7r<= s7r + s7d1r;             //m15'
423
                                                s7i<= s7i + s7d1i ; end
424
                                endcase
425
                end
426
 
427
        wire em541,mpyj541;
428
        wire signed [nb+2:0] m541r,m541i;
429
        assign  em541 = ((ct==0) || (ct==4));    //control signals for the multiplier 
430
        assign   mpyj541 = ((ct==4));
431
        MPUC541 #(nb+3) UM541(  .CLK(CLK),.ED(ED),.DS(em541), .MPYJ(mpyj541),    //multiplier by 0.383
432
                .DR(s7r),.DI(s7i) ,.DOR(m541r) ,.DOI(m541i));
433
 
434
 
435
        wire em1307,mpyj1307;
436
        wire signed [nb+2:0] m1307r,m1307i;
437
        assign  em1307 = ((ct==2) || (ct==6));  //control signals for the multiplier 
438
        assign   mpyj1307 = ((ct==6));
439
        MPUC1307 #(nb+3) UM1307(  .CLK(CLK),.ED(ED),.DS(em1307), .MPYJ(mpyj1307),        //multiplier by 1.306
440
                .DR(s7r),.DI(s7i) ,.DOR(m1307r) ,.DOI(m1307i));
441
 
442
        wire em383,mpyj383,c383;
443
        wire signed [nb+2:0] m383r,m383i;
444
        assign  em383 = ((ct==3) || (ct==7));   //control signals for the multiplier 
445
        assign   mpyj383 = ((ct==7));
446
        assign c383 = (ct==3);
447
        MPUC924_383  #(nb+3) UM383(.CLK(CLK),.ED(ED),.DS(em383),.MPYJ(mpyj383),.C383(c383),      //multiplier by 0.383
448
                .DR(s7r),.DI(s7i) ,.DOR(m383r) ,.DOI(m383i));
449
 
450
        reg signed [nb+2:0] m8_17r,m8_17i,m9_16r,m9_16i;
451
        always @(posedge CLK)   begin             //Reg-s
452
                        if      (ED) begin
453
                                        if (ct==4 || ct==8) begin
454
                                                        m9_16r<=m541r;                                          //M9_ M16
455
                                                        m9_16i<=m541i;
456
                                                end
457
                                        if ( ct==6 || ct==10) begin
458
                                                        m8_17r<=m1307r;                                 //M8_ M17
459
                                                        m8_17i<=m1307i;
460
                                                end
461
                                end
462
                end
463
 
464
 
465
 
466
 
467
        reg     signed [nb+2:0]  s8r,s8i,s8d1r,s8d2r,s8d3r,s8d4r,s8d1i,s8d2i,s8d3i,s8d4i ;
468
        always @ (posedge CLK)  begin            //  S8--  adder
469
                        if (ED)
470
                                case  (ct)
471
                                        5,9: begin s8r<=m4_12r +m707r ;   // --  S5      S13
472
                                                s8i<=m4_12i +m707i  ;end           //--  
473
                                        6,10: begin
474
                                                        s8r<=m4_12r - m707r ;     // --  S6     , S14
475
                                                s8i<=m4_12i - m707i  ; end
476
                                        7:  begin
477
                                                        s8r<=m8_17r - m383r ;     // --  S7      ,S15
478
                                                s8i<=m8_17i -m383i  ;  end
479
                                        8:  begin
480
                                                        s8r<=m9_16r - m383r ;     // --  S8     ,       S16
481
                                                s8i<=m9_16i -m383i  ;   end
482
                                        11:  begin
483
                                                        s8r<=m383r - m9_16r  ;    // --  S7      ,S15
484
                                                s8i<=m383i -   m9_16i;  end
485
                                        12:  begin
486
                                                        s8r<=m383r - m8_17r;      // --  S8     ,       S16
487
                                                s8i<=m383i - m8_17i;    end
488
                                endcase
489
                        s8d1r<=s8r;             s8d1i<=s8i;         s8d2r<=s8d1r;       s8d2i<=s8d1i;
490
                        s8d3r<=s8d2r;   s8d3i<=s8d2i;   s8d4r<=s8d3r;   s8d4i<=s8d3i;
491
                end
492
 
493
        reg     signed [nb+3:0]  s9r,s9d1r,s9d2r,s9d3r,s9d4r,s9d5r,s9d6r,s9d7r,s9d8r,s9d9r, s9d10r,s9d11r,s9d12r,s9d13r;
494
        reg     signed [nb+3:0]  s9i,s9d1i,s9d2i,s9d3i,s9d4i,s9d5i,s9d6i,s9d7i,s9d8i,s9d9i,s9d10i,s9d11i,s9d12i,s9d13i;
495
        always @ (posedge CLK)               //         ALU s9:
496
                if (ED)  begin
497
                                case  (ct)
498
                                8,9,12: begin   s9r<=  s8r + s8d2r;     // S9,S11        , S17
499
                                        s9i<=s8i + s8d2i  ; end
500
                                13: begin       s9r<=  s8d2r - s8r;     // S20
501
                                        s9i<=s8d2i - s8i ; end
502
                                10,11,14: begin         s9r<=s8d4r - s8d2r;      //S10, S12,S18
503
                                        s9i<=s8d4i - s8d2i;     end
504
                                15: begin       s9r<=s8d4r + s8d2r;      //S19
505
                                s9i<=s8d4i + s8d2i;     end
506
                                endcase
507
 
508
                                s9d1r<=s9r;             s9d1i<=s9i;         s9d2r<=s9d1r;       s9d2i<=s9d1i;
509
                                s9d3r<=s9d2r;   s9d3i<=s9d2i;   s9d4r<=s9d3r;   s9d4i<=s9d3i;
510
                                s9d5r<=s9d4r;   s9d5i<=s9d4i;   s9d6r<=s9d5r;   s9d6i<=s9d5i;
511
                                s9d7r<=s9d6r;   s9d7i<=s9d6i;   s9d8r<=s9d7r;   s9d8i<=s9d7i;
512
 
513
                                s9d9r<=s9d8r ;   s9d9i<=s9d8i ;
514
                                if ((ct!=8)) begin
515
                                        s9d10r<=s9d9r ;  s9d10i<=s9d9i ;
516
                                        s9d11r<=s9d10r ;         s9d11i<=s9d10i ;  end
517
                                if ((ct==4) ||(ct==5) ||(ct==7) ||(ct==9) )  begin
518
                                        s9d12r<=s9d11r ;         s9d12i<=s9d11i ;       end
519
                                if ((ct==5))begin
520
                                        s9d13r<=s9d12r ;         s9d13i<=s9d12i ;       end
521
 
522
                        end
523
 
524
 
525
        reg     signed [nb+3:0]  s10r,s10i;
526
        reg     signed [nb+3:0]  s10dr,s10di;
527
 
528
                        `ifdef FFT256paramifft          //For IFFT
529
        always @ (posedge CLK)  begin            //  S10-- result adder
530
                        if (ED)
531
                                case  (ct)
532
                                        13: begin s10r<=s9d4r -s9r ;      // --  Y1
533
                                                s10i<=s9d4i -s9i ;end      //
534
                                        15:  begin
535
                                                        s10r<=s9d3r + s9d1r ;                //--        Y3
536
                                                s10i<=s9d3i + s9d1i ; end
537
                                        1:   begin
538
                                                        s10r<=s9d7r - s9d1r ;            //--    Y5
539
                                                s10i<=s9d7i - s9d1i ;      end
540
                                        3:   begin
541
                                                        s10r<=s9d8r + s9d4r ;                  // --     Y7
542
                                                s10i<= s9d8i + s9d4i ;end
543
 
544
                                        5:begin s10r<=s9d10r - s9d6r ;      //--         Y9
545
                                            s10i<=s9d10i - s9d6i ; end
546
                                        7:   begin
547
                                                        s10r<=s9d12r + s9d7r ;                //--       Y11
548
                                                s10i<=s9d12i + s9d7i ; end
549
 
550
                                        9:  begin
551
                                                        s10r<= s9d12r - s9d10r ;                //       Y13
552
                                                s10i<=s9d12i - s9d10i ; end
553
 
554
                                        11:   begin
555
                                                        s10r<= s9d13r + s9d12r ;                 //      Y15
556
                                                s10i<=  s9d13i + s9d12i ;       end
557
 
558
                                endcase
559
                        s10dr<=s10r; s10di<=s10i;
560
                end
561
        `else
562
 
563
//      reg signed [nb+3:0]     s10r,s10i,s10dr,s10di;
564
        always @ (posedge CLK)  begin            //  S10-- result adder
565
                        if (ED)
566
                                case  (ct)
567
                                        13: begin s10r<=s9d4r +s9r ;      // --  Y0
568
                                                s10i<=s9d4i +s9i ;end      //
569
                                        15:  begin
570
                                                        s10r<=s9d3r - s9d1r ;                //--        Y3
571
                                                s10i<=s9d3i - s9d1i ; end
572
                                        1:   begin
573
                                                        s10r<=s9d7r +s9d1r ;             //--    Y5
574
                                                s10i<=s9d7i +s9d1i ;       end
575
                                        3:   begin
576
                                                        s10r<=s9d8r - s9d4r ;                  // --     Y7
577
                                                s10i<= s9d8i - s9d4i ;end
578
 
579
                                        5:begin s10r<=s9d10r + s9d6r ;      //--         Y9
580
                                                s10i<=s9d10i + s9d6i ; end
581
                                        7:   begin
582
                                                        s10r<=s9d12r - s9d7r ;                //--       Y11
583
                                                s10i<=s9d12i - s9d7i ; end
584
 
585
                                        9:  begin
586
                                                        s10r<= s9d12r + s9d10r ;                //       Y13
587
                                                s10i<=s9d12i + s9d10i ; end
588
 
589
                                        11:   begin
590
                                                        s10r<= s9d13r - s9d12r ;                 //      Y15
591
                                                s10i<=  s9d13i - s9d12i ;       end
592
 
593
                                endcase
594
                        s10dr<=s10r; s10di<=s10i;
595
                end
596
                `endif
597
 
598
//wire signed [nb+3:0]  s6sr,s6si;        //saturation of results
599
//      assign s6sr = (~s6r[nb+4]&&s6r[nb+3])? ((1'b1 <<(nb+3))-1)      : s6r[nb+3:0];  
600
//      assign s6si = (~s6i[nb+4]&&s6i[nb+3])? ((1'b1<<(nb+3))-1)           : s6i[nb+3:0];      
601
//
602
 
603
        wire selo;
604
        assign selo = ct-(ct/2)*2;
605
                assign #1       DOR=selo? s10dr:s6r;
606
                assign #1       DOI= selo? s10di:s6i;
607
 
608
endmodule

powered by: WebSVN 2.1.0

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