之前本科的时候没有好好去看FFT算法,现在发现,这个算法太适合做硬件实现了,我当时本科的时候就想,为什么第一个数下标要从0开始,从1开始我背8点FFT应付考试多容易,学了verilog之后,这个算法实在是太优雅了!

FFT算法B站的参考视频;五分钟内掌握快速傅里叶变换(FFT)算法,我用了小半天弄明白,但是依旧有两段没有理解怎么推导的,后续补上。

一、公式手推过程

image-20240508185303627

image-20240508185459131

微信图片_20240508185418

二、尝试调用FFT的IP核

参考的博客链接:https://blog.csdn.net/jk_101/article/details/128065273

2.1 操作流程

image-20240508200957402

先按照文章的配置进行IP的配置

image-20240508201758208

以下是关于Radix-2,Burst I/O的解释

image-20240508201918461

image-20240508202416933

image-20240508202712816

image-20240508203106615

创建设计文件和tb文件,并粘贴博主的代码

image-20240508204319132

2.1.1 根据文章,在matlab生成相应的用于FFT的测试波形

image-20240508205218251

生成代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
N=128;

n=1:N;

f0=50;

f1=200;

fs=2e3;

y=sin(2*pi*f0.*n/fs)+2*sin(2*pi*f1.*n/fs);

figure;

plot(y);

Y=fft(y);

figure;

plot(abs(Y));

y1=y';
q=quantizer([16 12]);
y2=num2bin(q,y1);
fid1=fopen('E:\Matlab_project\FFT_Wave_generator/y1.txt','wt');
for i=1:N
fwrite(fid1,y2(i,:));
fprintf(fid1,'\n');
end
fclose(fid1);

2.1.2 更改testbench的读取文件位置

image-20240508205550356

2.1.3 用$readmenb读取不到文件

image-20240508211041641

dataI的仿真结果显示xxxx,去读取不存在的文件效果和读取存在的文件效果是一样的,解决方案是将文件放到仿真器的相对路径下,代码和文件路径如图所示。

image-20240508211916380

2.1.4 调用IP核之后,没有返回FFT的实部虚部

导致功率谱无法计算结果为零

image-20240510001240861

image-20240510001535947

解决方案:

2.2 部分疑惑的解释

image-20240508201530484

image-20240508201610064

三、参考另一个详细的B站视频走一遍

参考视频:VIVADO快速傅里叶变换FFT IP核详解(端口篇)

四、FFT IP核的信号解析

3.1 input s_axis_data_tdata[31:0] 输入数据

如果输入数据在IP核的选择是16位

image-20240525160238757

那么S_AXIS_DATA_TDATA作为输入数据会给到32位的位宽,高16位是虚部,低16位是实部。

image-20240525155951885

如果设置为双通道,可以看到IP核给两个通道的实部和虚部都各自给到了16位的位宽

image-20240525160646169

3.2 input s_axis _data_tlast 传输结束指示信号

tlast信号会和最后一个一起到来的数据一起拉高,如果这个IP核只用一次,那么这个信号 也可以不配置?

大概意思就是1024个点,收了1024个数据,多了就进不去了,里面有没有buffer暂时不知道,也有可能就是就去两个先做两点fft,进来的两个数据就可以丢掉了,然后记下来,之后找到规律了,所有点的fft也能算出来

image-20240525161155227

3.3 output s_axis_data_tready IP核处理完毕信号

数据处理完毕会拉高,告诉主机处理完毕,应该是会跟着最后一个处理好的数据一起拉高。如果说只用一次不用配置,意思是丢1024个数据进去,里面自己有buffer存下来数据或者是进去一个做一次fft,一起出来,还是进一个出一次

image-20240525162636601

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有关系,咱们用不到

image-20240525171237657

image-20240525171822731

这个是scale_SCH的相关配置,在IP核上的设置如下下张图

image-20240525172756242


image-20240525173303256
关于scaling选项的GTP解释,缩放,每次缩放数据都会越来越小。

image-20240525173729275

这个虽然设置了点数是1024,但是如果勾选“Run Time Configurable Transform Length”,就可以改变fft点数

image-20240525171006605

output s_axis_config_tready 和input s_axis_config_tvalid

当config信号在从机(IP核)可以接收的时候,tready拉高,同时主机也有tvalid信号。

在scaling 为scaled的时候,