[verilog] FFT核做8192点数据,但是仿真结果和matlab的结果不一...

2019-07-16 01:17发布

你好,我是先使用一个512点的单端口ROM存储了512点的数据,然后将数据读出送给FFT核做8192点的快速傅里叶变换,但是最后我用modelsim仿真的结果中,只有第一个结果是正确的,后面的都和matlab结果不一样。而且输入数据也是正确的,但就是不知道错哪里了?求求各位帮帮忙吧!

源程序如下:
module coeff(
  clk,
  rst,
  dina,
  dv_coe,
  douta,
  xn_re,
  xn_im,
  rfd,
  xn_index,
  xk_index,
  xk_re_coeff,
  xk_im_coeff
  );
  
input clk;
input rst;
input [15 :0] dina;                //  使能每次和数据一起做fft
output dv_coe;
output [31 :0] douta;
output [7 : 0] xn_re;
output [7 : 0] xn_im;
output rfd;
output [12 : 0] xn_index;
output [12 : 0] xk_index;
output [21 : 0] xk_re_coeff;
output [21 : 0] xk_im_coeff;



reg rsta;
reg start;
reg en;
reg [7 : 0] xn_re;
reg [7 : 0] xn_im;
reg [8 : 0] addra;





//------- 由xn_index控制从rom读数
always @(posedge clk)
                begin
                        addra <= xn_index[8:0];
                end



always @(posedge clk)
                begin
                        xn_re <= douta [15 : 8];
                        xn_im <= douta [7 : 0];
                end


//-------系数只有512个。不够的后面补零
always @(posedge clk)
        begin
                if(xn_index>511)
                        rsta <= 1'b1;
                else
                   rsta <= 1'b0;
        end
        


core_coeff_rom coeff_core (
  .clka(clk),               // input clka
  .rsta(rsta),              // input rsta
  .ena(en),                // input ena   控制每次做系数的fft
  .addra(addra),            // input [8 : 0] addra  读数的地址控制
  .douta(douta)             // output [15 : 0] douta  系数  实部在高位,虚部在低位
);

        
//---------start使能-----------
always @(posedge clk)
        begin
                if(rst)
                        start <= 1'b1;
                else
                        start <= 1'b0;
        end
        
always @(posedge clk)
        begin
                if(rfd)
                        en <= 1'b1;
                else
                        en <= 1'b0;
        end                        
                                
core_coeff_fft coeff_FFT (
  .clk(clk),                 // input clk
  .start(start),             // input start
  .xn_re(xn_re),             // input [7 : 0] xn_re
  .xn_im(xn_im),             // input [7 : 0] xn_im
  .fwd_inv(1),               // input fwd_inv
  .fwd_inv_we(1),            // input fwd_inv_we
  .rfd(rfd),                 // output rfd  输入数据有效
  .xn_index(xn_index),       // output [12 : 0] xn_index
  .busy(busy),               // output busy
  .edone(edone),             // output edone
  .done(done),               // output done
  .dv(dv_coe),               // output dv   输出数据有效
  .xk_index(xk_index),       // output [12 : 0] xk_index
  .xk_re(xk_re_coeff),       // output [21 : 0] xk_re
  .xk_im(xk_im_coeff)        // output [21 : 0] xk_im
);

endmodule

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。