打印
[verilog]

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

[复制链接]
2682|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
孙秀青|  楼主 | 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了

使用特权

评论回复
5
孙秀青|  楼主 | 2013-9-22 23:02 | 只看该作者
muhan9 发表于 2013-9-22 21:41
仿真时把旋转因子文件也添加进去,就是那几个hex文件,然后就OK了

ok,谢谢你

使用特权

评论回复
6
GoldSunMonkey| | 2013-9-22 23:13 | 只看该作者
孙秀青 发表于 2013-9-22 19:04
没加呀,只有第一个结果是正确的,后面的都不对。还有就是我要是换一组输入数据,结果就是对的 ...

听各位朋友的

使用特权

评论回复
7
GoldSunMonkey| | 2013-9-22 23:14 | 只看该作者
孙秀青 发表于 2013-9-22 23:02
ok,谢谢你

搞定了?

使用特权

评论回复
8
GoldSunMonkey| | 2013-9-22 23:14 | 只看该作者
等你的分享啊

使用特权

评论回复
9
孙秀青|  楼主 | 2013-9-24 12:46 | 只看该作者
GoldSunMonkey 发表于 2013-9-22 23:14
等你的分享啊

因为我的输入数据都是1和-1,本来这个数据做出的结果就很小,误差比真实结果还大,所以建议把数据扩大64倍后再做FFT,做完后再缩小64倍,结果就差不多了

使用特权

评论回复
10
huqiyong| | 2014-7-21 18:56 | 只看该作者
我想问一下  仿真的时候激励怎么给?最近也在搞这个  用的是IP核

使用特权

评论回复
11
andous| | 2014-7-21 22:25 | 只看该作者
自己写个testbench,然后按照时序去仿真验证就OK

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝