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

[复制链接]
 楼主| 孙秀青 发表于 2013-9-22 11:27 | 显示全部楼层 |阅读模式
你好,我是先使用一个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

muhan9 发表于 2013-9-22 12:54 来自手机 | 显示全部楼层
仿真时候没加旋转因子文件吧
 楼主| 孙秀青 发表于 2013-9-22 19:04 | 显示全部楼层
muhan9 发表于 2013-9-22 12:54
仿真时候没加旋转因子文件吧

没加呀,只有第一个结果是正确的,后面的都不对。还有就是我要是换一组输入数据,结果就是对的
muhan9 发表于 2013-9-22 21:41 | 显示全部楼层
仿真时把旋转因子文件也添加进去,就是那几个hex文件,然后就OK了
 楼主| 孙秀青 发表于 2013-9-22 23:02 | 显示全部楼层
muhan9 发表于 2013-9-22 21:41
仿真时把旋转因子文件也添加进去,就是那几个hex文件,然后就OK了

ok,谢谢你
GoldSunMonkey 发表于 2013-9-22 23:13 | 显示全部楼层
孙秀青 发表于 2013-9-22 19:04
没加呀,只有第一个结果是正确的,后面的都不对。还有就是我要是换一组输入数据,结果就是对的 ...

听各位朋友的
GoldSunMonkey 发表于 2013-9-22 23:14 | 显示全部楼层
孙秀青 发表于 2013-9-22 23:02
ok,谢谢你

搞定了?
GoldSunMonkey 发表于 2013-9-22 23:14 | 显示全部楼层
等你的分享啊
 楼主| 孙秀青 发表于 2013-9-24 12:46 | 显示全部楼层
GoldSunMonkey 发表于 2013-9-22 23:14
等你的分享啊

因为我的输入数据都是1和-1,本来这个数据做出的结果就很小,误差比真实结果还大,所以建议把数据扩大64倍后再做FFT,做完后再缩小64倍,结果就差不多了
huqiyong 发表于 2014-7-21 18:56 | 显示全部楼层
我想问一下  仿真的时候激励怎么给?最近也在搞这个  用的是IP核
andous 发表于 2014-7-21 22:25 | 显示全部楼层
自己写个testbench,然后按照时序去仿真验证就OK
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部