通过在vivado中例化一个DDS生成一个可控制脉宽、带宽、重复频率的线性调频信号。在仿真顶层文件中导出然后在从matlab中读取出来,便于分析信号且验证其正确性。
首先在vivado中写好顶层
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/12/06 11:47:13
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module top(
);
reg clk;
reg rst;
initial
begin
clk = 1'b0 ;
rst = 1'b0;
#50
rst = 1'b1;
end
always#5 clk = ~clk;
wire [15:0] sign_re;
wire [15:0] sign_im;
sign_create u_sign_create(
. clk (clk),
. rst (rst),
. dds_T (16'd2000), //20us
. dds_prt (16'd5000),//50us
. dds_B (16'd10), //10M
. data_out_re (sign_re),
. data_out_im (sign_im)
);
integer outputfile;
initial
begin
outputfile = $fopen("C:/Users/TR/Desktop/lfm_sign.txt","w");
end
always@(posedge clk)
begin
$fwrite(outputfile,"%d\t",sign_re);
$fwrite(outputfile,"%d\n",sign_im);
end
endmodule
这里我设定运行时钟为100M,生成一个脉宽为20us、带宽为10M、重复周期为50us的线性调频信号。
运行结果如下:
在顶层仿真中将实部信号和虚部信号导出到桌面 lfm_sign.txt中。
在通过matlab读取,这里给出matlab读取的代码。
clc;clear;
%% 读取vivado仿真文件中导出的信号文件
filename = "C:\Users\TR\Desktop\lfm_sign.txt";
table_sign = readtable(filename);
sign_re = table_sign(1:end-1,1).Variables;
sign_im = table_sign(1:end-1,2).Variables;
%% 合成信号
sign_re = unsigned2signed(sign_re,16);
sign_im = unsigned2signed(sign_im,16);
sign = sign_re + 1i*sign_im;
Fs = 100e6;
Ts = 1/Fs;
t = linspace(0,length(sign)*Ts,length(sign));
f = linspace(-Fs/2,Fs/2,length(sign));
%% 观察信号
subplot(211);
plot(t,real(sign));
subplot(212);
plot(t,imag(sign));
figure;
plot(f,abs(fftshift(fft(sign))));
因为仿真出来的数据导出后是无符号数,所以通过自己写一个unsigned2signed函数 转换成有符号数。
unsigned2signed函数代码也给出
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [b] = unsigned2signed(data,width)
data_size = size(data);
sign_mask = 2^(width-1);
data_mask = ones(data_size)*sign_mask;
data_sign = -1*bitand(data_mask,data);
data_remainder = bitand((data_mask - 1),data);
b = data_sign + data_remainder;
观察到时域图和频域图如下:
从图可知信号脉宽为20us,重复周期为50us,带宽为10M的线性调频信号。与vivado中顶层预设的一致。