90 lines
2.9 KiB
Verilog
90 lines
2.9 KiB
Verilog
//----------------------------------------------------------------------
|
|
// FFT: 1024-Point FFT Using Radix-2^2 Single-Path Delay Feedback
|
|
//----------------------------------------------------------------------
|
|
module FFTMAIN #(
|
|
parameter WIDTH = 32
|
|
)(
|
|
input clock, // Master Clock
|
|
input reset, // Active High Asynchronous Reset
|
|
input di_en, // Input Data Enable
|
|
input [WIDTH-1:0] di_re, // Input Data (Real)
|
|
input [WIDTH-1:0] di_im, // Input Data (Imag)
|
|
output do_en, // Output Data Enable
|
|
output [WIDTH-1:0] do_re, // Output Data (Real)
|
|
output [WIDTH-1:0] do_im // Output Data (Imag)
|
|
);
|
|
//----------------------------------------------------------------------
|
|
// Data must be input consecutively in natural order.
|
|
// The result is scaled to 1/N and output in bit-reversed order.
|
|
//----------------------------------------------------------------------
|
|
|
|
wire su1_do_en;
|
|
wire[WIDTH-1:0] su1_do_re;
|
|
wire[WIDTH-1:0] su1_do_im;
|
|
wire su2_do_en;
|
|
wire[WIDTH-1:0] su2_do_re;
|
|
wire[WIDTH-1:0] su2_do_im;
|
|
wire su3_do_en;
|
|
wire[WIDTH-1:0] su3_do_re;
|
|
wire[WIDTH-1:0] su3_do_im;
|
|
wire su4_do_en;
|
|
wire[WIDTH-1:0] su4_do_re;
|
|
wire[WIDTH-1:0] su4_do_im;
|
|
|
|
SdfUnit #(.N(1024),.M(1024),.WIDTH(WIDTH)) SU1 (
|
|
.clock (clock ), // i
|
|
.reset (reset ), // i
|
|
.di_en (di_en ), // i
|
|
.di_re (di_re ), // i
|
|
.di_im (di_im ), // i
|
|
.do_en (su1_do_en ), // o
|
|
.do_re (su1_do_re ), // o
|
|
.do_im (su1_do_im ) // o
|
|
);
|
|
|
|
SdfUnit #(.N(1024),.M(256),.WIDTH(WIDTH)) SU2 (
|
|
.clock (clock ), // i
|
|
.reset (reset ), // i
|
|
.di_en (su1_do_en ), // i
|
|
.di_re (su1_do_re ), // i
|
|
.di_im (su1_do_im ), // i
|
|
.do_en (su2_do_en ), // o
|
|
.do_re (su2_do_re ), // o
|
|
.do_im (su2_do_im ) // o
|
|
);
|
|
|
|
SdfUnit #(.N(1024),.M(64),.WIDTH(WIDTH)) SU3 (
|
|
.clock (clock ), // i
|
|
.reset (reset ), // i
|
|
.di_en (su2_do_en ), // i
|
|
.di_re (su2_do_re ), // i
|
|
.di_im (su2_do_im ), // i
|
|
.do_en (su3_do_en ), // o
|
|
.do_re (su3_do_re ), // o
|
|
.do_im (su3_do_im ) // o
|
|
);
|
|
|
|
SdfUnit #(.N(1024),.M(16),.WIDTH(WIDTH)) SU4 (
|
|
.clock (clock ), // i
|
|
.reset (reset ), // i
|
|
.di_en (su3_do_en ), // i
|
|
.di_re (su3_do_re ), // i
|
|
.di_im (su3_do_im ), // i
|
|
.do_en (su4_do_en ), // o
|
|
.do_re (su4_do_re ), // o
|
|
.do_im (su4_do_im ) // o
|
|
);
|
|
|
|
SdfUnit #(.N(1024),.M(4),.WIDTH(WIDTH)) SU5 (
|
|
.clock (clock ), // i
|
|
.reset (reset ), // i
|
|
.di_en (su4_do_en ), // i
|
|
.di_re (su4_do_re ), // i
|
|
.di_im (su4_do_im ), // i
|
|
.do_en (do_en ), // o
|
|
.do_re (do_re ), // o
|
|
.do_im (do_im ) // o
|
|
);
|
|
|
|
endmodule
|