DDS发生器的实质就是一个查找表,即通过地址对应寄存器里的值然后输出。
通俗来讲就是:将一个正弦周期等分成N份,存放到深度为N的rom里,然后通过地址的变换,来对应输出rom里面的值。
这里就会有疑问:地址是怎么变化的? 则提出几个词:频率控制字、相位控制字、相位累加字
相位累加字=相位累加字+频率控制字,地址=相位累加字+相位控制字。
频率控制字是什么?怎么用?
比如我rom存2048个数字,那我要确保全部取到,则对于寄存器地址[0:2047]里面的值全部要取,不能跳过。由上面的公式可以看出,如果频率控制字取1,则相位累加字以1的速度递增,则能取到所有值。如果频率控制字取0.5,则每个值输出两次(当然不能取0.5,打个比方)。
同理,现在我们将相位累加字位宽设为[20:0],将相位累加字的前11位做为地址,后10位用来累加。 此时我频率控制字若为2^11,则时钟每来1次,则地址加1,也就是每个值取一次。频率控制字若为2^10,则时钟每来2次,则地址加1,也就是每个值取1次。以此类推。
下面是matlab和fpga的代码
1.生成正弦查找表,并保存到coe文件
clear all ;
N=4096 ;
amp=2048 ;
phase=(0:4095)/4096*2*pi ;
sinvalue=round(cos(phase)*amp);
sinvalue(sinvalue<-2047)=-2047 ;
sinvalue(sinvalue>