在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


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、综合后,会发现

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

仿真结果如下:

  • 6
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
使用QuartusFFT IP核,首先需要准备好相应的器材和软件版本。你可以使用quartus18.0,并且要使用已破解的版本,以便能够使用FFT和NCO功能。请注意,Quartus对版本非常敏感,所以一定要确保版本对应正确。 一旦准备好了所需的软件和版本,接下来就可以配置FFT IP核了。你可以参考FFT IP核的时序图来编写相应的代码,这样就能够正确地配置IP核。你可以在Altera官网上找到FFT IP核的官方文档,以及FFT IP核在Streaming模式下的输入输出时序图,这些信息将帮助你进行配置。 需要注意的是,不同版本的Quartus可能会有不同的FFT IP核。例如,如果你使用的是Quartus版本13.1,那么你可以参考该版本的FFT IP核进行设计实验。你可以查看相关介绍并获取密码,以便更好地理解和使用FFT IP核。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [在quartus使用FFT IP核最全教程(从入门放弃)](https://blog.csdn.net/youzjuer/article/details/121320018)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [quartus FFT IP核使用](https://blog.csdn.net/ywhfdl/article/details/120284565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Quartus软件FFT IP核使用例程](https://download.csdn.net/download/qq_41894385/85366514)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youzjuer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值