首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

FFT核做8192点数据,但是仿真结果和matlab的结果不一致,怎么办?求高手帮忙

FFT核做8192点数据,但是仿真结果和matlab的结果不一致,怎么办?求高手帮忙

你好,我是先使用一个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
返回列表