“代码的改进后的详细介绍;端口参数实现电路配置;基于8点的FFT结构扩展到16点FFT”
01
—
设计概述
文章《
基2频率抽取FFT算法实现-软件篇
》讲述了基2频率抽取FFT算法的python实现,主要了解如何获取蝶形运算因子。
文章《基2频率抽取FFT算法实现-verilog篇2》以8点基2频率抽取FFT算法为例讲述了其verilog实现。主要需要注意的点如有符号数加法运算,有符号数乘法运算,以及带有小数运算的时候,在数字电路里面的处理方式。
这里不再讨论上述问题,这里讨论如何根据前面设计的基本模块通过参数配置实现16点的FFT算法。
可知16点的FFT蝶形运算有4级,整体结构如下所示。
注意这里的输出结果是蝶形运算最后一级的输出结果,与真正的FFT最后的输出之间的排序是不一致的,他们之间的关系为倒序,具体关系说明见文章《基2频率抽取FFT算法实现-软件篇》。
可以看到每级都只是由one_stage这个电路模块实现,其结构如下。
包含有buffer, w_coef, arithmetic_unit三个模块。
one_stage模块端口如下,DEPTH表示运算的数据量,STAGE_NUM表示处于第几级。
buffer模块实现获取本单元蝶形运算所需的数据。in_valid信号表示输入的数据有效,当数据获取完整则o_valid拉高,进行输出送到arithmetic_unit模块做相应的运算。buffer模块可配置的参数如下:
WIDTH_A:表示地址位宽,如16点的就是2^4,则WIDTH=4。
DEPTH:表示本单元运算需要的数据个数,如16点FFT第一级只有一个单元,有16个数据做蝶形运算。其配置如下
buffer有两个输出(a_real,a_img,b_real,b_img),对应蝶形运算的两个数据x(n),x(n+N/2)。
这里较上次做了个改进,当输入的数据量达到了 DEPTH/2就可以开始做蝶形运算了。如对于第一级,当输入的数据达到了9个时就可以开始做第一个蝶形运算了,此时就可将o_valid拉高。
w_coef模块如下:
其中addr为对蝶形运算因子选择的地址。
如16点的FFTT,第一级运算对应需要的蝶形运算因子为
第二级运算对应需要的蝶形运算因子为
以此类推故其寻址实现如下:
02
—
仿真结果
verilog设计的仿真结果(蝶形运算最后一级的输出结果):
python代码实现的结果,(蝶形运算最后一级的输出结果),代码见《基2频率抽取FFT算法实现-软件篇》:
实数部分结果:
虚数部分结果:
领取专属 10元无门槛券
私享最新 技术干货