线性调频信号FFT与之前的8点、32点FFT在IP核的使用方面并没有什么不同;唯一需要注意的就是仿真中线性调频信号如何产生,如何读取到vivado,以及数据位宽。此处以Matlab生成数据,导入到Vivado进行处理,并不代表数据只能这样产生和传入:
LFM信号产生:Mtalab生成对应参数下的LFM信号
信号存储:Mtalab中生成的LFM信号按照二进制存储到TXT文件(Vivado中一般按照2进制、16进制读取数据)
Vivado读取数据:Vivado读取TXT中数据,作为FFT输入
FFT:调用FFT核,对输入进行处理
数据输出:FFT处理结果按照十进制存储到TXT文件,可被Matlab读出。
注意1:应注意输入信号位宽,以及输入信号对应的输出位宽;如果输入信号位宽较大,很可能导致输出位宽超过设计的输出位宽,导致错误。——这也是之前一致仿真出错的原因之一。
注意2:应注意Vivado中处理二进制补码,而不是简单的反码。因此Matlab数据必须转换为二进制补码,才能被Vivado正确读取。
Matlab数据存储:
%% 转换为16bit 2进制数据(4-二进制补码) size = 8; re_y_ = floor(real(y)*2^size); im_y_ = floor(imag(y)*2^size); re_y = re_y_; im_y = im_y_; re_y(find(re_y_<0)) = (re_y_(find(re_y_<0)) )+ 2^16; im_y(find(im_y_<0)) = (im_y_(find(im_y_<0))) + 2^16;Vivado数据读取:
$readmemb("F:/vivado_files/LFM_Lr.txt",data_r); $readmemb("F:/vivado_files/LFM_Li.txt",data_i);处理过程:
s_axis_config_tdata=24'b0000_0000_0000_0000_0000_0001; s_axis_config_tvalid=1'b1; #10; s_axis_config_tdata=24'b0000_0000_0000_0000_0000_0000; s_axis_config_tvalid=1'b0; #1005; repeat(1024)begin s_axis_data_tvalid=1'b1; // real_data=real_data+16'd1; real_data=data_r[cnt]; imag_data=data_i[cnt]; cnt=cnt+1; if(cnt==1024) s_axis_data_tlast=1'b1; #10; end s_axis_data_tvalid=1'b0; s_axis_data_tlast=1'b0; real_data=16'd0; imag_data=16'd0; #100000; $fclose(handle1); $stop;处理结果输出:
可以看出,数据读入与输出均正确。
