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
|