读取vivado中仿真的线性调频信号

通过在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中顶层预设的一致。 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值