module fft64_top(
//input
                 clk           ,
                 rst_n           ,
                 data_in_valid ,
                 data_in_re    ,
                 data_in_im    ,
//output
                 data_out_valid,
                 data_out_re   ,
                 data_out_im   ,
                 out_index 
                 );
                 
parameter DATAWIDTH = 10 ;

input                           clk             ;            
input                           rst_n             ;              
input                           data_in_valid   ;    
input   [DATAWIDTH-1:0]         data_in_re      ;          
input   [DATAWIDTH-1:0]         data_in_im      ;      

output                          data_out_valid  ;
output  [DATAWIDTH-1:0]         data_out_re     ;
output  [DATAWIDTH-1:0]         data_out_im     ;
output  [5:0]                   out_index       ;

reg                            data_out_valid  ;
reg    [DATAWIDTH-1:0]         data_out_re     ;
reg    [DATAWIDTH-1:0]         data_out_im     ;
reg    [5:0]                   out_index       ;

wire                            data_out_valid_tmp  ;
wire    [DATAWIDTH-1:0]         data_out_re_tmp     ;
wire    [DATAWIDTH-1:0]         data_out_im_tmp     ;
wire    [5:0]                   out_index_tmp       ;

wire                            data_out_valid_st1  ;
wire    [DATAWIDTH-1:0]         data_out_re_st1     ;
wire    [DATAWIDTH-1:0]         data_out_im_st1     ;
wire                            data_out_valid_st2  ;
wire    [DATAWIDTH-1:0]         data_out_re_st2     ;
wire    [DATAWIDTH-1:0]         data_out_im_st2     ;

always  @(posedge clk or negedge rst_n)
  if (!rst_n)
    data_out_valid <= 1'b0   ;
  else
    data_out_valid <= data_out_valid_tmp  ;
    
always  @(posedge clk or negedge rst_n)
  if (!rst_n)
    data_out_re <= {DATAWIDTH{1'b0}}   ;
  else
    data_out_re <= data_out_re_tmp  ;
    
always  @(posedge clk or negedge rst_n)
  if (!rst_n)
    data_out_im <= {DATAWIDTH{1'b0}}   ;
  else
    data_out_im <= data_out_im_tmp  ;
    
    
always  @(posedge clk or negedge rst_n)
  if (!rst_n)
    out_index <= 6'b0   ;
  else
    out_index <= out_index_tmp  ;
    
    

fft4_st1      u_fft4_st1_top(
//input
                             .clk(clk),
                             .rst_n(rst_n),
                             .data_in_valid(data_in_valid),
                             .data_in_re(data_in_re),
                             .data_in_im(data_in_im),
//output                     
                             .data_out_valid_st1(data_out_valid_st1),
                             .data_out_re_st1(data_out_re_st1),
                             .data_out_im_st1(data_out_im_st1)
                             );

fft4_st2        u_fft4_st2_top(
//input
                               .clk          (clk)                  ,
                               .rst_n        (rst_n)                  ,
                               .data_in_valid(data_out_valid_st1)   ,
                               .data_in_re   (data_out_re_st1)      ,
                               .data_in_im   (data_out_im_st1)      ,
//output                       
                               .data_out_valid_st2(data_out_valid_st2)    ,
                               .data_out_re_st2   (data_out_re_st2)       ,
                               .data_out_im_st2   (data_out_im_st2)       
                               );
                
                
bu4_st3       u_bu4_st3_top(
//input
                              .clk           (clk)                      ,
                              .rst_n         (rst_n)                    ,
                              .data_in_valid (data_out_valid_st2)       ,
                              .data_in_re    (data_out_re_st2)          ,
                              .data_in_im    (data_out_im_st2)          ,
//output                      
                              .data_out_valid (data_out_valid_tmp)  ,
                              .data_out_re    (data_out_re_tmp   )  ,
                              .data_out_im    (data_out_im_tmp   )   
                              );
                
out_index     u_out_index_top(                               
//input                                         
                              .clk       (clk)     ,    
                              .rst_n     (rst_n)   ,    
                              .start     (data_out_valid_tmp)   ,    
//output                                    
                              .out_index (out_index_tmp)    
                              );            

                              
                              
endmodule

D159