基于RAM的雷达线性调频信号产生

什么是DDS

        DDS(Direct Digital Synthesis)是一种把一系列数字信号通过D/A转换成模拟信号的数字合成技术。它有查表法和计算法两种基本合成方法。由于ROM查询法结构简单,只需要在ROM中存放不同相位对应的幅度序列,然后通过相位累加器的输出对其寻址,经过数/模转换和低通滤波(LPF)输出便可以得到所需要的模拟信号。这里,选用ROM查表法。DDS技术实质上是实现了一个数字分频器的功能。对于一个周期的正弦波连续信号,可以沿其相位轴方向,以等量的相位间隔对其进行相位/幅度采样,得到一个周期性的正弦信号的离散相位的幅度序列,对模拟幅度进行量化后的幅值采用二进制量化保存,这样就把一个周期的正弦波连续信号转换成一系列离散的二进制数字量,然后存到ROM中,每个存储器单元的地址即是相位取样地址,存储单元的内容是已经量化了的正弦波幅值。一个这样的Rom存储器构成了一个与2π周期相位取样对应的正弦波函数表。

        换句话说,预先把波形数据存储到ROM中,然后根据想要的输出频率进行输出,即可产生阶梯波形,再通过低通滤波器进行平滑处理即可得到任意波形

matlab产生ROM所需coe文件

clc,clear;
%%参数设置
c=3e8;
T=10e-6;%10e-6时间发送完毕10ns
B=20e6;%%带宽
K=B/T;
Fs=200e6;%采样率
Ts=1/Fs;
f0=0;%频点设置  可以修改
R=1000;%目标距离
t=0:Ts:T;
N=T/Ts+1;%采样点数   对应ROM深度
x0_cos=cos(2*pi*(f0+K/2.*t).*t);%得到的cos值在-1到1之前,需要量化,量化参数根据ROM位宽设置
%此处ROM位宽为16,由于MSB是符号位,所以cos数据*2^15
x0_cos=x0_cos*2^15;
x0_sin=sin(2*pi*(f0+K/2.*t).*t);
x0_sin=x0_sin*2^15;
x0=x0_cos+1j*x0_sin;%发射 RCS可以设置,此处默认为1

fid=fopen('E:\work\matlab\coe\x0_cos.coe','wt');
fprintf(fid,'MEMORY_INITIALIZATION_RADIX = 10;\n');
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR = \n');
for i=1:1:length(x0_cos)-1
   fprintf(fid,'%.0f,\n',x0_cos(1,i)); 
end
fprintf(fid,'%.0f;\n',1e5*x0_cos(1,length(x0_cos))); 
fclose(fid);

 vivado rom IP核使用

新建一个工程双击IP Catalog  搜索ROM,选择如图所示ip

 rom的设置

 

 

点击ok,即可生成rom IP核

Verilog 代码 

先写design source 

module dds(
        input   clk,res,
        output[15:0]  data   
    );
    reg[10:0]   addr;
    
    always@(posedge clk or negedge res)
    begin
        if(~res)begin;
            addr<=0;
        end
        else if(addr==11'd2000)
            addr<=0;
        else    addr<=addr+1;
    end
    
    
test_rom u1 (
  .clka(clk),    // input wire clka
  .addra(addr),  // input wire [10 : 0] addra
  .douta(data)  // output wire [15 : 0] douta
);    
    
endmodule

测试文件代码如下


module test_dds_tb();
reg     clk,res;
wire[15:0]    data;
dds dds(
    .clk(clk),
    .res(res),
    .data(data)
);
initial begin
                clk<=0;res<=0;
                #20 res<=1;
                #5000 $stop;
end
always #5   clk<=~clk;


endmodule

设为顶层文件之后运行仿真,结果如下

 总结

数据会出现1000_0000_0000_0000,原本是32768,显示-32768,因为显示的是有符号数,具体的实现和设计根据项目要求设计,或者自己设计一个rom,addr取址是有影响的,addr为0和1的时候取得值错误,addr=2时取得值对应线性调频第一个数据

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值