DDS 信号发生器
DDS 是直接数字式频率合成器( Direct Digital Synthesizer)的英文缩写,是一项关键
的数字化技术。与传统的频率合成器相比, DDS 具有低成本、低功耗、高分辨率和快速转
换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。
作为设计人员,我们习惯称它为信号发生器,一般用它产生正弦、锯齿、方波等不同波形
或不同频率的信号波形,在电子设计和测试中得到广泛应用。
基本结构
了解dds,下面的dds基本的结构需要了解清楚。
DDS,无非就是输出一个波形,而这个波形携带一些参数就是频率和相位。
输出波形,首先就需要如何产生波形,如下图的波形数据表ROM就是储存波形的数据,在FPGA中可以调用ROM的IP核,用mif文件来记录波形的数据加载到ROM中即可。mif文件可以用matlab来产生。
波形有了,那么就是如何改变波形的频率以及相位,这个其实也很简单,假设我们产生出的波形有4096个采样点,每个波形输出4096个点,这是固定的,所以改变频率不就是一个点我们多读或者少读几次不就达到波形周期的变化,这也就改变了频率。相位改变就比较简单,就是从第几个采样点开始输出波形。
下面DDS最核心的地方就是***相位累加器***,N取的是32位,频率字K每来一个时钟就与累加器的初值累加一次。这个作用就是用来改变频率,主要通过低20位[19:0]的溢出来控制高12位[31:20]的数据变化。
***相位调制器***就是截取从相位累加器值的高12位来对ROM表的寻址。假设ROM表中存储4096个点,那么地址位宽就是12位的,所以M的位宽就是12位的。
相位字P就是控制ROM表中的0~4095个采样点是从哪个开始。
K = 2^N * fOUT / fCLK
上面的公式就是频率计算公式。
- 系统时钟 CLK 为整个系统的工作时钟,频率为 fCLK;
- 频率字输入 F_WORD,一般为整数,数值大小控制输出信号的频率大小,数值越大输出信号频率越高,反之,输出信号频率越低,后文中用 K 表示;
- 相位字输入P_WORD,为整数,数值大小控制输出信号的相位偏移,主要用于相位的信号调制,后文用 P 表示;
- 设输出信号为CLK_OUT,频率为 fOUT。
MATLAB产生mif文件
采样次数为 2^12 = 4096 次,采集的波形幅值数据位宽为 8bit,将采集数据保存为 MIF 文件。对波形进行等间隔采样,以采样次数作为 ROM 存储地址,将采集的波形幅值数据做为存储数据写入存储地址对应的存储空间。
下面是matlab的命令:
01 clc; %清除命令行命令
02 clear all; %清除工作区变量,释放内存空间
03 F1=1; %信号频率
04 Fs=2^12; %采样频率
05 P1=0; %信号初始相位
06 N=2^12; %采样点数
07 t=[0:1/Fs:(N-1)/Fs]; %采样时刻
08 ADC=2^7 - 1; %直流分量
09 A=2^7; %信号幅度
10 %生成正弦信号
11 s=A*sin(2*pi*F1*t + pi*P1/180) + ADC;
12 plot(s); %绘制图形
13 %创建 mif 文件
14 fild = fopen('sin_wave_4096x8.mif','wt');
15 %写入 mif 文件头
16 fprintf(fild, '%s\n','WIDTH=8;'); %位宽
17 fprintf(fild, '%s\n\n','DEPTH=4096;'); %深度
18 fprintf(fild, '%s\n','ADDRESS_RADIX=UNS;'); %地址格式
19 fprintf(fild, '%s\n\n','DATA_RADIX=UNS;'); %数据格式
20 fprintf(fild, '%s\t','CONTENT'); %地址
21 fprintf(fild, '%s\n','BEGIN'); %开始
22 for i = 1:N
23 s0(i) = round(s(i)); %对小数四舍五入以取整
24 if s0(i) <0 %负 1 强制置零
25 s0(i) = 0
26 end
27 fprintf(fild, '\t%g\t',i-1); %地址编码
28 fprintf(fild, '%s\t',':'); %冒号
29 fprintf(fild, '%d',s0(i)); %数据写入
30 fprintf(fild, '%s\n',';'); %分号,换行
31 end
32 fprintf(fild, '%s\n','END;'); %结束
33 fclose(fild);