DDS正弦信号发生器

虽然临近考试,还是偷着时间把DDS的初级操作给搞定了,O(∩_∩)O哈哈哈。从搞清理论原理,到下载调试出波形,还真费了点功夫。

这也算从VHDL转战verilog的第一仗吧,把模块化设计小过了把瘾,嘿嘿……

不管这能不能算个项目,但我还是在短时间内弄出来了,至于细节问题还有功能加强,考试之后再说喽!

 

首先还是要理清DDS中的理论计算关系,好的设计总是靠些理论的,呵呵。以输出信号为正弦信号为例好啦,主要关系和公式如下。

我们都知道,输出的正弦信号的相位是:clip_image002,三角函数而已啦!

为把t数字化(量化),选取基准时钟(系统时钟)clip_image004和基准相位(把2clip_image006分成2N等份)clip_image008,从而使得每个相位都有一个量化值,基准相位就是相位量化的精度。

在基准时钟的一个周期内,输出信号相位增量为:

clip_image010

 

这样就可以把相位增量量化为:clip_image012,由于是整数,会产生量化误差

所以,就可以变换得到输出频率:clip_image014,可知,clip_image016clip_image004[1]是线性关系,clip_image018所起到的作用就是对基准时钟clip_image004[2]进行分频得到输出时钟,且有:

DDS的频率分辨率为:clip_image020 ,即此时clip_image018[1]=1,输出时钟频率最小。

 

DDS的基本工作流程就是通过相位的累加,得到当前的相位值,然后用当前的相位值(转换为ROM地址)进行查表,得到相应的幅值,然后输出。

相位累加器的输入,也称频率字,就是相位增量的量化值clip_image018[2]

其实最终有用的公式就是求频率字的这一个: clip_image023

DDS主要由相位累加器、相位调制器、ROM查找表和DAC。其中,相位调制器用于信号的相位调制,设计波形发生器时可以不用。

由于没有示波器,所以DAC部分也不设计,采用SignalTap II 观察。(示波器?YY下吧!)

DDS的基本原理框图如下;

clip_image024

ROM中的数据量由DAC位数决定,假设精度为10位,则ROM中需要存放一个周期clip_image026的1024个点的数据,而每个点的数据大小由此点的幅度值clip_image028确定。

对ROM的读取时钟频率就是clip_image016[1]。当然ROM的数据要由C或MATLAB得到啦,手动输入的话早就吐血了。

 

这次实验,采用的基准时钟是50MHZ,所取输出时钟是1KHZ。SignalTapII所得波形如下,这波形还算过得去啊:

clip_image029

程序部分倒是没有遇到什么问题,可是一开始居然挂在mif文件上,幸好在群里头遇到高人,用MATLAB重新弄了个,终于得到正确结果!

离场悲剧对DDS工作原理的解释可谓一针见血:

clip_image030

clip_image031

你可能感兴趣的:(DDS正弦信号发生器)