DA9739基于射频DAC9739的任意波形产生的性能研究

Posted fpga和matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DA9739基于射频DAC9739的任意波形产生的性能研究相关的知识,希望对你有一定的参考价值。

1.软件版本

MATLAB2013b,Quartusii12.1

2.算法理论

2.1产生测试信号

首先设计一个FPGA正弦,线性调频,编码。然后将信号经过一个LVDS。再经过一个RF D/A。

通过如下MATLAB运行得到如下的波形:

clc;
clear;
close all


depth  = 4096;    %存储单元数;
widths = 16;      %数据宽度为14位;
N      = 2*pi/depth : 2*pi/depth : 2*pi;         %保存1/4个周期
s      = round(2^(widths-2) * sin(N)); 

figure;
plot(s,'r-*');
grid on;
title('1/4周期正弦波');

%以"wt"的形式打开,\\n为换行
fidc=fopen('dds.mif','wt');      
fprintf(fidc,'depth=%d;\\n',depth);
fprintf(fidc,'width=%d;\\n',widths);
fprintf(fidc,'address_radix=dec;\\n');
fprintf(fidc,'data_radix = dec;\\n');
fprintf(fidc,'Content Begin\\n');

for x=1:depth 
    fprintf(fidc,'%d:%d;\\n',x-1,s(x));
end

fprintf(fidc,'end;');
fclose(fidc);

 这个文件就是需要在Quartus中使用ROM进行调用的。并将这个mif文件的属性改为只读。

     在ROM中对该文件进行调用:

完成如下配置后,编写代码(代码这里不给出),进行仿真,仿真结果如下所示:

使用类似的方法,我们可以依次得到线性调频信号以及编码信号。

      线性调频信号是指频率随时间而线性改变(增加或减少)的信号。线性调频的瞬时频率f(t)呈线性变化:f(t)=f0+kt,其中f0表示时间等于零时的频率,k表示频率改变的速率,当k>0时,频率递增,k<0则递减。

      运行该文件夹下的MATLAB,我们可以得到如下的仿真结果图:

 利用和一相似的方法,我们可以得到如下的FPGA仿真结果:

编码信号采用卷积编码:

      卷积码为(2,1,7)标准卷积码,约束长度为7比特,码生成矢量,(反相后输出),该码型共有64个状态。(2,1,7)卷积码的编码结构图如图1所示,该编码器中的寄存器的初值全为0,,输入1比特,根据生成多项式进行运算后,得到2比特的输出,输出后移位寄存器向右移位一次,并重复编码过程。

    其仿真结果如下所示:

2.2 LVDS

LVDS接口又称RS-644总线接口,是20世纪90年代才出现的一种数据传输和接口技术。LVDS即低电压差分信号,这种技术的核心是采用极低的电压摆幅高速差动传输数据,可以实现点对点或一点对多点的连接,具有低功耗、低误码率、低串扰和低辐射等特点,其传输介质可以是铜质的PCB连线,也可以是平衡电缆。LVDS在对信号完整性、低抖动及共模特性要求较高的系统中得到了越来越广泛的应用。

目前,流行的LVDS技术规范有两个标准:一个是 TIA/EIA(电讯工业联盟/电子工业联盟)的ANSI/TIA/EIA-644标准,另一个是IEEE 1596.3标准。

    这里,LVDS主要是用于在实际硬件的时候,需要LVDS高速接口将数据发送到ADC中,但是这里,我们暂时使用MATLAB进行验证,故在进行MATLAB模拟ADC的时候,不需要LVDS,所以,这里LVDS单独给出进行仿真分析。

这里LVDS主要使用ALTERA的IP核进行实现。

其仿真结果如下所示:

其配置如下所示:

2.3 经过一个RF D/A,RF D/A 用matlab模拟

整个方案的框图如下所示:

 

按上面的结构,将各个模块合并起来。得到如下的原理框图:

分别对选择三种模式的信号进行仿真得到如下的仿真结果:

Sin:

线性调频:

编码:

3.采样性能分析

clc;
clear;
close all;
warning off

sel  = 0;%1:调用QII的仿真数据,0:调用完毕后开始调制
sel2 = 1;%1:使用内部测试信号, 0:使用QII仿真数据

%缩放比例因子,由于频率值非常大,数据量很大,我们需要将频率同时降低,达到显示的效果
KK = 1e5;
%采样频率
Fs    = 2.5e9/KK;%2.5G
%中频频率
Fc    = 2.5e9/2/KK;
%fsync符号时钟
fsync = 25e6/KK;%这里假设采集到的数据在FPGA内部的采样率为25M,具体值可以调整。



if sel == 1
    figure;
    %读取sin数据
    Data_sin = tbls('sin_tbl\\sin.tbl');
    Data_sin = Data_sin(1:0.9*length(Data_sin));
    subplot(311);
    plot(Data_sin);

    %读取线性调频数据
    Data_fm = tbls('Linear_FM_tbl\\fm.tbl');
    Data_fm = Data_fm(1:0.9*length(Data_fm));
    subplot(312);
    plot(Data_fm);


    %读取编码后的数据
    Data_coder = tbls('Coder_tbl\\coder.tbl');
    Data_coder = Data_coder(1:0.9*length(Data_coder));
    subplot(313);
    plot(Data_coder);

    save QuartusII_save_data.mat Data_sin Data_fm Data_coder
else
    load QuartusII_save_data.mat    
    figure;
    %读取sin数据
    subplot(311);
    plot(Data_sin);
    %读取线性调频数据
    subplot(312);
    plot(Data_fm);
    %读取编码后的数据
    subplot(313);
    plot(Data_coder);    
end



%取其中的一部分数据进行处理,防止数据流太多报错out of memory
S          = 20001;
E          = 20400;
%任意取一段数据
Data_sin   = Data_sin(S:E);
Data_fm    = Data_fm(S:E);
Data_coder = Data_coder(S:E);

%为了模拟出三种模式即RZ MIX NRZ,选择其中一个信号作为测试信号
N = Fs/fsync;%采样率倍数
%为了产生资料中的效果,取N = 4;
N = 2;

if sel2 == 1
   test_data   = sin(2*pi*[2/Fs:2/Fs:1]);
else   
   test_data   = Data_sin/max(Data_sin);
end


LL          = length(test_data);
SData_coder = test_data;


%使用Fs进行不同模式的采样
%NRZ
SData_coder_NRZ = SData_coder;

%RZ
SData_coder_RZ          = SData_coder;
SData_coder_RZ(2:N:end) = 0;

%MIX
SData_coder_MIX = SData_coder;
SData_coder_MIX(2:N:end) = -1*SData_coder(1:N:end);


figure;
subplot(311);stairs(SData_coder_NRZ);title('NRZ');
subplot(312);stairs(SData_coder_RZ);title('RZ');
subplot(313);stairs(SData_coder_MIX);title('MIX');


nfft = 512;
f=Fs*(0:nfft-1)/nfft;
%绘制三种不同模式下的幅频图
y_fft1 = -20*log10(fftshift(abs(fft(SData_coder_NRZ,nfft))));
y_fft2 = -20*log10(fftshift(abs(fft(SData_coder_RZ,nfft))));
y_fft3 = -20*log10(fftshift(abs(fft(SData_coder_MIX,nfft))));
 

figure;
plot(f(1:round(2*length(f)/3)),y_fft1(1:round(2*length(f)/3)),'b');hold on;
plot(f(1:round(2*length(f)/3)),y_fft2(1:round(2*length(f)/3)),'r');hold on;
plot(f(1:round(2*length(f)/3)),y_fft3(1:round(2*length(f)/3)),'k');hold off;
grid on
xlabel('FREQUENCY(Hz)');
ylabel('dBFS');
legend('NRZ','RZ','MIX');














 A28-39

以上是关于DA9739基于射频DAC9739的任意波形产生的性能研究的主要内容,如果未能解决你的问题,请参考以下文章

Python科学计算——任意波形拟合

STM32 基DMA的DAC波形发生器

基于8086波形发生器仿真设计-微机原理设计资料

基于8086波形发生器仿真设计-微机原理设计资料

10-20k方波三角波生成器 50-100kPWM方波

10-20k方波三角波生成器 50-100kPWM方波