上述领域中,如雷达,射频等对产生的信号质量要求极高。DDS(Direct Digital Frequency Synthesis)直接频率数字技术的提出,为这些领域提供了有效的解决方案。
直接式频率合成技术(Direct Analog Frequency Synthesis,DAFS)是一种早期的频率合成技术,原理简单,易于实现。它由模拟振荡器产生参考频率源,再经谐波发生器产生一系列谐波,然后经混频、分频和滤波等处理产生大量的离散频率。
DAFS的优点是频率转换时间短、相位噪声低,但由于采用大量的混频、分频、倍频和滤波等模拟硬件设备,使频率合成器的体积庞大、结构复杂、容易产生杂散分量,不易调试,大多数硬件的非线性影响难于抑制。目前使用较少,在一些雷达信号的产生中此法仍在使用。
锁相环频率合成技术:锁相环频率合成(Phase Locked Loop,PLL)所使用的电路较DAFS简单,它主要是将含有噪声的振荡器放在锁相环路内使它的相位锁定在希望的信号上,从而是振荡器本身的噪声被抑制,使它的输出频谱大大提纯。其中锁相环是此频率合成技术的核心,下图为单个锁相环电路频率合成器的原理图。为了得到更高的精度和稳定度,以及较大的频率范围和较小的频率间隔,常采用多个锁相环。
相对于DAFS,PLL有很多优点:能很好的捕捉和跟踪所需要的频率,对杂散分量抑制较好,且使用较少的滤波器,电路体积小,功耗小,且易于集成,适合大规模生产,目前这种技术在频率合成中广泛应用。但PLL的缺点是频率转换稳定时间长,实时性不高,单个锁相环的频率间隔不能做得很小,压控振荡器产生的噪声也很大。
直接数字频率合成技术:
1971年3月,Tierney,Rader和Gold首先提出了以全数字技术,从相位概念出发直接合成所需波形的一种新的频率合成原理,称之为直接数字频率合成(DDS)
DDS技术具有很多的优点:
(1)频率分辨率较高,一般在0.01Hz左右,有的能做到1uHz,甚至更小;
(2)转换时间快,系统无反馈环节,其开环结构使得频率转换时间很短,最快可以达到纳秒级;
(3)具有输出任意波形的能力,只要将任意波形数据加载到ROM中,通过DAC输出,即可得到ROM存储的任意波形;
(4)具有调制能力,DDS是相位控制系统,有利于各种调制功能。DDS技术的这些优点,使它成为卫星定位、移动通信、数字通信等系统中信号源的首选。
接下来,我们来到这篇文章重点,DDS ip核部分讲解,直接数字频率合成(Direct Digital Synthesis,DDS)是一种通过数字信号处理技术生成的高精度、高分辨率模拟波形的技术。并支持灵活的频率切换和相位控制。
(1)累加器:通过频率控制字和相位控制字的累加,来取出波形数据表中相对应位置的数据。
(2)波形数据表:存储波形数据(我们主要采取matllab工具生成波形数据)。
(3)数模转换器:将离散数据变成连续的。
(4)低通滤波器:对数模转换器出来的波形进行滤波,达到一个平滑波形的作用。
了解了DDS的组成部分,我们再来具体看看,DDS是怎样生成任意频率以及任意相位的波形。我们从时域采样的角度去理解,有这样一个正弦波:
我们将它存入波形数据表(理想情况,实际上不可能存在数据这么光滑的信号,增加rom存储深度,只能提高,不能达到完美)中,然后前面的频率控制字和相位控制字进行累加,就会得到图·中的样子,然后超出频率控制字的位宽就会重头开始,看下图:
然后经过后续的操作就可以得到完整的正弦波,由于ROM表不可能做到无限深(这也会导致一部分误差,文末会提),我们可以做到在需求误差范围内,选取ROM表深度,达到能解决需求的方案。那么频率又是如何变换的呢?
让读者读懂才是我写这个原理的目的,接下来,换个方式去讲解频率如何改变:
DDS主要还是从波形数据表读取波形数据,而怎样去读,还是看前面累加出来的地址(相位控制字和频率控制字),如果频率控制字步进起初如左图,可能读者会疑问这个不应该和之前是离散的,对的,证明读的过程中你是有思考的,和前面讲解的对比去看,很不错!不过,再看图想想,图中蓝色的就是离散的,至于弄成连续的一条直线只是为了方便理解,以及和后面的仿真图好参照去理解。回到频率变换那块,如果,我们将频率控制字增大,那么它每次累加的更多,转换到直线上去理解,就是更加陡峭,遍历完一个波形表更加快,那么出来的波形相较之前的波形频率更大。然后我们再看仿真图:
rom_index即为查找地址,可看到将其的值映射到二维坐标轴上,不就是离散的。然后我们将波形转换为analog,如下:
可以着重看rom_index和q1部分,注意因为这里是wave format中选了analog linear所以看到的正弦波较为光滑,实际还是要靠低通滤波器的,如果将其设置为hold,如下:
这下就和我们前面讲解的一致了。相位控制字可以让rom_index初始不为零,即可达到相位差。 下面再来看看这个公式:
据此,我们可以选择在我们的DDS模块设置输入频率等一切参数,达到输出不同频率的信号。然后,谈谈我们怎么做到可移植性强,我们并没有用厂商提供的rom ip进行波形文件的存储,而是利用$readmemb()这个函数读取波形文件.txt,在综合的时候就将数值初始化进去,而且由于这个方法使得我们的资源利用更加少。废话不多说,直接上图:
可以明显看到我们资源利用率相比较来说是比较有优势的。至于IO多的原因是,我布局布线的顶层比利用ROM IP多几个输入、输出端口。
如果读者是入门者,并在之前写的时候只考虑实现,而不考虑资源利用,后面在学习过程中,可以再在实现后再优化下,看看资源利用率是否还可再降。
因为在如今这个卷的时代如果性能卷不上去,可以想想卷如何利用较少的资源,这个成功的结果往往会让我们的产品成本大大下降。所以设计时以及设计完没有优化资源的习惯,现在知道其重要性可以开始养成了。
然后我们再来谈谈何为DDS的误差(这里只讨论高位截断造成的误差)。
为了更小的频率分辨率,频率控制字的位宽越大越好。但是如果超出了查找地址位宽后,该如何去寻址呢?这是我们采取高位截断的方法(频率控制字位宽32,相位控制字位宽12,波形数据表位宽12来举例)
这是我们高位截断的verilog实现方法。那么看到这个你是否有疑问,为什么是高位截断,而不是低位截断。首先想给爱于思考的读者竖起大拇指。紧接着,且听我娓娓道来。比方说你现在手上有1kg的百元人民币,和1kg的1元人民币,但是你的行李箱只够装下1kg,这时答案也不用我多说吧,显而易见,肯定选择带走百元人民币(价值高)。那么言归正传,高位在此处的作用比起低位的作用大,所以我们采取高位截断,保留高位信息。但由于我们进行了这个操作,会导致在一定程度上有无法避免的误差。而且由于某些波形数据是浮点数,而FPGA本就不能很好的处理浮点数,也会导致误差(其他原因导致的误差本文暂不讨论)
这是我们封装的DDS IP(目前支持10个波形数据表,获取源码也可自己根据情况自行添加)
下面为一部分verilog源码:内部Rom
通过二维数据以及$readmemb()系统函数,实现波形文件的读取,相当于一个简易的Rom IP。而不直接调用Rom IP节省极大的资源。
相位累加器:
通过不断的累加,来改变rom的寻址地址,实现波形数据的输出。在看过我们的部分源码后,可以发现我们always块是没有使用全局复位的,这是为了节省我们的资源。
整个源码框架:
然后,看下我们的效果图(板卡MLK-H3,DAC模块为MLK_FMC_DAQ002):
到此效果展示并未完,开头我们曾提到可移植性强,绝不是随便说说而已,是经过验证的(基于国产FPGA安陆的PH1A180SF676,MLK-H10)。效果图如下:
注意:在直接利用我们的demo进行验证时,请记得改IP里波形文件的绝对路径,保持和你所使用的电脑路径一致,matlab波形生成文件只提供正弦波,方波,三角波demo。
工程下载地址:
提取码: 1111