首页 > 其他分享 >quartus中使用FFT IP核

quartus中使用FFT IP核

时间:2022-12-07 15:34:26浏览次数:70  
标签:FFT clk IP quartus fft wire sink output reg

 一、准备工作     首先需要把需要的器材准备好,我使用的是quartus18.0,并且要使用IP核被破解的版本,不然无法使用其中的FFT和NCO,一定要注意,quartus对于版本非常敏感,一定要严格对应好版本   1、带IP的quartus18.0   2、modelsim,这个modelsim不能使用自己下载的modelsim,要去官网下载,对应版本的modelsim-altera版本,而不是modesim se,应为modelsim-altera版本,是已经将altera上的器件的lib编译好了,如果自己下载modelsim使用,则还要自己编译相应的altera库,非常的坑    二、IP核导入 1、在quartus的IP库中,导入FFT核和NCO核,并完成设置,具体的设置结果如下:   设置的位置在tool->platform designer

 

 

设置好以后就generate HDL,在这一步中一定要注意,在simulation中选择verilog选项:

 2、然后将两个IP加入到工程中: Project->add file in Project,   主要加入的是两个文件,后缀为sip和qip的文件,分别在simulation文件夹下和synthesis文件夹下。加入后如下所示:

 

三、编写代码 1、fft_wrapper.v
 
module fft_wrapper(clk,in_signal,
    real_power,
    imag_power,
    fft_source_sop,
    sink_sop,
    sink_eop,
    sink_valid,
    reset_n,
    start);    
 
    input        clk;
    input     start;
    input        wire [13:0] in_signal;
    wire        [31:0] short_in_signal;
    output    wire [24:0]    real_power;
    output    wire [24:0]    imag_power;
    //fft signal
    
    output    wire     sink_valid;
    wire        sink_ready;
    
    output    wire sink_sop;
    output    wire sink_eop;
    
    wire         [10:0]    fft_pts;
    output     wire fft_source_sop;
    wire   fft_source_eop;
    output     reg    reset_n;
 
    
    wire        [13:0]    real_to_fft_p;
    wire        [13:0]     imag_to_fft_p;
    reg [4:0] count;
    
    reg eop2, sop2, eop5;
    
    
    initial 
    begin
        reset_n = 0;
        count = 5'd0;
    end
    
    always@(posedge clk)
        begin
            count <= count + 1;
            if(count == 10)
                begin
                reset_n = 1;
                end
        end
    
//    always @(posedge clk)
//        begin
//            if(start)
//                begin
//                reset_n <= 0;
//                count <= 5'd0;
//                end
//            else
//                begin
//                    count = count + 5'd1;
//                    if(count == 5'd10)
//                        begin
//                            reset_n <= 1;
//                        end
//                end
//        end
    
    control_for_fft control_for_fft_longer_inst(
    .clk(clk),
    .insignal(in_signal),
    .sink_valid(sink_valid),
    .sink_ready(sink_ready),
    .sink_error(),
    .sink_sop(sink_sop),
    .sink_eop(sink_eop),
    .inverse(inverse),
    .outreal(real_to_fft_p),
    .outimag(imag_to_fft_p),
    .fft_pts(fft_pts));
    
    
    
    fft fft_inst (
        .clk          (clk),          //    clk.clk
        .reset_n      (reset_n),      //    rst.reset_n
        .sink_valid   (sink_valid),   //   sink.sink_valid
        .sink_ready   (sink_ready),   //       .sink_ready
        .sink_error   (2'b00),   //       .sink_error
        .sink_sop     (sink_sop),     //       .sink_sop
        .sink_eop     (sink_eop),     //       .sink_eop
        .sink_real    (real_to_fft_p),    //       .sink_real
        .sink_imag    (imag_to_fft_p),    //       .sink_imag
        .fftpts_in    (fft_pts),    //       .fftpts_in
        .inverse      (1'b0),      //       .inverse
        .source_valid (), // source.source_valid
        .source_ready (1'b1), //       .source_ready
        .source_error (), //       .source_error
        .source_sop   (fft_source_sop),   //       .source_sop
        .source_eop   (fft_source_eop),   //       .source_eop
        .source_real  (real_power),  //       .source_real
        .source_imag  (imag_power),  //       .source_imag
        .fftpts_out   ()    //       .fftpts_out
    );    
    
    
endmodule

2、control_for_fft.v

module control_for_fft(
    clk,
    insignal,    
    sink_valid,
    sink_ready,
    sink_error,
    sink_sop,
    sink_eop,
    inverse,
    outreal,
    outimag,
    fft_pts);
    
input clk;
input [13:0] insignal;
output reg sink_valid, sink_sop, sink_eop, inverse, sink_ready;
output reg [1:0] sink_error;
 
output  [13:0] outreal, outimag;
output reg [10:0] fft_pts;
reg [9:0] count;
 
initial 
begin
    count = 10'd1;
    inverse = 0;
    sink_valid = 0;
    sink_ready = 1;
    sink_error = 2'b00;
    fft_pts = 11'd1024;
end
 
assign outreal = insignal;
assign outimage = 14'd0;
 
 
always @(posedge clk)
    begin
        begin
            count <= count + 1;
        end
        
        if(count == 10'd1024)
            begin
                sink_eop <= 1;
            end
        if(count == 10'd0)
            begin
                sink_eop <= 0;
                sink_sop <= 1;
                sink_valid <= 1;
            end
        if(count == 10'd1)
            begin
                sink_sop <= 0;
            end
    end
    
endmodule

3、fft_test.v

`timescale 1ns / 1ps
module fft_test;
 
 
 
reg clk;
reg start;
 
wire reset_n;
wire [13:0] fsin_o, fcos_o;
 
wire sink_sop_sig;
wire sink_eop_sig;
wire [24:0] real_power_sig;
 
wire [24:0] imag_power_sig;
 
initial 
begin 
    clk <= 0;
    start <= 0;
    #2 start <= 1;
end
 
always begin #10 clk <= ~clk; end
 
 
    nco nco_inst (
        .clk       (clk),       // clk.clk
        .reset_n   (reset_n),   // rst.reset_n
//        .clken     (clken),        //  in.clken
        .clken     (1'b1),        //  in.clken
//        .phi_inc_i (phi_inc_i), //    .phi_inc_i
        .phi_inc_i (32'd41943040), //    .phi_inc_i
        .fsin_o    (fsin_o),    // out.fsin_o
        .fcos_o    (fcos_o),    //    .fcos_o
        .out_valid (out_valid)  //    .out_valid
    );
 
 
 
 
 
fft_wrapper fft_wrapper_inst
(
    .clk(clk),
    //.in_signal(in_signal_sig),
    .in_signal(fsin_o),
    .real_power(real_power_sig),
    .imag_power(imag_power_sig),
    .fft_source_sop(fft_source_sop_sig),
    .sink_sop(sink_sop_sig),
    .sink_eop(sink_eop_sig),
    .sink_valid(sink_valid_sig),
    .reset_n(reset_n),
    .start(start)
);
 
endmodule

四、仿真

1、综合后,会发现

有错误出现,不用管,直接联合仿真即可。

仿真结果如下:

 

———————————————— 版权声明:本文为CSDN博主「youzjuer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/youzjuer/article/details/121320018 一、准备工作 
首先需要把需要的器材准备好,我使用的是quartus18.0,并且要使用IP核被破解的版本,不然无法使用其中的FFT和NCO,一定要注意,quartus对于版本非常敏感,一定要严格对应好版本
1、带IP的quartus18.0
2、modelsim,这个modelsim不能使用自己下载的modelsim,要去官网下载,对应版本的modelsim-altera版本,而不是modesim se,应为modelsim-altera版本,是已经将altera上的器件的lib编译好了,如果自己下载modelsim使用,则还要自己编译相应的altera库,非常的坑
 二、IP核导入1、在quartus的IP库中,导入FFT核和NCO核,并完成设置,具体的设置结果如下:
设置的位置在tool->platform designer


 
设置好以后就generate HDL,在这一步中一定要注意,在simulation中选择verilog选项:


 2、然后将两个IP加入到工程中:
Project->add file in Project,
主要加入的是两个文件,后缀为sip和qip的文件,分别在simulation文件夹下和synthesis文件夹下。加入后如下所示:


三、编写代码1、fft_wrapper.v
 module fft_wrapper(clk,in_signal,real_power,imag_power,fft_source_sop,sink_sop,sink_eop,sink_valid,reset_n,start); inputclk;input start;inputwire [13:0] in_signal;wire[31:0] short_in_signal;outputwire [24:0]real_power;outputwire [24:0]imag_power;//fft signaloutputwire sink_valid;wiresink_ready;outputwire sink_sop;outputwire sink_eop;wire [10:0]fft_pts;output wire fft_source_sop;wire   fft_source_eop;output regreset_n; wire[13:0]real_to_fft_p;wire[13:0] imag_to_fft_p;reg [4:0] count;reg eop2, sop2, eop5;initial beginreset_n = 0;count = 5'd0;endalways@(posedge clk)begincount <= count + 1;if(count == 10)beginreset_n = 1;endend//always @(posedge clk)//begin//if(start)//begin//reset_n <= 0;//count <= 5'd0;//end//else//begin//count = count + 5'd1;//if(count == 5'd10)//begin//reset_n <= 1;//end//end//endcontrol_for_fft control_for_fft_longer_inst(.clk(clk),.insignal(in_signal),.sink_valid(sink_valid),.sink_ready(sink_ready),.sink_error(),.sink_sop(sink_sop),.sink_eop(sink_eop),.inverse(inverse),.outreal(real_to_fft_p),.outimag(imag_to_fft_p),.fft_pts(fft_pts));fft fft_inst (.clk          (clk),          //    clk.clk.reset_n      (reset_n),      //    rst.reset_n.sink_valid   (sink_valid),   //   sink.sink_valid.sink_ready   (sink_ready),   //       .sink_ready.sink_error   (2'b00),   //       .sink_error.sink_sop     (sink_sop),     //       .sink_sop.sink_eop     (sink_eop),     //       .sink_eop.sink_real    (real_to_fft_p),    //       .sink_real.sink_imag    (imag_to_fft_p),    //       .sink_imag.fftpts_in    (fft_pts),    //       .fftpts_in.inverse      (1'b0),      //       .inverse.source_valid (), // source.source_valid.source_ready (1'b1), //       .source_ready.source_error (), //       .source_error.source_sop   (fft_source_sop),   //       .source_sop.source_eop   (fft_source_eop),   //       .source_eop.source_real  (real_power),  //       .source_real.source_imag  (imag_power),  //       .source_imag.fftpts_out   ()    //       .fftpts_out);endmodule2、control_for_fft.v
module control_for_fft(clk,insignal,sink_valid,sink_ready,sink_error,sink_sop,sink_eop,inverse,outreal,outimag,fft_pts);input clk;input [13:0] insignal;output reg sink_valid, sink_sop, sink_eop, inverse, sink_ready;output reg [1:0] sink_error; output  [13:0] outreal, outimag;output reg [10:0] fft_pts;reg [9:0] count; initial begincount = 10'd1;inverse = 0;sink_valid = 0;sink_ready = 1;sink_error = 2'b00;fft_pts = 11'd1024;end assign outreal = insignal;assign outimage = 14'd0;  always @(posedge clk)beginbegincount <= count + 1;endif(count == 10'd1024)beginsink_eop <= 1;endif(count == 10'd0)beginsink_eop <= 0;sink_sop <= 1;sink_valid <= 1;endif(count == 10'd1)beginsink_sop <= 0;endendendmodule3、fft_test.v
`timescale 1ns / 1psmodule fft_test;   reg clk;reg start; wire reset_n;wire [13:0] fsin_o, fcos_o; wire sink_sop_sig;wire sink_eop_sig;wire [24:0] real_power_sig; wire [24:0] imag_power_sig; initial begin clk <= 0;start <= 0;#2 start <= 1;end always begin #10 clk <= ~clk; end  nco nco_inst (.clk       (clk),       // clk.clk.reset_n   (reset_n),   // rst.reset_n//.clken     (clken),//  in.clken.clken     (1'b1),//  in.clken//.phi_inc_i (phi_inc_i), //    .phi_inc_i.phi_inc_i (32'd41943040), //    .phi_inc_i.fsin_o    (fsin_o),    // out.fsin_o.fcos_o    (fcos_o),    //    .fcos_o.out_valid (out_valid)  //    .out_valid);     fft_wrapper fft_wrapper_inst(.clk(clk),//.in_signal(in_signal_sig),.in_signal(fsin_o),.real_power(real_power_sig),.imag_power(imag_power_sig),.fft_source_sop(fft_source_sop_sig),.sink_sop(sink_sop_sig),.sink_eop(sink_eop_sig),.sink_valid(sink_valid_sig),.reset_n(reset_n),.start(start)); endmodule
四、仿真1、综合后,会发现


有错误出现,不用管,直接联合仿真即可。
仿真结果如下:

————————————————版权声明:本文为CSDN博主「youzjuer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/youzjuer/article/details/121320018

标签:FFT,clk,IP,quartus,fft,wire,sink,output,reg
From: https://www.cnblogs.com/greatplans/p/16963195.html

相关文章

  • ipv6正则表达式
    ^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]......
  • 【校招VIP】[约起来项目]产品校招对项目的要求
    VIP的服务不一样的校招。大家好,我是校招VIP的大拿老师,非常感谢大家观看我们推出的产品校招,商业实习项目。在开始正课之前,一定要给大家讲清楚,我们这个课程跟其他课程比,在校......
  • 【校招VIP】活动发布模块 简历:本期亮点描写和面试提问点
    第一个模块是活动发布模块,产品脑图,原型图和PRD文档都结束了,下面是校招最关键的部分:简历描述和面试提问。这也是我们的课程跟别人不太一样的地方。【约起来】项目具有非常......
  • JavaScript Promises, async/await
    newPromise()的时候,传一个executor给Promise.letpromise=newPromise(function(resolve,reject){//thisfunctionwillexecutesimmediately})这个函数......
  • typeScript学习
    typeScript配置文件如果一个目录下存在一个tsconfig.json文件,那么它意味着这个目录是TypeScript项目的根目录。tsconfig.json文件中指定了用来编译这个项目的根文件和编......
  • JavaScript中 FileReader 对象详解
    1.概念:FileReader对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区即buffer)的内容,使用File或Blob对象指定要读取的文件或数据。2.属性:FileR......
  • centos在VMware的net配置与静态ip
    centos在VMware的net配置与静态ip关键字:vmware;CentOS7最小安装;NAT网络模式,静态IP本机操作,1.查看本机ip并记录,假如为192.168.194.2312.修改虚拟机网络配置3.保......
  • 我用iPad编了个Python贪吃蛇,附源码!
    贪吃蛇可以算是街机游戏中经典中的经典了,实际上即使是手敲代码也不会太难写。最近折腾了一番iPad上新上架的LightlyIDE,可以在iPad上编程开发,也支持GUI可视化界面,遂尝试使用......
  • 【校招VIP】[推电影项目]商业项目的竞品分析和需求分析
    推电影这一商业项目是一个针对年轻人群体,给电影打分或者推进的平台。豆瓣的定位跟推电影很像,但我们要去想有没有一个商业的出发点,可以做的比豆瓣更好,或者豆瓣现在有没有什......
  • 关于MultipartFile中transferTo方法使用记录
    最近在项目中使用springboot写了一个文件上传的功能,但是遇到了路径上传错误的问题,以下是正确代码示范:1@RequestMapping(value="/sc/uploadAcceptanceData",method=......