打印
[matlab]

fft ip核使用问题

[复制链接]
4061|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用了ise 13.3    ip核版本是7.1    做测试的时候    输出的结果除了0位正确 其他的 输出实部前边总是多了一个负号   本来结果应该是100   结果显示是-100  让人很郁闷
我的测试代码是这样的module ipcore16test;
        // Inputs
        reg clk;
        reg start;
        reg unload;
        reg [15:0] xn_re;
        reg [15:0] xn_im;
        reg fwd_inv;
        reg fwd_inv_we;
        reg [7:0] scale_sch;
        reg scale_sch_we;

        // Outputs
        wire rfd;
        wire [3:0] xn_index;
        wire busy;
        wire edone;
        wire done;
        wire dv;
        wire [3:0] xk_index;
        wire [15:0] xk_re;
        wire [15:0] xk_im;
        wire ovflo;

        // Instantiate the Unit Under Test (UUT)
        ipcorefft16 uut (
                .clk(clk),
                .start(start),
                .unload(unload),
                .xn_re(xn_re),
                .xn_im(xn_im),
                .fwd_inv(fwd_inv),
                .fwd_inv_we(fwd_inv_we),
                .scale_sch(scale_sch),
                .scale_sch_we(scale_sch_we),
                .rfd(rfd),
                .xn_index(xn_index),
                .busy(busy),
                .edone(edone),
                .done(done),
                .dv(dv),
                .xk_index(xk_index),
                .xk_re(xk_re),
                .xk_im(xk_im),
                .ovflo(ovflo)
        );

        initial begin
                // Initialize Inputs
                clk = 0;
                start = 1;
                unload = 1;
                xn_re = 0;
                xn_im = 0;
                fwd_inv = 1;
                fwd_inv_we = 1;
                scale_sch =  8'b00000000;
                scale_sch_we = 1;
      num=0;       
                #100;
                // Add stimulus here

        end
    always   #10   clk=~clk;
        reg[3:0] num;
    always @(posedge clk)
           begin
                   if(rfd)
                           begin
                       // num=num+1'b1;
                                        case(num)
                                           4'd0:xn_re=100;
                                           4'd1:xn_re=100;
                                           4'd2:xn_re=100;
                                           4'd3:xn_re=100;
                                           4'd4:xn_re=100;
                                           4'd5:xn_re=100;
                                           4'd6:xn_re=100;
                                           4'd7:xn_re=100;
                                           4'd8:xn_re=0;
                                           4'd9:xn_re=0;
                                           4'd10:xn_re=0;
                                           4'd11:xn_re=0;
                                           4'd12:xn_re=0;
                                           4'd13:xn_re=0;
                                           4'd14:xn_re=0;
                                           4'd15:xn_re=0;
                                                default: ;
                                        endcase
                              num=num+1'b1;       
                                end
                end   

endmodule
其实就是前8个点是100  后边的是0 一个很简单的方波     结果在红线标的地方 本来应该是100   但是成了-100  求教  高人指点

相关帖子

沙发
zhushouxi| | 2013-1-5 20:55 | 只看该作者
楼主的FFT数据输入时序控制错误,按照你的程序,你所计算的是以下数据的FFT:
[0 100 100 100 100 100 100 100 100 0 0 0 0 0 0 0 ]

即第一个数据为0,非 100,
故输出数据为
fft([0 100 100 100 100 100 100 100 100 0 0 0 0 0 0 0]),即你所得到数据,如下图所示



使用特权

评论回复
板凳
bulonghu|  楼主 | 2013-1-6 10:07 | 只看该作者
灰常感谢      那你知道这个如何才是个正确的应用程序?他这个在rfd为高的时候  输入信号才是有效的    我想不出来还有什么办法 能正确赋值啊   菜鸟求教

使用特权

评论回复
地板
zhushouxi| | 2013-1-6 12:08 | 只看该作者
start信号持续一个时钟周期即可,在start有效之后的下一个时钟周期往fft核送数据

使用特权

评论回复
5
bulonghu|  楼主 | 2013-1-6 15:08 | 只看该作者
本帖最后由 bulonghu 于 2013-1-6 15:48 编辑
zhushouxi 发表于 2013-1-6 12:08
start信号持续一个时钟周期即可,在start有效之后的下一个时钟周期往fft核送数据 ...

你说的这个 咋做啊  ?那个rfd总是在100ns后当start为1时才能变高   
always @(posedge clk)
           begin
                   if(start)
                           begin
                       // num<=num+1'b1;
                                        case(num)
                                           4'd0:xn_re=100;
                                           4'd1:xn_re=100;
                                           4'd2:xn_re=100;
                                           4'd3:xn_re=100;
                                           4'd4:xn_re=100;
                                           4'd5:xn_re=100;
                                           4'd6:xn_re=100;
                                           4'd7:xn_re=100;
                                           4'd8:xn_re=0;
                                           4'd9:xn_re=0;
                                           4'd10:xn_re=0;
                                           4'd11:xn_re=0;
                                           4'd12:xn_re=0;
                                           4'd13:xn_re=0;
                                           4'd14:xn_re=0;
                                           4'd15:xn_re=0;
                                                default: ;
                                        endcase
                             num=num+1'b1;        
                                end
                end   
我这样一做     输入数据在start变1时   也就瞬间输入进去了  可是rfd是在start变为1的下一个周期才变高的   这样就少输入了一个数据。 如何做呢? 菜鸟不懂

QQ截图20130106154726.jpg (92.5 KB )

QQ截图20130106154726.jpg

使用特权

评论回复
6
bulonghu|  楼主 | 2013-1-6 15:28 | 只看该作者
always @(posedge clk)
           begin
                   if(start)
                           begin
                       // num<=num+1'b1;
                                        case(num)
                                           4'd0:xn_re<=100;
                                           4'd1:xn_re<=100;
                                           4'd2:xn_re<=100;
                                           4'd3:xn_re<=100;
                                           4'd4:xn_re<=100;
                                           4'd5:xn_re<=100;
                                           4'd6:xn_re<=100;
                                           4'd7:xn_re<=100;
                                           4'd8:xn_re<=0;
                                           4'd9:xn_re<=0;
                                           4'd10:xn_re<=0;
                                           4'd11:xn_re<=0;
                                           4'd12:xn_re<=0;
                                           4'd13:xn_re<=0;
                                           4'd14:xn_re<=0;
                                           4'd15:xn_re<=0;
                                                default: ;
                                        endcase
                             num<=num+1'b1;       
                                end
                end  
我换成<=h还是不行     如果直接弄个#20  这样综合了 会不会有问题?如何用程序解决?

使用特权

评论回复
7
bulonghu|  楼主 | 2013-1-6 15:36 | 只看该作者
奥 这个是不可能综合的     我再想想

使用特权

评论回复
8
hawksabre| | 2013-1-6 20:16 | 只看该作者
上面都是牛人  帮你顶一个   呵呵   谢谢楼主的共享   谢谢了  呵呵  

使用特权

评论回复
9
bulonghu|  楼主 | 2013-1-7 10:43 | 只看该作者
我在设置的时候用的是burst  i/o    不是streaming    基2的  用streaming的时候  按照上边做的结果是正确的

使用特权

评论回复
10
zhushouxi| | 2013-1-7 21:02 | 只看该作者
按下图 输入数据

便可得到所要结果

应该不复杂...

使用特权

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

本版积分规则

5

主题

13

帖子

1

粉丝