Xilinx-Verilog-学习笔记(19):正弦波信号发生器与DDS
一、正弦波信号发生器
1、浮点数的定点化
这里以2.918为例,实现浮点数向定点数的转换:
(1)在进行浮点转定点之前,要先确定整数部分位宽和小数部分位宽。3位整数位宽,12位的小数位宽,最高位的符号位1位。
(2)15位宽的数能够表示的数值范围为-32768到32767。整数部分3位宽的数最大能表示到8,因此最大精度为8/32767=0.000244140625。
(3)2.918进行定点化的过程为2.918/(8/32768)=11952.128~=11952这个值就是定点后的2.918的值。而最后的0.128就是定点化会带来量化误差。
2、用matlab生成正弦波并进行量化处理
量化处理
量化在数字信号处理领域,是指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程。
正弦波量化思想
本实验通过256个位宽为8的数据对正弦信号进行采样,以对一个周期的正弦信号进行量化处理。每个数据位宽为8,相当于把正弦信号的幅度从-1到1进行256份等间隔划分;采样点数为256个,相当于对一个正弦周期等间隔地采样了256个点。
量化后的数据由256个介于-1到1之间的数构成,之后将浮点型的数值进行定点化的转换,使其为0~256之间的整数。(具体处理方法见代码)
MatLab代码:
clc;
clear all;
N=2^8;
s_p=0:255;%正弦波一个周期的采样点数
sin_data=sin(2*pi*s_p/N);%256个介于-1到1之间的数
%打印我们的波形
% plot(sin_data,'r*');
% hold on;
% plot(sin_data);
%定点化
fix_p_sin_data=fix(sin_data*127);%256个介于-128到127之间的数
for i=1:N
if fix_p_sin_data(i)<0
fix_p_sin_data(i)=N+fix_p_sin_data(i);%将负数搬到128到256之间(用255加即可)
else
fix_p_sin_data(i)=fix_p_sin_data(i);%整数不用管
end
end
%以下是生成mif文件,用于RAM的初始化
fid=fopen('sp_ram_256x8.mif','w+');
fprintf(fid,'WIDTH=8;\n');
fprintf(fid,'DEPTH=256;\n');
fprintf(fid,'ADDRESS_RADIX=UNS;\n');
fprintf(fid,'DATA_RADIX=UNS;\n');
fprintf(fid,'CONTENT BEGIN \n');
for i=1:N
fprintf(fid,'%d:%d; \n',i-1,fix_p_sin_data(i));
end
fprintf(fid,'END; \n');
fclose(fid);
通过sin_data=sin(2 * pi * s_p/N); 即可实现对一个正弦周期的量化。
3、design文件
moduleex_dds(
inputwiresclk,
inputwirerst_n,
outputwir