在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

quartus fft,FPGA,verilog

 quartus fft,FPGA,verilog

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

quartus fft,FPGA,verilog

 2、然后将两个IP加入到工程中:

Project->add file in Project,

主要加入的是两个文件,后缀为sip和qip的文件,分别在simulation文件夹下和synthesis文件夹下。加入后如下所示:

quartus fft,FPGA,verilog

三、编写代码

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

quartus fft,FPGA,verilog

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

仿真结果如下:

quartus fft,FPGA,verilog文章来源地址https://www.toymoban.com/news/detail-627413.html

到了这里,关于在quartus中使用FFT IP核最全教程(从入门到放弃)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VIVADO中FFT核的使用(FPGA计算FFT和IFFT)

             关于这方面的内容,有些文章已经写的很好很详细了。不过我在使用的过程中,还是踩了一些坑,我在这里详细的介绍了IP核每一个设置的作用,然后写了个fft计算和ifft计算的环路的测试程序。应该可以帮大家学会使用fft的同时,也对它有个较为全面的理解。

    2024年01月18日
    浏览(39)
  • Xilinx 的FFT IP核使用方法(配置为FFT 、IFFT两种模式)

    Configuration 配置通道数和FFT长度 时钟频率以及数据吞吐速率 FFT的结构选择 Srteaming , 可以对数据进行流水处理 Radix-4 , 基4的迭代算法,使用资源比流水线结构多,但是转换时间长 Radix-2, Radix-2 lite 都为基2的迭代算法,Radix-2 lite的资源占用更少,但是转换时间也更长。 Run Time

    2024年02月04日
    浏览(41)
  • Vivado_FFT IP核 使用详解

    本文介绍Vivado中Fast Fourier Transform V9.1的使用方法。 参考资料:pg109 FFT是用于计算样本大小为2的正整数幂的离散傅里叶变换(DFT)的高效计算方法。序列的DFT定义为 X ( k ) = ∑ n = 0 N − 1 x ( n ) e − j n k 2 π / N    k = 0 , … N − 1 X(k) = sum_{n=0}^{N-1}x(n)e^{-jnk2pi /N} k = 0,dots N-1

    2023年04月15日
    浏览(48)
  • Vivado中的FFT IP核使用(含代码)

    本文介绍了Vidado中FFT IP核的使用,具体内容为:调用IP核配置界面介绍IP核端口介绍MATLAB生成测试数据测试verilogHDLTestBench仿真结果验证FFT运算。 该IP核对应手册pg109_xfft.pdf,首先按照图片找到IP核: 本小节主要介绍Fast Fourier Transform9.1这个IP核配置界面的一些选项: 第1页:Con

    2023年04月13日
    浏览(43)
  • VIVADO FFT IP核使用之SCALE_SCH的配置

    分为流水线架构,基-4突发架构,基-2突发架构,基-2LITE突发架构,原文 1 如下: 基-2和基-4是FFT算法的不同实现形式,简而言之,基-2算法按照时间或频率对序列进行抽取,将序列一分为二,基-4是一分为四。流水线算法能实现数据的连续输出。基-2LITE突发架构基于基-2架构,

    2024年02月07日
    浏览(33)
  • FPGA实现8点FFT

    前面我们讲了FFT的原理以及其在C++上的实现,可以参考我的博客: 快速傅里叶变换学习(超详细,附代码实现)_Patarw_Li的博客-CSDN博客 C++实现FFT算法(迭代版本)_Patarw_Li的博客-CSDN博客 下面我们会在FPGA上用Verilog实现8点FFT,下面是需要注意的几点: 1. 旋转因子 在FPGA中直接

    2024年02月06日
    浏览(36)
  • 基于FPGA的FFT图像滤波设计

            FFT滤波就是通过傅里叶运算将图像转换到频域空间,然后在频域中对图像进行处理,最后将处理后的图像通过傅里叶逆运算将图像转会到时域空间。   在频域空间中,我们能够更好的对图像的噪声进行分析,然后找出相关规律将噪声信息去除。    本文重点讲解

    2024年04月17日
    浏览(47)
  • 基4FFT 1024 fpga(verilog)实现

    文章目录 概要 整体结果 模块设计 细节实现 小结 对于基4fft算法,计算原理无需多说,可以看看知网论文,或者数字信号处理的书籍,本次基4fft按照AXI4-stream总线协议方式,当握手时开始产生传送数据流 本次采用的方法是使用状态机实现:(1)S0状态:初始状态.(2)S1状态:开始

    2024年02月05日
    浏览(44)
  • FPGA实现对锯齿波的FFT分析

    由信号与系统知识: 任意一个周期函数的傅里叶级数构造出来的三角函数展开式形式为:  其中2pi/T是原始信号的角频率,因为n1,可见分量的角频率必然不小于原始信号的频率,是原始信号频率的整数倍。所以这里的n不是索引序号,而是分量的角频率与原始信号角频率的倍

    2024年02月05日
    浏览(41)
  • 【FPGA-DSP】第五期:FFT调用流程

    目录 1. matlab输入信号编写 2. Simulink开发 2.1 模块搭建 2.2 Simulink运行 2.3 matlab信号处理  拓:输入信号位数改变 本章节主要说明如何在system generator中使用fft模块,话不多说,看操作: 参考教程第5期 - FFT调用流程 - 基于FPGA的数字信号处理系统开发笔记_哔哩哔哩_bilibili 参考我之

    2023年04月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包