什么是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时取得值对应线性调频第一个数据