FPGA应用技巧和诀窍:模拟DDS(调频调相)
DDS是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写,是一项关键的数字化技术。与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点。先说明一下,要产生真正的模拟信号,需要接A/D转换芯片,这次主要是产生FPGA发出的数字信号(在modelsim中以模拟量查看)。
首先先看一下整体的连接图:
其中sin_rom模块是存储正弦波形数据的rom(rom调用quartusip核),深度256,宽度8位,我们用产生好的mif文件(可以利用mif_make2010这个软件产生,也可以利用c语言matlab产生但要注意文件格式)去初始化rom,假如我们采用mif_make2010产生mif文件,波形如下:
其中行坐标是是0-255,表示rom的256个存储单元,纵坐标表示的是每个存储单元的数值大小,波峰为0xFF;波谷为0x00,即我们依次从rom的第一个地址读,一直读完,从rom中读出的数据就是正弦波形的数字量表示。所以程序中我们只需控制地址的产生就可以达到调相调频的目的,所以设置了gen_add模块。
调相原理:由于0-255个单元对应的相位是0-360度,所以我们只需调整初始相位的单元就可以到达调相的目的,例如假如初始单元就是0,那我们的波形就是标准的正弦波,如果我们的初始单元为64,那我们的波形就是余弦波。
调频原理:我们调整地址产生的频率快慢就可以调整波形频率。假如我们时钟50M,每个时钟上升沿从rom中读取一个数据,由于一个周期的sin波形是有256个点组成,所以我们相当于256个时钟产生一个完整的sin波,即周期为256*(1/50M);频率为50M/256;
从频率表达式我们可以看出波形的频率一是跟时钟有关,二是跟存储的rom单元数有关,我们上述采用的是256个单元,所以产生的频率为50M/256=195.3Khz,这是我们顺序从rom中读取数据,即地址每个时钟加一产生的频率,若我们的每个时钟地址加2(步长),则我们的产生的频率则为原来的2倍,即2*50M/256=195.3*2。但我们想一想如果我们的的rom深度数256,那产生的频率分辨率最高也就是50M/256即195.3Khz,,而且我们产生的频率只能是195.3Khz的整数倍,这个有点难以接受。我们自然想到可以增大rom的位数来提高分标率,这个当然可以,但是我们rom都是提前固定的,有没有其他办法呢?
假如我们设定一个32的寄存器address_temp,我们只把address_temp的前八位真正的交给rom读数据,这样相当于减慢了地址的变化速度,但我们实际上提高了频率分辨率,现在的分辨率为50M/2^32=0.011hz,同样我们产生的频率只能是0.011hz的倍数,但是我们可以认为任何整数都可是0.011的倍数,假设步长为SPAN_fre,则产生的频率为SPAN_fre*50M/2^32;这有点类似之前的应用篇(三)精准分频,事实上它的原理就来源于此。
同理我们根据频率来调节步长即可。
程序如下:
仿真结果如下:
从结果我们可以看为起始相位为90度即cos波形,(虽然我们rom中存储的是sin波形的数据),频率为500k,注意data的显示格式是一定设置为无符号的模拟量。当我们把phase改为0时结果如下:
可以看出此时起始相位为0度,为sin波形。
- 用大电流LDO为FPGA供电需要低噪声、低压差和快速瞬态响应(08-17)
- 基于FPGA 的谐波电压源离散域建模与仿真(01-30)
- 基于FPGA的VRLA蓄电池测试系统设计(06-08)
- 降低从中间总线电压直接为低电压处理器和FPGA供电的风险(10-12)
- FPGA和功能强大的DSP的运动控制卡设计(03-27)
- DE0-Nano-SoC 套件 / Atlas-SoC 套件(10-30)