您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > vivado2013.4FFT(9.0版本AXIS总线)-IP使用及仿真
项目需求,最近使用了Vivado2013.4做开发,设计中使用到FFT(9.0)的IP,该IP接口采用AXIS总线格式,相比ISE14.7中FFT(8.0)以及Vivado中FFT(LTE)输入信号格式大变,不过只要熟悉AXIS总线信号格式就没得问题,不要怕麻烦!!!(刚开始使用就是怕麻烦,有些握手信号没用,event状态信号也没注意,浪费了不少时间)一、设计参数配置,及IP生成下面开始介绍配置界面:第一页,Configuration,主要是FFT变换长度以及结构选择。NumberofChannels:FFT变换通道,可以选择多通道,实现多帧数据同时进行FFT运算;TransfromLength:FFT变换长度;如果下面选择了“RunTimeConfigurationTransformLength”,则该参数为FFT变换最大长度。时钟选择根据自己设计需求,只能是1—550之间的整数,不小于自己需求时钟就可以了。ArchitectureChoice:实现架构选择,根据设计需求、板子资源情况,本设计中选择变换处理时间最短、消耗资源最大的并行流水结构;其他结构以此降低了变化速率但是节省了资源,这个在PG109-xfft中有详细介绍。RunTimeConfigurationTransformLength:勾选该项,则在变换过程中可以改变FFT变换的长度,通过s_axis_config_tdata中NFFT字段进行配置。第二页,Implementation介绍。DataFormat:输入数据格式,定点和浮点两种,根据自己设计需求选择了定点;ScalingOptions:BlockFloatPoint、Scaled、Unscaled三种可选。BlockFloatPoint不管输入格式如何,FFT变换内部采用浮点,会根据每一级变换数据情况自动缩放,使得数据不出现溢出,在m_axis_data_tuser中会有5个比特表示每一级缩放情况(本设计中是[20:16]);Scaled选择后,在s_axis_config_tdata中有相应字段配置缩放因子,这个在pg109-xfft中有详细介绍,每一级包含2个stage,2个比特表示一级的缩放,一般0-3可选,变换长度NFFT,如果log2(NFFT)不是2的倍数,则最高一级的缩放只能0-1可选;Unscaled全精度,不用担心变换过程中会出现溢出,但是输入32bit,变换后的输出是64bit跟自己的设计不符合,截位误差更大。PrecisionOptions:本设计保持默认设置,可以尝试修改下。ControlSignals:ACLEN时钟使能信号可以不选,复位信号ARESETn还是建议选上(至少保持2个时钟的低电平)。OutputOrderingOptions:NaturalOrder,Bit/DigitaReservedOrder两种,NaturalOrder就是变换后的输出已经调整了顺序,按照索引xk_index的自然序列输出变换结果,Bit/DigitaReservedOrder就是按照变换后的结果输出,索引xk_index不是自然序列,可能需要自己缓存再按索引值顺序输出。CyclicPrefixInsertion,CP添加,勾选上,在进行IFFT后可以根据s_axis_config_tdata中的CP长度配置自动添加CP。OptionalOutputFields:XK_INDEX是FFT变换结果索引,在m_axis_data_tuser中有相应的字段。OVFLO是变换中溢出指示信号,对应event_fft_overflow。建议这两个还是勾选,对于设计有帮助。ThrottleScheme:没做研究,保持默认配置。猜想应该是fft变换过程中配置参数修改是立即生效,还是完成该帧处理下一帧生效。第三页,DetailedImplementation设置。这一页设置影响不大,如果板子资源丰富,可以在ComplexMultipliers中选择“Use4-multiplierstructure”,保持默认配置也可以。之后点击OK就可以生成该IP,等待„„如果你电脑配置足够高,很快就完成。二、仿真(Vivado自带工具仿真,以及Vivado调用Modelsim仿真)首先,吐槽下Vivado自带的仿真工具(不知道什么名字,只是知道ISE的是Isim)。IP生成会自动产生一个Demo_tb,可以先跑下仿真看下时序什么的,熟悉下IP,但是有些时候跑仿真,编译什么都通过了,就在最后一部调出Wave仿真界面的时候崩溃了,遇到了好几次,如果是内存不足,问题是用服务器也遇到过好几次。其次,Vivado仿真后的数据,如果选择了Analog输出,结果显示完全超出你的想象。仿真输出的波形明显地显示你变换的结果不对,个人使用了正弦信号输入,变换后的结果也不对,然后想到可能是显示问题,就是用几种方法验证(ISE调用Modelsim,Vivado调用Modelsim,Vivado仿真结果输出在Matlab中画图),以上各种方法验证了Vivado仿真界面选择Analog输出就是最大的问题。不反对Vivado拿来设计功能的确强大,毕竟ISE升级版,但是加入自带仿真后,软件也变大了,问题是仿真效果并不好,而且仿真时间比调用Modelsim仿真更长。发现这个问题之前,实在无力,就找Xilinx到技术支持,解释得云里雾里,感觉是我在给他说,这个是怎么配置,他说的不对。但是,但是,他还是坚持自己说的对,那就看pg109嘛,里面写得明明白白的,那人还是坚持自己说的。已经无力吐槽。只能说,技术支持还是要专业点嘛。后来说发给他工程看下,周五下午4点半还没收到,说下班就不会看了下周搞。下面放图对比仿真效果:Vivado自带仿真(修改Scale值输出幅度完成无变化)Vivado调用Modelsim仿真(同样的数据,修改了Scale值,输出对比明显)下面简单介绍自己的仿真过程。(1)仿真模型在Matlab中产生正弦数据(其他数据也可以),在Vivado中例化了FFT以及IFFT对IP,将Matlab产生的数据经过FFT和IFFT处理后,数据输出在Matlab中画图对比原始波形(Modelsim中直接选择Analog也可以)。(2)测试数据在Matlab产生正弦波,然后将数据转换为二进制补码格式,实部、虚部均采用16bit表示,数据格式(16,15)。代码如下:%generatedata,2'sN=1024;x=(0:1/N:1-1/N)*2*pi;data_sin=fopen('data_sin.txt','w');y1=cos(x);y2=sin(x);%length(y1)%浮点转为二进制补码forn=1:Nify1(n)0y1(n)=round(2^16+y1(n)*2^14);ify1(n)==65536y1(n)=0;endelsey1(n)=round(y1(n)*2^14);endify2(n)0y2(n)=round(2^16+y2(n)*2^14);ify2(n)==65536y2(n)=0;endelsey2(n)=round(y2(n)*2^14);endendform=1:2*14forn=1:N%y(n)=round((y1(n)+1)*2^14)*2^16+round((y2(n)+1)*2^14);fprintf(data_sin,'%s',dec2bin(y1(n),16));fprintf(data_sin,'%s\n',dec2bin(y2(n),16));endendMatlab中读取文本(二进制补码存储),将二进制补码转换为浮点代码如下:file=fopen('filename.txt');fori=?data_str=fgetl(file);data_real=bin2dec(num2str(data_str(17:32)));data_imag=bin2dec(num2str(data_str(1:16)));ifdata_real2^15data_real=data_real-2^16;endifdata_imag2^15data_imag=data_imag-2^16;enddata_ifft(i)=data_real+1i*data_imag;end(3)Testbench直接放代码,然后说明使用注意事项。`timescale1ns/1psmoduletb_fft_ifft;regaclk;regaresetn;reg[31:0]s_axis_config_tdata;regs_axis_config_tvalid;wires_axis_config_tready;reg[31:0]s_axis_data_tdata;regs_axis_data_tvalid;regs_axis_data_tlast;wire[31:0]m_axis_data_tdata_ifft;wire[23:0]m_axis_data_tuser_ifft;wirem_axis_data_tvalid_ifft;wirem_axis_data_tlast_ifft;//integerinputfile1;//integerinputfile2;reg[15:0]data_i[28671:0];reg[15:0]data_q[28671:0];reg[31:0]data_sin[28671:0];integeroutputfile1;integeroutputfile2;initialbegin//inputfile1=$fopen(E:/vivado_prj/ifft_fft/ifft_fft.srcs/sources_1/imports/new/data_i_rmcp_b.txt,r);//inputfile2=$fopen(E:/vivado_prj/ifft_fft/ifft_fft.srcs/sources_1/imports/new/data_q_rmcp_b.txt,r);$readmemb(E:/vivado_prj/fft_ifft_scaled/fft_ifft_scaled.srcs/sources_1/imports/new/data_i_rmcp_b.txt,data_i,0,28671);$readmemb(E:/vivado_prj/fft_ifft_scaled/fft_ifft_scaled.srcs/sources_1/imports/new/data_q_rmcp_b.txt,data_q,0,28671);$readmemb(E:/vivado_prj/fft_ifft_scaled/fft_ifft_scaled.srcs/sources_1/imports/new/data_sin.txt,data_sin,0,28671);//$fclose(inputfile1);//$fclose(inputfile2);endinitialbeginoutputfile1=$fopen(fft_out.txt,w);outputfile2=$fopen(ifft_out.txt,w);endalways@(posedgeaclk)beginif(uut.m_axis_data_tvalid)$fwrite(outputfile1,%b\n,uut.m_axis_data_tdata);endalways@(posedgeaclk)beginif(uut.m_axis_data_tvalid_ifft)$fwrite(outputfile2,%b\n,uut.m_axis_data_tdata_ifft);endfft_ifftuut(.aclk(aclk),.aresetn(aresetn),.s_axis_config_tdata(s_axis_config_tdata),.s_axis_config_tvalid(s_axis_config_tvalid),.s_axi
本文标题:vivado2013.4FFT(9.0版本AXIS总线)-IP使用及仿真
链接地址:https://www.777doc.com/doc-4149756 .html