FFT的FPGA的verilog实现
之前本科的时候没有好好去看FFT算法,现在发现,这个算法太适合做硬件实现了,我当时本科的时候就想,为什么第一个数下标要从0开始,从1开始我背8点FFT应付考试多容易,学了verilog之后,这个算法实在是太优雅了!
FFT算法B站的参考视频;五分钟内掌握快速傅里叶变换(FFT)算法,我用了小半天弄明白,但是依旧有两段没有理解怎么推导的,后续补上。
一、公式手推过程
二、尝试调用FFT的IP核
参考的博客链接:https://blog.csdn.net/jk_101/article/details/128065273
2.1 操作流程
先按照文章的配置进行IP的配置
以下是关于Radix-2,Burst I/O的解释
创建设计文件和tb文件,并粘贴博主的代码
2.1.1 根据文章,在matlab生成相应的用于FFT的测试波形
生成代码
1 | N=128; |
2.1.2 更改testbench的读取文件位置
2.1.3 用$readmenb读取不到文件
dataI的仿真结果显示xxxx,去读取不存在的文件效果和读取存在的文件效果是一样的,解决方案是将文件放到仿真器的相对路径下,代码和文件路径如图所示。
2.1.4 调用IP核之后,没有返回FFT的实部虚部
导致功率谱无法计算结果为零
解决方案:
2.2 部分疑惑的解释
三、参考另一个详细的B站视频走一遍
参考视频:VIVADO快速傅里叶变换FFT IP核详解(端口篇)
四、FFT IP核的信号解析
3.1 input s_axis_data_tdata[31:0] 输入数据
如果输入数据在IP核的选择是16位
那么S_AXIS_DATA_TDATA作为输入数据会给到32位的位宽,高16位是虚部,低16位是实部。
如果设置为双通道,可以看到IP核给两个通道的实部和虚部都各自给到了16位的位宽
3.2 input s_axis _data_tlast 传输结束指示信号
tlast信号会和最后一个一起到来的数据一起拉高,如果这个IP核只用一次,那么这个信号 也可以不配置?
大概意思就是1024个点,收了1024个数据,多了就进不去了,里面有没有buffer暂时不知道,也有可能就是就去两个先做两点fft,进来的两个数据就可以丢掉了,然后记下来,之后找到规律了,所有点的fft也能算出来
3.3 output s_axis_data_tready IP核处理完毕信号
数据处理完毕会拉高,告诉主机处理完毕,应该是会跟着最后一个处理好的数据一起拉高。如果说只用一次不用配置,意思是丢1024个数据进去,里面自己有buffer存下来数据或者是进去一个做一次fft,一起出来,还是进一个出一次
input s _axis data tvalid 输入数据有效信号
如果没有配置,就是fft点数选择1024,就只接收1024个数据,多了不管
s_axis_config
s_axis_config tdata
2的16次方是65536,NFFT应该是(Number of FFT),CP_LEN是涉及到下图的循环啥的,和LTE通信的fft有关系,咱们用不到
这个是scale_SCH的相关配置,在IP核上的设置如下下张图
关于scaling选项的GTP解释,缩放,每次缩放数据都会越来越小。
这个虽然设置了点数是1024,但是如果勾选“Run Time Configurable Transform Length”,就可以改变fft点数
output s_axis_config_tready 和input s_axis_config_tvalid
当config信号在从机(IP核)可以接收的时候,tready拉高,同时主机也有tvalid信号。
在scaling 为scaled的时候,