XILINXFFTIP核的基本使⽤
vivado中FFT IP核的基本使⽤
最近⽤vivado仿真时需要⽤到FFT IPCore,调通程序的过程中也遇到⼀些⿇烦,在此将⼀些问题进⾏总结,希望可以帮到有需要的⼈。- 配置阶段
在IP Catalog中搜索FFT,然后双击即可进⼊配置页⾯。
1. 第⼀栏为Configuration,其中的通道数量和变换长度等参数根据⾃⼰的需求选择即可;
2. 第⼆栏为Implementation,我的设置为:
paul ryanData Format Fixed Point
Scaling Options Unscaled
Rounding Modes Convergent Rounding
其中需要说明的是 Scaling Options ,我要完成的是256点的IFFT,初期以为需要使⽤scaled模式,然后查阅官⽅资料,发现写的并不是很清晰,我看完后并不能明确的知道如果选择了scaled模式后应该如何
配置s_axis_config_tdata端⼝。之后了解到,我选择Unscaled模式即可,系统会根据你选择的FFT点数对输出位数进⾏扩展。⽐如我的输⼊位宽为16位,FFT点数为256点,选⽤Unscaled模式后,系统⾃动将输出位宽变为25位。但是由于vivado中要求数据宽度均为8的倍数,因此实际端⼝有64位宽,你只需⼼⾥明⽩[63:0]中[56:32]代表虚部、[24:0]代表实部即可。关于各端⼝的各位说明,可以在配置页左侧的 Implementation Details ⼀栏中了解(该栏中内容⾮常重要,可以让你了解每个端⼝的详细信息)。
3. 第三栏为Detailed Implementation,默认即可,⼀般⽆需变动。
- 代码部分
配置完成后,在例化该模块时,建议调⽤系统⽣成的代码,在IP Sources→xfft_0→Instantiation Template中打开xfft_0.veo即可,此为verilog语⾔版本。其代码如下:
xfft_0 your_instance_name (
.aclk(aclk), // input wire aclk
.s_axis_config_tdata(s_axis_config_tdata), // input wire [7 : 0] s_axis_config_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tready(s_axis_config_tready), // output wire s_axis_config_tready
.s_axis_data_tdata(s_axis_data_tdata), // input wire [31 : 0] s_axis_data_tdata
.s_axis_data_tvalid(s_axis_data_tvalid), // input wire s_axis_data_tvalid
.s_axis_data_tready(s_axis_data_tready), // output wire s_axis_data_tready
tiger mother
.s_axis_data_tlast(s_axis_data_tlast), // input wire s_axis_data_tlast
.m_axis_data_tdata(m_axis_data_tdata), // output wire [63 : 0] m_axis_data_tdata
虞美人赏析
.m_axis_data_tur(m_axis_data_tur), // output wire [7 : 0] m_axis_data_tur
联系方式的英文>adverti.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tready(m_axis_data_tready), // input wire m_axis_data_tready
流浪者英文.m_axis_data_tlast(m_axis_data_tlast), // output wire m_axis_data_tlast
.event_frame_started(event_frame_started), // output wire event_frame_started
.
event_tlast_unexpected(event_tlast_unexpected), // output wire event_tlast_unexpected
.event_tlast_missing(event_tlast_missing), // output wire event_tlast_missing
电子信息工程考研
.event_status_channel_halt(event_status_channel_halt), // output wire event_status_channel_halt
.event_data_in_channel_halt(event_data_in_channel_halt), // output wire event_data_in_channel_halt
.event_data_out_channel_halt(event_data_out_channel_halt) // output wire event_data_out_channel_halt
);
对于输出端⼝,直接命名⼀相同位宽的变量与之连接即可。对于输⼊端⼝,则需要根据其作⽤予以适当的激励信号,中的说明有助于对端⼝的了解。下⾯对其中⼏个端⼝稍作说明
s_axis_config_tdata,Unscaled模式下,该端⼝只有最低为有效,0为FFT,1为IFFT,其余为置0即可;
莎拉大波娃s_axis_data_tlast,该端⼝应在每⼀帧的最后⼀个数据输⼊时拉⾼,我并没有这样做,且不影响结果;
m_axis_data_tur,该端⼝指明每⼀输出数据在该帧中的序号,是重要的参考信号,配置时需要勾选XK_INDEX。
其余输⼊端⼝只要阅读官⽅⽂档即可很容易理解,端⼝配置正确程序就很容易跑通,如下是我的运⾏结果:高一英语学习方法
committing
- 结果说明
可以看出,vivado和matlab对同⼀组数据进⾏IFFT运算后结果相同。还需要说明⼀点的是,对于定点数,在做FTT时会扩展整数部分,做IFFT时,会扩展⼩数部分。对于2的N次⽅点IFFT,⼩数部分的扩展位数为N。⽐如在我的程序中,输⼊数据位宽为16,其中最⾼位为符号位,其余15位为⼩数位。经过256点IFFT之后,⼩数位扩展为23位,在真实数值设定时需加注意。真实数值设置⽅法如下:在仿真结果界⾯中的Objects⼀栏中,右击你想要设置的端⼝名,然后Radix→Real Settings,选择Fixed Point,其中Binary point即为⼩数位宽。
由于我还不是很熟悉CSDN编辑⽅式,上传图⽚后画⾯过⼤,影响观感,因此对于⼀些更适合⽤图⽚解释的步骤并没有使⽤图⽚。欢迎⼤家⼀起讨论该IP核中的其他功能。
这个视频给了我很⼤帮助,建议还不会使⽤该IP核的⼈认真观看,感谢⼩鱼同学制作的视频