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

关于调用IP核实现FFT

关于调用IP核实现FFT

通过例化调用Xilinx IP核来实现一个512点、数据位宽和相位因子位宽都为10 bit的FFT算法模块,时钟频率为 50MHz,采用流水线,Streaming I/O和定点压缩结构。为了方便验证FFT IP核功能的正确性:以零开始计数,在每个时钟上升沿到来时,进行加1得到的数据,分别作为其输入信号的实部和输入信号的虚部,下面是我写的仿真程序,想请大神帮忙看看有没有什么问题,还有就是得到的结果怎样验证它的正确性
`timescale 1ps / 1ps

module fft_test1_t;
        // Inputs
        reg clk;
        reg RSTn;
        reg start;
        reg fwd_inv;
        reg fwd_inv_we;
        reg scale_sch_we;
        reg [9:0] xn_re;
        reg [9:0] xn_im;
        reg [9:0] scale_sch;
        // Outputs
        wire rfd;
        wire busy;
        wire edone;
        wire done;
        wire dv;
        wire [8:0] xn_index;
        wire [8:0] xk_index;
        wire [9:0] xk_re;
        wire [9:0] xk_im;
        // Instantiate the Unit Under Test (UUT)
        fft_ip uut (
                .clk(clk),
                .start(start),
                .fwd_inv(fwd_inv),
                .fwd_inv_we(fwd_inv_we),
                .scale_sch_we(scale_sch_we),
                .rfd(rfd),
                .busy(busy),
                .edone(edone),
                .done(done),
                .dv(dv),
                .xn_re(xn_re),
                .xn_im(xn_im),
                .scale_sch(scale_sch),
                .xn_index(xn_index),
                .xk_index(xk_index),
                .xk_re(xk_re),
                .xk_im(xk_im)
        );

        initial begin
                // Initialize Inputs
                RSTn=0;
                #4 RSTn=1;
                clk = 0; forever #2 clk=~clk;
                #300 $stop;
        end
        
        //always #2 clk=~clk;
        reg[10:0] i;
        always @(posedge clk or negedge RSTn)
        begin
                if(!RSTn)
                        begin
                                start <= 1'b0;
                                fwd_inv <= 1'b0;
                                fwd_inv_we <= 1'b0;
                                scale_sch_we <= 1'b0;
                                xn_re <= 10'b0;
                                xn_im <= 10'b0;
                                scale_sch <= 1'b0;
                                i<=11'b0;
                        end
                else
                        begin
                                //if(!start)
                                        //begin
                                                start <= 1'b1;
                                                fwd_inv <= 1'b1;
                                                fwd_inv_we <= 1'b1;
                                                scale_sch_we <= 1'b1;
                                                scale_sch <=10'b01_10_10_10_11;
                                                if(i<11'd511)
                                                        begin
                                                                i<=i+1'b1;
                                                                xn_re <=xn_re+1'b1;
                                                                xn_im <=xn_im +1'b1;
                                                        end
                                                else
                                                        i<=i;
                        end
                end
   
endmodule

下面是对应的时序图






返回列表