当前位置:   article > 正文

在quartus中使用FFT IP核最全教程(从入门到放弃)_quartus fft ip核

quartus fft ip核

 一、准备工作

 

首先需要把需要的器材准备好,我使用的是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

  1. module fft_wrapper(clk,in_signal,
  2. real_power,
  3. imag_power,
  4. fft_source_sop,
  5. sink_sop,
  6. sink_eop,
  7. sink_valid,
  8. reset_n,
  9. start);
  10. input clk;
  11. input start;
  12. input wire [13:0] in_signal;
  13. wire [31:0] short_in_signal;
  14. output wire [24:0] real_power;
  15. output wire [24:0] imag_power;
  16. //fft signal
  17. output wire sink_valid;
  18. wire sink_ready;
  19. output wire sink_sop;
  20. output wire sink_eop;
  21. wire [10:0] fft_pts;
  22. output wire fft_source_sop;
  23. wire fft_source_eop;
  24. output reg reset_n;
  25. wire [13:0] real_to_fft_p;
  26. wire [13:0] imag_to_fft_p;
  27. reg [4:0] count;
  28. reg eop2, sop2, eop5;
  29. initial
  30. begin
  31. reset_n = 0;
  32. count = 5'd0;
  33. end
  34. always@(posedge clk)
  35. begin
  36. count <= count + 1;
  37. if(count == 10)
  38. begin
  39. reset_n = 1;
  40. end
  41. end
  42. // always @(posedge clk)
  43. // begin
  44. // if(start)
  45. // begin
  46. // reset_n <= 0;
  47. // count <= 5'd0;
  48. // end
  49. // else
  50. // begin
  51. // count = count + 5'd1;
  52. // if(count == 5'd10)
  53. // begin
  54. // reset_n <= 1;
  55. // end
  56. // end
  57. // end
  58. control_for_fft control_for_fft_longer_inst(
  59. .clk(clk),
  60. .insignal(in_signal),
  61. .sink_valid(sink_valid),
  62. .sink_ready(sink_ready),
  63. .sink_error(),
  64. .sink_sop(sink_sop),
  65. .sink_eop(sink_eop),
  66. .inverse(inverse),
  67. .outreal(real_to_fft_p),
  68. .outimag(imag_to_fft_p),
  69. .fft_pts(fft_pts));
  70. fft fft_inst (
  71. .clk (clk), // clk.clk
  72. .reset_n (reset_n), // rst.reset_n
  73. .sink_valid (sink_valid), // sink.sink_valid
  74. .sink_ready (sink_ready), // .sink_ready
  75. .sink_error (2'b00), // .sink_error
  76. .sink_sop (sink_sop), // .sink_sop
  77. .sink_eop (sink_eop), // .sink_eop
  78. .sink_real (real_to_fft_p), // .sink_real
  79. .sink_imag (imag_to_fft_p), // .sink_imag
  80. .fftpts_in (fft_pts), // .fftpts_in
  81. .inverse (1'b0), // .inverse
  82. .source_valid (), // source.source_valid
  83. .source_ready (1'b1), // .source_ready
  84. .source_error (), // .source_error
  85. .source_sop (fft_source_sop), // .source_sop
  86. .source_eop (fft_source_eop), // .source_eop
  87. .source_real (real_power), // .source_real
  88. .source_imag (imag_power), // .source_imag
  89. .fftpts_out () // .fftpts_out
  90. );
  91. endmodule

2、control_for_fft.v

  1. module control_for_fft(
  2. clk,
  3. insignal,
  4. sink_valid,
  5. sink_ready,
  6. sink_error,
  7. sink_sop,
  8. sink_eop,
  9. inverse,
  10. outreal,
  11. outimag,
  12. fft_pts);
  13. input clk;
  14. input [13:0] insignal;
  15. output reg sink_valid, sink_sop, sink_eop, inverse, sink_ready;
  16. output reg [1:0] sink_error;
  17. output [13:0] outreal, outimag;
  18. output reg [10:0] fft_pts;
  19. reg [9:0] count;
  20. initial
  21. begin
  22. count = 10'd1;
  23. inverse = 0;
  24. sink_valid = 0;
  25. sink_ready = 1;
  26. sink_error = 2'b00;
  27. fft_pts = 11'd1024;
  28. end
  29. assign outreal = insignal;
  30. assign outimage = 14'd0;
  31. always @(posedge clk)
  32. begin
  33. begin
  34. count <= count + 1;
  35. end
  36. if(count == 10'd1024)
  37. begin
  38. sink_eop <= 1;
  39. end
  40. if(count == 10'd0)
  41. begin
  42. sink_eop <= 0;
  43. sink_sop <= 1;
  44. sink_valid <= 1;
  45. end
  46. if(count == 10'd1)
  47. begin
  48. sink_sop <= 0;
  49. end
  50. end
  51. endmodule

3、fft_test.v

  1. `timescale 1ns / 1ps
  2. module fft_test;
  3. reg clk;
  4. reg start;
  5. wire reset_n;
  6. wire [13:0] fsin_o, fcos_o;
  7. wire sink_sop_sig;
  8. wire sink_eop_sig;
  9. wire [24:0] real_power_sig;
  10. wire [24:0] imag_power_sig;
  11. initial
  12. begin
  13. clk <= 0;
  14. start <= 0;
  15. #2 start <= 1;
  16. end
  17. always begin #10 clk <= ~clk; end
  18. nco nco_inst (
  19. .clk (clk), // clk.clk
  20. .reset_n (reset_n), // rst.reset_n
  21. // .clken (clken), // in.clken
  22. .clken (1'b1), // in.clken
  23. // .phi_inc_i (phi_inc_i), // .phi_inc_i
  24. .phi_inc_i (32'd41943040), // .phi_inc_i
  25. .fsin_o (fsin_o), // out.fsin_o
  26. .fcos_o (fcos_o), // .fcos_o
  27. .out_valid (out_valid) // .out_valid
  28. );
  29. fft_wrapper fft_wrapper_inst
  30. (
  31. .clk(clk),
  32. //.in_signal(in_signal_sig),
  33. .in_signal(fsin_o),
  34. .real_power(real_power_sig),
  35. .imag_power(imag_power_sig),
  36. .fft_source_sop(fft_source_sop_sig),
  37. .sink_sop(sink_sop_sig),
  38. .sink_eop(sink_eop_sig),
  39. .sink_valid(sink_valid_sig),
  40. .reset_n(reset_n),
  41. .start(start)
  42. );
  43. endmodule

四、仿真

1、综合后,会发现

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

仿真结果如下:

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/895682
推荐阅读
  

闽ICP备14008679号