DDS的fpga实现
DDS的原理可以查找其他资料,本次主要采用matlab生成载波数据,通过存储在ROM中对数据进行读取。
1、先附上matlab代码生成的载波数据
clc;
clear all;
close all;
Nbit=16;%量化位数
Ndata= 4096;
N_data=0:Ndata-1;
sintheta=sin(pi*2/4/4096*(N_data));
plot(N_data,sintheta);
title('y=sin(\theta)');
xlabel('\theta');
ylabel('sin');
Nor_sin= sintheta/max(abs(sintheta)); % 对数据进行归一化
sinlianghua=round(Nor_sin*2^(Nbit-1)-1);%量化后注意首尾是否溢出
sinlianghua(1)=0;%首位负数-1改成0.
Fix_Nor2=dec2bin(sinlianghua,Nbit);
%% 将处理后数据存储在.coe文件中
fid = fopen('sintheta.coe','w');
fprintf(fid,'MEMORY_INITIALIZATION_RADIX = 2;\r\n');
fprintf(fid,'MEMORY_INITIALIZATION_VECTOR =\r\n');
for i=1:Ndata
fprintf(fid, '%s\r\n', Fix_Nor2(i,:));
end
fclose(fid);
可以看出,为了节省寄存器资源,根据正弦函数的对称性,只存储sin函数的四分之一周期。

上图是取得的需要存储的数据波形。
接下来就是关键的,需要在FPGA中进行取数以及对地址和数据的转换。先附上FPGA程序如下。首先定义控制字以及相位位宽,同时

最低0.47元/天 解锁文章
1408

被折叠的 条评论
为什么被折叠?



