基于vivado实现FFT/IFFT

article/2025/8/28 1:09:01

文章目录

  • 前言
  • 一、基本过程
  • 二、vivado配置
    • 1.新建工程
    • 2.调用DDS的IP核
    • 2.调用FFT的IP核
  • 三、编写Verilog程序
    • 1.顶层文件fft.v
    • 2.仿真文件fft_tb.v
  • 四、运行仿真
    • 1. 运行仿真设置
    • 2. 仿真波形设置
    • 3. 结果分析


前言

使用vivado2018.3实现FFT/IFFT,过程比较详细。


一、基本过程

例化一个DDS的IP核和两个FFT的IP核分别用作FFT和IFFT变换,将DDS生成的正交信号输入到FFT,再将FFT的信号输出到IFFT中。
在这里插入图片描述

二、vivado配置

1.新建工程

打开vivado,界面如下
在这里插入图片描述

点击Open Project,进入如下页面,点击Next
在这里插入图片描述
编辑工程名字和保存路径,点击Next
在这里插入图片描述
查找所需要的板子型号(我所用的是xc7z020-1clg400c),但是后面只进行了仿真,未进行上板实验。
在这里插入图片描述
工程信息汇总,点击Finish,即可完成工程的新建。
在这里插入图片描述
工程界面如下
在这里插入图片描述

2.调用DDS的IP核

调用DDS的IP核,生成10MHz正弦信号

单击IP Catalog,输入dds,找到IP核后,双击
在这里插入图片描述
进入dds的IP核配置界面,各项选择如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置完成,点击OK即可。

2.调用FFT的IP核

搜索fft,然后找到Digital Signal Processing->Transforms->FFTs目录下的Fast Fourier Transform,双击进入配置界面。
在这里插入图片描述
各项选择配置如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置完成,点击OK即可。

三、编写Verilog程序

1.顶层文件fft.v

例化IP核,将三个模块连接起来。

点击Add Sources,弹出右侧窗口,选择Add or create design sources,点击Next
在这里插入图片描述
点击Create File
在这里插入图片描述
输入文件名称fft,点击OK
在这里插入图片描述
点击Finish
在这里插入图片描述
点击OK
在这里插入图片描述
点击Yes,即可完成新建。
在这里插入图片描述
vivado会自动生成IP核的调用方式的模板,双击相应IP核的.veo文件,可以看到Verilog版本的例化模板,可根据该模板写top文件,也就是驱动这个IP核的文件。

代码如下:

`timescale 1ns / 1psmodule fft(input aclk,input aresetn,output [7:0] fft_real,output [7:0] fft_imag,output [7:0] ifft_real,output [7:0] ifft_imag);//DDS corewire [15:0] dds_m_data_tdata;wire fft_s_data_tready;wire dds_m_data_tvalid;wire dds_m_data_tlast;dds_compiler_0 dds_MHz (.aclk(aclk),.aresetn(aresetn),.m_axis_data_tdata(dds_m_data_tdata),.m_axis_data_tready(fft_s_data_tready),.m_axis_data_tvalid(dds_m_data_tvalid));//FFT corewire [7:0] fft_s_config_tdata;//[0:0]FWD_INV_0wire fft_s_config_tready;wire fft_s_config_tvalid;wire [7:0] fft_m_status_tdata;wire fft_m_status_tready;wire fft_m_status_tvalid;wire [15:0] fft_m_data_tdata;wire fft_m_data_tlast;wire ifft_s_data_tready;wire [23:0] fft_m_data_tuser;//[11:0]XK_INDEXwire fft_m_data_tvalid;wire fft_event_frame_started;wire fft_event_tlast_unexpected;wire fft_event_tlast_missing;wire fft_event_status_channel_halt;wire fft_event_data_in_channel_halt;wire fft_event_data_out_channel_halt;wire [11:0] xk_index;assign xk_index = fft_m_data_tuser[11:0];assign fft_s_config_tdata = 8'd1;//定义FFT模块配置信息(第0位为1表示用FFT,为0表示用IFFT)assign fft_s_config_tvalid = 1'd1;//FFT模块配置使能,从一开始就拉高,表示已经准备好要传入的配置数据了xfft_0 usr_fft(.aclk(aclk),//Rising-edge clock.aresetn(aresetn),//(低有效)Active-Low synchronous clear (optional, always take priority over aclken); A minimum aresetn active pulse of two cycles is required//S_AXIS_DATA.s_axis_data_tdata(dds_m_data_tdata),//IN Carries the unprocessed sample data: XN_RE and XN_IM.s_axis_data_tlast(dds_m_data_tlast),//IN Asserted by the external master on the last sample of the frame.s_axis_data_tready(fft_s_data_tready),//OUT Used by the core to signal that it is ready to accept data.s_axis_data_tvalid(dds_m_data_tvalid),//IN Used by the external master to signal that it is able to provide data//S_AXIS_CONFIG.s_axis_config_tdata(fft_s_config_tdata),//IN Carries the configuration information.s_axis_config_tready(fft_s_config_tready),//OUT Asserted by the core to signal that it is ready to accept data.s_axis_config_tvalid(fft_s_config_tvalid),//IN Asserted by the external master to signal that it is able to provide data//M_AXIS_STATUS.m_axis_status_tdata(fft_m_status_tdata),.m_axis_status_tready(fft_m_status_tready),.m_axis_status_tvalid(fft_m_status_tvalid),//M_AXIS_DATA.m_axis_data_tdata(fft_m_data_tdata),//OUT Carries the processed sample data XK_RE and XK_IM.m_axis_data_tlast(fft_m_data_tlast),//OUT Asserted by the core on the last sample of the frame.m_axis_data_tready(ifft_s_data_tready),//IN Asserted by the external slave to signal that it is ready to accept data. Only present in Non-Realtime mode.m_axis_data_tuser(fft_m_data_tuser),//OUT Carries additional per-sample information: XK_INDEX, OVFLO and BLK_EXP.m_axis_data_tvalid(fft_m_data_tvalid),//OUT Asserted by the core to signal that it is able to provide status data//EVENTS.event_frame_started(fft_event_frame_started),//Asserted when the core starts to process a new frame.event_tlast_unexpected(fft_event_tlast_unexpected),//Asserted when the core sees s_axis_data_tlast High on a data sample that is not the last one in a frame.event_tlast_missing(fft_event_tlast_missing),//Asserted when s_axis_data_tlast is Low on the last data sample of a frame.event_status_channel_halt(fft_event_status_channel_halt),//Asserted when the core tries to write data to the Status channel and it is unable to do so.event_data_in_channel_halt(fft_event_data_in_channel_halt),//Asserted when the core requests data from the Data Input channel and none is available.event_data_out_channel_halt(fft_event_data_out_channel_halt)//Asserted when the core tries to write data to the Data Output channel and it is unable to do so);//IFFT corewire [7:0] ifft_s_config_tdata;//[0:0]FWD_INV_0wire ifft_s_config_tready;wire ifft_s_config_tvalid;wire [7:0] ifft_m_status_tdata;wire ifft_m_status_tready;wire ifft_m_status_tvalid;wire [15:0] ifft_m_data_tdata;wire ifft_m_data_tlast;wire ifft_m_data_tready;wire [23:0] ifft_m_data_tuser;//[11:0]XK_INDEXwire ifft_m_data_tvalid;wire ifft_event_frame_started;wire ifft_event_tlast_unexpected;wire ifft_event_tlast_missing;wire ifft_event_status_channel_halt;wire ifft_event_data_in_channel_halt;wire ifft_event_data_out_channel_halt;wire [11:0] ixk_index;assign ixk_index = ifft_m_data_tuser[11:0];assign ifft_s_config_tdata = 8'd0;//定义FFT模块配置信息(第0位为1表示用FFT)assign ifft_s_config_tvalid = 1'd1;//FFT模块配置使能,从一开始就拉高,表示已经准备好要传入的配置数据了assign ifft_m_data_tready = 1'd1;//从一开始就拉高,表示已经准备好接收IFFT模块输出的数据xfft_0 usr_ifft(.aclk(aclk),//Rising-edge clock.aresetn(aresetn),//(低有效)Active-Low synchronous clear (optional, always take priority over aclken); A minimum aresetn active pulse of two cycles is required//S_AXIS_DATA.s_axis_data_tdata(fft_m_data_tdata),//IN Carries the unprocessed sample data: XN_RE and XN_IM.s_axis_data_tlast(fft_m_data_tlast),//IN Asserted by the external master on the last sample of the frame.s_axis_data_tready(ifft_s_data_tready),//OUT Used by the core to signal that it is ready to accept data.s_axis_data_tvalid(fft_m_data_tvalid),//IN Used by the external master to signal that it is able to provide data//S_AXIS_CONFIG.s_axis_config_tdata(ifft_s_config_tdata),//IN Carries the configuration information.s_axis_config_tready(ifft_s_config_tready),//OUT Asserted by the core to signal that it is ready to accept data.s_axis_config_tvalid(ifft_s_config_tvalid),//IN Asserted by the external master to signal that it is able to provide data//M_AXIS_STATUS.m_axis_status_tdata(ifft_m_status_tdata),.m_axis_status_tready(ifft_m_status_tready),.m_axis_status_tvalid(ifft_m_status_tvalid),//M_AXIS_DATA.m_axis_data_tdata(ifft_m_data_tdata),//OUT Carries the processed sample data XK_RE and XK_IM.m_axis_data_tlast(ifft_m_data_tlast),//OUT Asserted by the core on the last sample of the frame.m_axis_data_tready(ifft_m_data_tready),//IN Asserted by the external slave to signal that it is ready to accept data. Only present in Non-Realtime mode.m_axis_data_tuser(ifft_m_data_tuser),//OUT Carries additional per-sample information: XK_INDEX, OVFLO and BLK_EXP.m_axis_data_tvalid(ifft_m_data_tvalid),//OUT Asserted by the core to signal that it is able to provide status data//EVENTS.event_frame_started(ifft_event_frame_started),//Asserted when the core starts to process a new frame.event_tlast_unexpected(ifft_event_tlast_unexpected),//Asserted when the core sees s_axis_data_tlast High on a data sample that is not the last one in a frame.event_tlast_missing(ifft_event_tlast_missing),//Asserted when s_axis_data_tlast is Low on the last data sample of a frame.event_status_channel_halt(ifft_event_status_channel_halt),//Asserted when the core tries to write data to the Status channel and it is unable to do so.event_data_in_channel_halt(ifft_event_data_in_channel_halt),//Asserted when the core requests data from the Data Input channel and none is available.event_data_out_channel_halt(ifft_event_data_out_channel_halt)//Asserted when the core tries to write data to the Data Output channel and it is unable to do so);//将FFT/IFFT处理完的信号传出(虚部/实部分别传出)assign fft_real = fft_m_data_tdata[7:0];assign fft_imag = fft_m_data_tdata[15:8];assign ifft_real = ifft_m_data_tdata[7:0];assign ifft_imag = ifft_m_data_tdata[15:8];endmodule

2.仿真文件fft_tb.v

与上面步骤类似,不过在下面该步骤时,选择Add or create simulation sources
在这里插入图片描述
代码如下:

`timescale 1ns / 1psmodule fft_tb();reg aclk,aresetn;wire [7:0] fft_real,fft_imag;wire [7:0] ifft_real,ifft_imag;fft fft_test(      .aclk(aclk),.aresetn(aresetn),.fft_real(fft_real),.fft_imag(fft_imag),.ifft_real(ifft_real),.ifft_imag(ifft_imag));initialbeginaclk = 0;aresetn = 0;//低有效#30 aresetn = 1;endalways #5 aclk=~aclk;//时钟频率100MHz
endmodule

四、运行仿真

1. 运行仿真设置

在运行仿真之前需要设置仿真时间,在下图SIMULATION处右击,进入Simulation Settings
在这里插入图片描述
设置仿真时间为300us,点击OK即可完成设置
在这里插入图片描述
接下来就是进行仿真,点击Run Simulation,然后点击Run Behavioral Simulation,即可开始仿真,等待一段时间。
在这里插入图片描述

2. 仿真波形设置

仿真之后只会显示仿真文件中的信号,结果分析需要查看内部模块的信号。在下图中,单击fft_test即可看到内部信号,将未显示的信号选中右击,选择Add to Wave Window,这些信号即可添加进仿真波形图中。
在这里插入图片描述
添加完成后,再次进行仿真。

找到dds_m_data_tdata,fft_m_data_tdata,ifft_m_data_tdata信号,分别进行如下设置。
选中信号,右击,找到Waveform Style,选择Analog。
在这里插入图片描述
选中信号,右击,找到Radix,选择Signed decimal。
在这里插入图片描述

3. 结果分析

DDS产生波形,周期为100ns,即频率为10MHz。复位信号至少拉低两个时钟周期。
在这里插入图片描述
下图可以看到FFT输出的模拟波形尖峰处对应的index为409;那么对应的频率应该是409*100e6/4096 = 9.985e6,约为10MHz;其中100e6是采样频率为100MHz,4096是FFT点数。
在这里插入图片描述
可以看到下图IFFT输出的波形,可以看出图中波形周期为100ns,即频率为10MHz。
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/GsACsUTf.shtml

相关文章

python fft ifft

文章目录 条件代码实例 条件 任何一个满足狄利克雷条件的函数都可以通过傅里叶基数展开。 numpy和scipy中都有fft变换,且效果都是一样的。 代码 import numpy as np from scipy.fftpack import fft,ifft import matplotlib.pyplot as plt from matplotlib.pylab …

FFT专题:IFFT后信号如何重建

ifft(outFFTData, g_fft_temp, inFFTData, g_twiddle_ifft, twiddle_stride, F_WLEN);//思考ifft输出的复数结果怎么给到硬件输出 之前一直关注FFT后信号奔赴到频域处理,那么频域处理完后,怎么重建信号呢? 给出一段FFT和IFFT函数源码 int nFrameRunCount 0;#pragma section…

数字信号处理基础(二):FFT和IFFT的使用以及详细分析代码书写思路

目录 1. fft和ifft的原理1.1 fft1.2 ifft 2. 书写代码思路3. 完整代码4. 结果图 1. fft和ifft的原理 1.1 fft fft是快速傅里叶变换,是MATLAB中计算信号频谱的函数,使用方法是fft(x),直接对信号x进行fft计算。 由于fft函数计算信号的频谱是0…

信号处理中的反傅里叶变换(IFFT)原理

信号处理中,经常需要将信号转换到频域进行分析,有时候还会从频域转回时域,用到FFT和IFFT函数。 FFT变换是将信号从时域转换到频域,在时域看起来复杂的信号转换到频域看起来就方便容易了很多。但有时候也需要将频域信号转换到时域…

adb下载、安装、环境配置

一:adb安装 adb下载链接:https://pan.baidu.com/s/1Vd6KyZ6vT2Qtmhazwre4OQ 提取码:3dx1 安装: 1.双击adb.exe文件,并运行。 2.添加环境变量: 右击计算机–属性—高级系统设置—高级—环境变量—新建&…

windows下载安装adb(极其简单)

单独安装adb,不安装sdk 下载adb Google很好的心,直接放出ADB的档案供人下载。下档路径如下: Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip Mac版本:https://dl.google…

ADB-adb命令安装app

下载adb 安装adb 将名称中含有adb的文件,和fastboot.exe复制到 c:/windows/system32目录将名称中含有adb的所有文件复制到 c:/windows/system目录将adb.exe和AdbWinApi.dll复制到c:/windows/SysWoW64目录 有线安装apk 连接上数据线,然后把手机开发者模…

adb详细教程(一)-下载安装与环境变量配置

对于Android开发来说,adb是再熟悉不过的调试工具 但其实对于移动端的测试来说,adb也是一个十分重要的、能够提高测试工作效率的工具。 文章目录 一、介绍二、下载地址三、安装四、配置环境变量 一、介绍 全称 adb全称全称为Android Debug Bridge&#x…

mac下载安装adb环境

目录 方法一1、下载安装包2、下载完成后进行解压,目录路径注意不得包含中文3、配置环境变量4、验证安装是否成功 方法二1、安装homebrew2、安装adb3、运行adb 方法一 1、下载安装包 安装包下载地址 :https://developer.android.com/studio/releases/pl…

adb工具下载安装

一、adb环境配置 adb即Android Debug Bridge,就是可以通过窗口命令,使在pc端可以调试安卓移动端的一个工具包 我这里是默认电脑已经安装SDK的,如果没有也没关系,直接网上下载一个adb工具包一样的https://developer.android.goo…

adb环境配置

adb环境配置 1.下载工具包 工具包:platform-tools_r30.0.4-windows.zip 获取途径1:链接: https://pan.baidu.com/s/17BiARFlgsQa2wDETmoJIvQ?pwddsd2 提取码: dsd2 获取途径2:https://developer.android.google.cn/studio/releases/plat…

android adb驱动官方下载,adb驱动下载

这里给你简单的介绍一下adb驱动:adb驱动就是电脑与android设备的通信的客户端驱动程序。使用它可以直接操作管理android模拟器或者真实的andriod设备。 adb驱动百科介绍: Android设备(如手机)连接PC时所需要的驱动程序,一般Android设备连接WinXP是无需安装驱动的。 adb的全称…

windows ——adb下载与安装

一、adb下载 链接:https://pan.baidu.com/s/1D3eOkHsuAnZd6WoFEVC7xQ 提取码:sc94 二、adb安装 双击 adb-setup-1.3.exe 安装 可以查看此安装教程[转载]:http://m.mz6.net/detail/4506-13.html 三、adb安装成功验证 键盘快捷键:Wi…

adb下载安装教程(已安装Android studio)

adb下载安装教程(已安装Android studio) ①找到adb.exe的绝对路径如下: ②将绝对路径放入环境变量path中(绝对路径不带入adb.exe) 右击“此电脑”>“属性”>”高级系统设置“>”环境变量“>”path“ 双…

ADB下载及常用命令

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具 文章目录 预先准备adb的平台工具软件包下载配置环境变量 连接设备确认连接状态\查询已连设备USB 连接无线连接(Android11 及以上) 应用管理查看应用列…

ADB 下载地址

adbshell 点击ADBkit下载

mac os adb下载

一 adb安装: 打开终端,输入命令 1.安装homebrew: 方式一:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 方式二:/bin/zsh -c "$(curl -fsSL https:/…

小知识·adb安装和使用方法

目录 一、adb是什么? 二、adb有什么作用 三、如何启用adb调试 四 如何判断设备连接正常 五 如何下载安装adb 1、adb下载地址: 2、按装步骤 六、adb命令大全 1.查看设备 2.Adb应用管理 3.安装APK 4.卸载APK 5.查看设备信息 5.使用 Monkey 进…

adb下载安装及使用

1.adb下载安装 有两种方法: 1.下载一个adb的压缩包,直接解压,每次在解压的文件夹中执行命令操作即可,或者进行环境变量配置,这样以后无论在哪个文件都可以执行操作。 2.下载了Android Studio的文件中就带有adb&…

adb工具下载及安装

adb工具下载 点击下载adb工具 https://qny.aoarasi.com/software/adb/platform-tools_r33.0.0-windows.zip adb 工具安装 下载后解压 platform-tools_r33.0.0-windows.zip 文件 cmd进入adb.exe所在路径(比如我的在:D:\software\platform-tools_r33.…