一 、FFT设计验证思路
 1、基于Matlab与FPGA的混频sin信号的FFT验证,分别在Matlab和FPGA开发环境上实现相同的FFT功能设计。
 2、Matlab平台开发,使用自带的fft函数与相关操作函数,绘制出混频sin信号,经过fft功能处理后的频谱图。
 3、FGPA平台开发,通过dds ip核和乘法ip核,生成与Matlab相同配置的混频sin信号,借助于fft ip核实现fft的功能,对于输出的fft数据,寻找1024点中的四个峰值,并与Matlab的频谱图比对,从而确定FPGA开发验证的结果。
 二、Matlab FFT功能设计开发
 1、Matlab开发平台
 ①1024点FFT功能,采样频率50M;
 ②输入数据,3Mhz和4Mhz的sin信号混频;
 ③matlab自带fft公式计算fft数据;
 ④对fft数据取模运算,并绘图
 
 2、Matlab源码
 clc;
 clear all;
 fs=50e6;%采样率50M
 N=1024;%采样点数1024
 t=[0:N-1]/fs; %时间序列
 f1=3e6;%频点1 3MHZ
 f2=4e6;%频点2 4MHZ
 s1=sin(2pif1t);%信号1
 s2=sin(2pif2t);%信号2
 mixsign=s1.*s2;%混频 sin值相乘
 fftsign=fft(mixsign);%求fft
 fftabs=abs(fftsign);%取模运算
 plot(fftabs); %绘图
 
 3、Matlab绘制频谱图结果
 对频谱图的四个峰值横坐标结果以及所出的范围进行标识,用于FPGA平台的FFT处理结果验证比对。
 第一个峰值:21,搜索范围:1——50;
 第二个峰值:144,搜索范围:100——200;
 第三个峰值:882,搜索范围:850——900;
 第四个峰值:1005,搜索范围:950——1023;
 
 三、FPGA FFT功能设计开发
 1、vivado开发平台(vivado 2019.2,其余版本按照步骤生成新工程即可)
 ①DDS IP核生成3Mhz和4Mhz的sin频率信号;
 ②乘法ip核实现3Mhz和4Mhz的sin频率信号混频处理;
 ③FFT IP核实现FFT的算法;
 ④乘法ip核实现FFT处理后数据取模运算;
 ⑤通过算法实现取模运算后1024数据的四个峰值搜索;
 ⑥四个峰值对应的点与Matlab的峰值横坐标比对
 
 2、FFT工程设计
 ①顶层TOP,fft_top.v;
 ②内部时钟ip核用于产生50M和100M时钟;
 ③dds_ctrl控制模块,DDS IP核实现3Mhz和4Mhz的sin频率信号,以及乘法ip核实现3Mhz和4Mhz的sin频率信号混频处理;
 ④FFT IP核实现FFT的算法;
 ⑤FFT数据处理顶层模块,将四个峰值对应的点与Matlab的峰值横坐标比对;
 ⑥乘法ip核实现FFT处理后数据取模运算;
 ⑦通过算法实现取模运算后1024数据的四个峰值搜索;
 ⑧仿真文件
 
 3、FFT工程设计中IP核配置
 ①时钟ip
 步骤1:打开IP Catalog,点击Window下IP Catalog
 
 步骤2:查找时钟IP核 Clocking Wizard,搜索输入
 
 步骤3:时钟IP核 Clocking Wizard配置——Clocking Options,修改名称,选择PLL模式,设置输入时钟50M,可根据实际工程配置
 
 步骤4:时钟IP核 Clocking Wizard配置——Output Clocks,设置输出50M和100M,复位信号不使用,使用locked作为内部复位
 
 ②DDS ip
 步骤1:打开IP Catalog,点击Window下IP Catalog

 步骤2:查找dds IP核 dds compiler,搜索输入
 
 步骤3:dds IP核dds compiler配置——Configuration,修改名称,设置选择Phase Generator and SIN COS LUT,设置输入系统时钟100M,两路通道3M和4M
 
 步骤4:dds IP核dds compiler配置——Implementation,Output 选择Sine模式,对比Matlab中sin信号,相位输出不使能
 
 步骤5:dds IP核dds compiler配置——Detailed Implementation,DATA Output 选择Chan ID Field,对应两路输出3M和4M的sin信号
 
 步骤6:dds IP核dds compiler配置——Output Frequencies,设置两路输出信号的频率3M和4M
 
 ③乘法 ip(88)
 步骤1:打开IP Catalog,点击Window下IP Catalog
 
 步骤2:查找乘法 IP核 multiplier,搜索输入
 
 步骤3:乘法 IP核 multiplier配置——Basic,修改名称,设置输入数据的位宽8
 
 步骤4:乘法 IP核 multiplier配置——Output and Control,无需设置,只需要关注输出数据的最高位MSB和最低位LSB,方便其他模块使用乘法ip的输出数据
 
 ④fft IP核 Fast Fourier Transform
 步骤1:打开IP Catalog,点击Window下IP Catalog
 
 步骤2:查找fft IP核 Fast Fourier Transform,搜索输入
 
 步骤3:fft IP核配置——Configuration,修改名称,设置通道,传输的数据1024,设置Target Clock Frequency,采样率50M,选择基4突发结构
 
 步骤4:fft IP核配置——Implementation,数据格式选择定点数类型,放缩设置为块浮点模式, 输出 FFT 结果选择顺序输出
 
 步骤5:fft IP核配置——Detailed Implementation
 
 步骤6:fft IP核——Implementation Details
 ①输入给fft ip核的axi4_stream接口的计算数据,fft ip作为slaver,来自dds ctrl;CHAN_0_XN_IM_0(31:16)是复数的虚部,CHAN_0_XN_RE_0(15:0)是复数的实部;
 FFT混频信号只使用实部的信号,低 16 位赋值为乘法器输出值, 高 16 位赋值为 0;
 ②输入给fft ip核的axi4_stream接口的配置数据,fft ip作为slaver,1-正变换,0-逆变换
 代码里需要设置配置数据为1,快速傅里叶正变换;
 ③fft ip核输出的axi4_stream接口的结果数据,fft ip作为master
 将fft ip输出的数据的实部和虚部进行平方(通过乘法核实现)再相加
 即可得到FFT处理后的频谱图
 
 ⑤乘法 ip(1616)
 步骤1:打开IP Catalog,点击Window下IP Catalog
 
 步骤2:查找乘法 IP核 multiplier,搜索输入
 
 步骤3:乘法 IP核 multiplier配置——Basic,修改名称,设置输入数据的位宽16
 
 步骤4:乘法 IP核 multiplier配置——Output and Control,无需设置,只需要关注输出数据的最高位MSB和最低位LSB,方便其他模块使用乘法ip的输出数据
 
 ⑥Block Memory Generator ip
 步骤1:打开IP Catalog,点击Window下IP Catalog
 
 步骤2:查找块BRAM IP核 Block Memory Generator,搜索输入
 
 步骤3:块BRAM IP核 Block Memory Generator配置——Basic,设置Memory Type为真双端口
 
 步骤4:块BRAM IP核 Block Memory Generator配置——Port A Options,设置写端口数据位宽33,深度2048;读端口数据位宽33,深度2048
 
 步骤5:块BRAM IP核 Block Memory Generator配置——Port B Options,写端口数据位宽33,深度2048;读端口数据位宽33,深度2048(自动更新)
 
 四、Matlab FFT功能与FPGA FFT功能结果比对
 1、Matlab结果,四个峰值横坐标结果以及所出的范围进行标识
 第一个峰值:21,搜索范围:1——50;
 第二个峰值:144,搜索范围:100——200;
 第三个峰值:882,搜索范围:850——900;
 第四个峰值:1005,搜索范围:950——1023;
 
 2、FPGA设置以及结果
 根据Matlab的结果,对应FPGA代码设置四个峰值的范围
 
 
 3、FPGA仿真结果
 第一个峰值:21;第二个峰值:144;第三个峰值:882;第四个峰值:1005;
 
 五、FPGA最大值搜索算法及代码分析
 1、搜索算法的调用及参数赋值
 
 
 2、最大值搜索算法top的参数及端口——data_max_top
 
 3、关键信号锁存及边沿检测
 ①每组1024个fft数据有效信号
 (i_fft_data_tvalid)
 ②fft输出10组数据稳定后有效计数(fft_data_tvalid_pos_cnt)
 ③fft_data_tvalid 上升沿
 (fft_data_tvalid_pos)
 ④fft_data_tvalid 下降沿
 (fft_data_tvalid_neg)
 ⑤最大值查找结束信号
 (data_max_process_finish)
 ⑥最大值查找结束上升沿
 (data_max_process_finish_pos)
 
 4、三段式状态机(第一段和第二段)
 S_IDLE:空闲状态
 S_FFT_DATA_VAILD:FFT数据有效
 S_FFT_DATA_MAX_PROCESS:最大值数据存储处理过程
 S_FINISH:算法处理结束
 ①第一段时序逻辑,状态锁存;
 ②第二段组合逻辑,用于状态跳转;
 ③第十组数据结束后并且下一组fft数据有效开始,状态由S_IDLE跳转至S_FFT_DATA_VAILD;
 ④S_FFT_DATA_VAILD:将1024点数据存储至bram,用于后继算法模块;
 ⑤峰值搜索结束,整个算法跳转至结束
 
 5、三段式状态机(第三段)
 第三段时序逻辑处理,用RAM作为fft有效数据的存储,对应RAM的写地址、使能信号
 
 6、FFT有效数据的存储——RAM
 采用lut逻辑搭建的RAM,数据位宽33,深度位宽11(2048数据>1024数据)
 
 7、数据最大值处理(data_max_process)调用例化
 峰值搜索开始信号,fft 每组数据结束为止,从第11组数据开始,确保前十组数据完成
 
 8、数据最大值处理的参数及端口——data_max_process
 
 9、算法状态机(第二段)
 ①S_IDLE:峰值算法开始标志
 ②S_RAM_RD_ADDR_CTRL:地址控制,输入地址小于终止地址,每次累加一步进
 ③S_RAM_RD_DATA_LATCH:锁存前一级地址对应数据
 ④S_RAM_RD_DATA_CMP:峰值比较算法
 ⑤S_RAM_RD_MAX_DATA:输出峰值以及对应的bram的地址
 
 10、算法状态机(第三段计数)
 ①S_RAM_RD_ADDR_CTRL:地址控制,输入地址小于终止地址,每次累加一步进
 ②S_RAM_RD_DATA_LATCH:当前状态计数,用于锁存前一级地址对应数据
 ③S_RAM_RD_DATA_CMP:当前状态计数,用于峰值比较算法
 ④S_RAM_RD_MAX_DATA:当前状态计数,用于输出峰值以及对应的bram的地址
 
 11、算法状态机(第三段比较)
 ①S_RAM_RD_DATA_LATCH:锁存前一级地址对应数据③S_RAM_RD_DATA_CMP:峰值比较算法,不断跟前一次数值比较,将大的数值赋给data_middle
 ④S_RAM_RD_MAX_DATA:输出峰值以及对应的bram的地址
 


















