1、简述
线性调频信号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读出。
2、仿真设计与结果
注意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;
处理结果输出:
可以看出,数据读入与输出均正确。