0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

DDS的基本原理 :相位累加器、存储的波形表、高速DAC

电子森林 来源:FPGA入门到精通 作者:FPGA入门到精通 2020-09-24 14:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在每届的全国大学生电子设计竞赛中,DDS作为信号源、以及通信里面本振、波形合成的基本方式,几乎成了必考的技能,虽然考察的角度不同,但核心都是一个 - 通过数字的方式得到你需要的某种频率的某种幅度的某种波形。

测试测量领域有另一个概念 - AWG(任意波形发生器)是跟DDS紧密相关的,波形发生器未必一定采用DDS的方式,但“任意”波形的产生就离不开DDS了。

DDS可以生成任意波形 - 比如心状波形

DDS的基本原理如下面的框图,主要由以下几个部分构成:

相位累加器 - 改变累加器的步进值,也就可以改变输出信号的频率;

存储的波形表 - 决定了你要产生的波形的形状,其深度和位数影响了输出信号的性能;

高速DAC -将数字的波形转换为模拟的电信号,其分辨率位数和转换率影响了能够产生的电信号的最高频率和信噪比、SFDR等参数

在DAC后面还有模拟调理电路 - 对生成的信号进行幅度调节和频率分量的筛选

DDS的构成

ADI公司有多种针对不同应用的DDS器件,其性能指标也不一样,由MCU通过SPI端口对DDS芯片进行编程即可得到你需要的波形、频率、幅度等。经典的器件AD9850、AD9833/37、AD9102等。

在具体的使用中仅一颗器件是不够的,也还是要需要设计专门的PCB来完成系统的功能- MCU + DDS +模拟链路+电源,一套下来,无论从制作成本还是调试的时间上都不见得是比较经济的方式,使用现成芯片也只能在其能力范围内,灵活性不高,用一颗器件应对不同可能的考题,是很难的。

最佳的方式自然是使用FPGA + DAC + 模拟链路的方式来实现。

用FPGA来实现所有的数字逻辑和存储功能

注:除了上图中的功能,按键输入控制和参数的输出显示乃至菜单,也都可以通过FPGA来实现

只要你了解FPGA的使用,理解了DDS的工作原理,通过非常简单的Verilog编程,就可以灵活地实现各种你需要的功能和性能。

能够实现DDS功能,对于FPGA内部资源的要求其实很小,只需要非常少的逻辑资源和有限的内部存储器就可以实现,一颗十几块RMB的FPGA只需要其不到1/5的资源就能够实现,而高速的DAC也非常便宜,尤其是采用R-2R的构成方式,20个电阻就可以构成10位/200Msps的高速DAC,这种方式生成的波形性能虽然相比商用的高速DAC(比如AD9740)有一定的降低,但足以满足电赛的需求。

R-2R DAC的工作原理

随着国产化器件的高速发展,使用国产的价廉物美的高速DAC也可以用来做DDS信号发生器。比如我们硬禾学堂刚刚验证过的3Peak公司的3PD5651,就是跟AD9740兼容的10位/125Msps的高速DAC,我们用它做成的高速DAC模块,实测转换率能够高达200Msps无压力。

当然,无论你使用FPGA + R2R还是FPGA + DAC,都需要你来设计PCB才能实现,如果实现高达100Msps的转换率,对PCB的设计能力也是有要求的。为了方便参加电赛的同学们在不需要制作PCB的情况下也能方便使用DDS,我们硬禾学堂专门制作了半成品的16管脚的模块 - FPGA最小系统模块、R2R高速DAC模块、基于AD9740的200Msps的高速DAC模块以及基于3PD5651的125Msps的模块。只要将FPGA模块和DAC模块简单地连接在一起,就可以方便地实现DDS的功能。

通过DDS生成的47KHz的正弦波

如果你嫌两个模块焊接都觉得麻烦,也可以使用下面的一体化的模块,可以通过USB端口对其供电和编程、UART通信,通过逻辑控制其中的参数,或由上位机通过UART对FPGA的逻辑进行参数配置。

用FPGA + R2R DAC构成的高速DDS AWG系统

是不是很方便?

下面我简单讲一下DDS的实现逻辑:

1 首先将你要实现的波形的一个周期的量化数据存放在FPGA内部的逻辑寄存器或块状RAM中,下面的代码就是存放一个64个10位数据来表征1/4周期正弦波的代码,由于正弦波4个象限的对称性,只需要1/4周期的数据即可,这样可以只使用1/4的逻辑或存储资源。

module lookup_tables(phase, sin_out);input [7:0] phase;output [9:0] sin_out; wire [9:0] sin_out; reg [5:0] address;wire [1:0] sel;wire [8:0] sine_table_out; reg [9:0] sine_onecycle_amp; //assign sin_out = {4'b0, sine_onecycle_amp[9:4]} + 9'hff; // 可以调节输出信号的幅度assign sin_out = sine_onecycle_amp[9:0]; assign sel = phase[7:6]; sin_table u_sin_table(address,sine_table_out); always @(sel or sine_table_out)begin case(sel) 2'b00: begin sine_onecycle_amp = 9'h1ff + sine_table_out[8:0]; address = phase[5:0]; end 2'b01: begin sine_onecycle_amp = 9'h1ff + sine_table_out[8:0]; address = ~phase[5:0]; end 2'b10: begin sine_onecycle_amp = 9'h1ff - sine_table_out[8:0]; address = phase[5:0]; end 2'b11: begin sine_onecycle_amp = 9'h1ff - sine_table_out[8:0]; address = ~ phase[5:0]; end endcaseend endmodule 1/4周期正弦波的波表代码: module sin_table(address,sin);output [8:0] sin; //实际波形表为9位分辨率(1/4周期)input [5:0] address; //64个点来生成1/4个周期的波形,完整的一个周期为256个点 reg [8:0] sin; always @(address) begin case(address) 6'h0: sin=9'h0; 6'h1: sin=9'hC; 6'h2: sin=9'h19; 6'h3: sin=9'h25; 6'h4: sin=9'h32; 6'h5: sin=9'h3E; 6'h6: sin=9'h4B; 6'h7: sin=9'h57; 6'h8: sin=9'h63; 6'h9: sin=9'h70; 6'ha: sin=9'h7C; 6'hb: sin=9'h88; 6'hc: sin=9'h94; 6'hd: sin=9'hA0; 6'he: sin=9'hAC; 6'hf: sin=9'hB8; 6'h10: sin=9'hC3; 6'h11: sin=9'hCF; 6'h12: sin=9'hDA; 6'h13: sin=9'hE6; 6'h14: sin=9'hF1; 6'h15: sin=9'hFC; 6'h16: sin=9'h107; 6'h17: sin=9'h111; 6'h18: sin=9'h11C; 6'h19: sin=9'h126; 6'h1a: sin=9'h130; 6'h1b: sin=9'h13A; 6'h1c: sin=9'h144; 6'h1d: sin=9'h14E; 6'h1e: sin=9'h157; 6'h1f: sin=9'h161; 6'h20: sin=9'h16A; 6'h21: sin=9'h172; 6'h22: sin=9'h17B; 6'h23: sin=9'h183; 6'h24: sin=9'h18B; 6'h25: sin=9'h193; 6'h26: sin=9'h19B; 6'h27: sin=9'h1A2; 6'h28: sin=9'h1A9; 6'h29: sin=9'h1B0; 6'h2a: sin=9'h1B7; 6'h2b: sin=9'h1BD; 6'h2c: sin=9'h1C3; 6'h2d: sin=9'h1C9; 6'h2e: sin=9'h1CE; 6'h2f: sin=9'h1D4; 6'h30: sin=9'h1D9; 6'h31: sin=9'h1DD; 6'h32: sin=9'h1E2; 6'h33: sin=9'h1E6; 6'h34: sin=9'h1E9; 6'h35: sin=9'h1ED; 6'h36: sin=9'h1F0; 6'h37: sin=9'h1F3; 6'h38: sin=9'h1F6; 6'h39: sin=9'h1F8; 6'h3a: sin=9'h1FA; 6'h3b: sin=9'h1FC; 6'h3c: sin=9'h1FD; 6'h3d: sin=9'h1FE; 6'h3e: sin=9'h1FF; 6'h3f: sin=9'h1FF; endcase endendmodule

2 用查找表的方式寻址一个波形的整个周期, phase(相位)即为波表的256个地址,sin_out为10位的数据输出:

module lookup_tables(phase, sin_out);input [7:0] phase;output [9:0] sin_out; wire [9:0] sin_out; reg [5:0] address;wire [1:0] sel;wire [8:0] sine_table_out; reg [9:0] sine_onecycle_amp; //assign sin_out = {4'b0, sine_onecycle_amp[9:4]} + 9'hff; // 可以调节输出信号的幅度assign sin_out = sine_onecycle_amp[9:0]; assign sel = phase[7:6]; sin_table u_sin_table(address,sine_table_out); always @(sel or sine_table_out)begin case(sel) 2'b00: begin sine_onecycle_amp = 9'h1ff + sine_table_out[8:0]; address = phase[5:0]; end 2'b01: begin sine_onecycle_amp = 9'h1ff + sine_table_out[8:0]; address = ~phase[5:0]; end 2'b10: begin sine_onecycle_amp = 9'h1ff - sine_table_out[8:0]; address = phase[5:0]; end 2'b11: begin sine_onecycle_amp = 9'h1ff - sine_table_out[8:0]; address = ~ phase[5:0]; end endcaseend endmodule

如果使用计数器作为地址输出,逐个地址的数据读出送给DAC,就可以得到频率为主时钟频率1/256的正弦波形。要改变输出频率,只有改变主时钟频率,这种方法得到“任意”频率是不可能的,另外对模拟链路的输出滤波器的设计也带来了巨大挑战。因此这就要下面的一步:

3 通过相位累加器来实现任意频率

比如下面的代码就能够通过一个24位的相位累加器,得到频率最小调节精度达到主时钟/2^24~ 主时钟/16M,比如主时钟为12MHz,则频率最小调节精度可以达到0.75Hz,相位累加器的值取27962就可以得到频率为20KHz的正弦波信号。

reg [23:0] phase_acc; // 24位相位累加器always @(posedge clk) phase_acc <= phase_acc + 27962; //在12MHz的主时钟时输出20KHz频率的波形lookup_tables u_lookup_table(.phase(phase_acc[23:16]), .sin_out(dac_data));

4 利用内部锁相环PLL得到高频率的内部时钟

无论是MCU还是FPGA,外部的时钟源提供的频率都不会太高,比如我们常用的12MHz的时钟,根据奈奎斯特定律,以及低通滤波器的频响特性得到的DDS输出的频率最高为12MHz * 40%~4.8MHz,如果想得到更高的输出频率,比如20MHz的正弦波形,那就需要DDS的主时钟高达50MHz,乃至更高,这样使得一个周期内的点数更多,比较理想的状态是一个周期的波形由10个以上的点构成,也就是20MHz的正弦波最好使用200MHz的主时钟。那就需要用到PLL,由输入的低频时钟得到内部的高频时钟用于DDS的逻辑和DAC的转换时钟。

在我们的系统中,选用了12MHz的输入频率,可以通过内部PLL得到192MHz(12MHz*16)的内部时钟频率,生成20MHz的正弦波毫无压力。

下面是PLL + 相位累加器的代码,PLL通过调用FPGA内部的IP核来实现:

wire clk_120m; //内部高倍时钟的名字cll_120m clk_pll u_clk_pll(.CLKI(clk), .CLKOP(clk_120m)); // 以Lattice的IPCore为例产生高速内部时钟 // 从12MHz产生120MHz,用以内部的逻辑以及DAC转换reg [23:0] phase_acc; // 24位相位累加器 always @(posedge clk_120m) phase_acc <= phase_acc + 2796; //在120MHz的主时钟时输出20KHz频率的波形lookup_tables u_lookup_table(.phase(phase_acc[23:16]), .sin_out(dac_data));

有细心的朋友会问,苏老师,您的模块上看不到常规使用的LC滤波器的影子啊?没有LPC滤波器如何滤除20MHz以上的混叠、非线性、杂散信号?

其实我们巧妙地利用了运算放大器的GBW和压摆率的指标,通过合理选择运算放大器,该放大器自身就能够实现对20MHz以内的信号进行线性放大,对20MHz以上的信号进行衰减的功能。

放大器的选用以及相关阻、容的值的选择可以根据具体的电路拓扑辅之以模拟仿真来实现,由于篇幅限制,这个在这里不再细说了。

原文标题:高效实战及电赛训练(6)- 如何快速制作DDS信号源?

文章出处:【微信公众号:FPGA入门到精通】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 信号源
    +关注

    关注

    5

    文章

    565

    浏览量

    47928
  • DDS
    DDS
    +关注

    关注

    22

    文章

    688

    浏览量

    157001

原文标题:高效实战及电赛训练(6)- 如何快速制作DDS信号源?

文章出处:【微信号:xiaojiaoyafpga,微信公众号:电子森林】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    存储器件的基本原理和技术演进

    存储器是构成数字系统的另一类重要器件。由于这些数字系统处理的数据量越来越大,运算速度越来越快,这就要求存储器件相应提高存储容量和存取速度,半导体存储器技术必须满足这些要求。
    的头像 发表于 05-13 11:44 388次阅读
    <b class='flag-5'>存储</b>器件的<b class='flag-5'>基本原理</b>和技术演进

    AD9832:25 MHz直接数字合成器与波形发生的深度解析

    深入探讨一款性能卓越的DDS芯片——AD9832。 文件下载: AD9832.pdf 一、AD9832芯片概述 AD9832是一款采用相位累加器、正弦查找和10位数模转换
    的头像 发表于 04-16 09:45 426次阅读

    时钟芯片的基本原理及行业应用

    随着数智化社会的不断发展,时钟芯片作为数字电路中控制时间的核心部件,已经成为智能设备不可分割的一部分。本文将对时钟芯片的基本原理及行业应用进行详细的分析,帮助大家更好地了解这一领域的发展趋势。一
    的头像 发表于 03-17 15:53 6348次阅读
    时钟芯片的<b class='flag-5'>基本原理</b>及行业应用

    探索MAX34427:SMBUS双通道高动态范围功率累加器

    探索MAX34427:SMBUS双通道高动态范围功率累加器 引言 在当今的电子设备设计中,精确测量功率消耗是至关重要的。无论是平板电脑、笔记本电脑、工作站,还是服务和VR/AR头戴设备,都需要
    的头像 发表于 02-26 16:30 315次阅读

    深入解析MAX34407:SMBus 4通道宽动态范围功率累加器

    深入解析MAX34407:SMBus 4通道宽动态范围功率累加器 在当今的电子设备设计中,精确测量和管理功率消耗至关重要。无论是平板电脑、超极本还是智能手机等便携式设备,都需要高效的功率监测解决方案
    的头像 发表于 01-13 14:30 399次阅读

    Spectrum仪器超高速任意波形发生新增DDS选项

    性能。该系列产品在AWG模式下可生成高达10 GS/s采样率、16位分辨率及3.9GH带宽的波形。在新开发的DDS模式下,63xx系列任意波形发生可在一个生成通道输出64路独立正弦波
    的头像 发表于 11-05 14:48 831次阅读
    Spectrum仪器超<b class='flag-5'>高速</b>任意<b class='flag-5'>波形</b>发生<b class='flag-5'>器</b>新增<b class='flag-5'>DDS</b>选项

    DDS39RFS10 产品技术文档总结

    DDS39RF10 和 'RFS10 是一系列双通道和单通道直接数字合成器,具有 16 位分辨率的数模转换DAC)。高采样率、输出频率范围、64 位 NCO 频率分辨率和任何具有
    的头像 发表于 10-24 10:56 1031次阅读
    <b class='flag-5'>DDS</b>39RFS10 产品技术文档总结

    DDS39RF12 与 DDS39RFS12 产品技术文档总结

    DDS39RF12 和 'RFS12 是一系列双通道和单通道直接数字合成器,具有 16 位分辨率的数模转换DAC)。高采样率、输出频率范围、64 位 NCO 频率分辨率和任何具有
    的头像 发表于 10-24 10:50 1784次阅读
    <b class='flag-5'>DDS</b>39RF12 与 <b class='flag-5'>DDS</b>39RFS12 产品技术文档总结

    DDS39RF10产品技术文档总结

    DDS39RF10 和 'RFS10 是一系列双通道和单通道直接数字合成器,具有 16 位分辨率的数模转换DAC)。高采样率、输出频率范围、64 位 NCO 频率分辨率和任何具有
    的头像 发表于 10-24 10:45 1334次阅读
    <b class='flag-5'>DDS</b>39RF10产品技术文档总结

    简述冲击电压发生基本原理

    冲击电压发生基本原理是 “电容并联充电、串联放电”,核心流程分三步: 先通过整流电路,将工频交流电转换为直流电,给多组电容器并联充电,储存足够电能并达到设定电压; 当充电完成后,触发高压开关使
    发表于 10-17 14:10

    普源信号发生DG5000直接数字合成(DDS

    了卓越的信号源解决方案。本文将深入解析其DDS架构的技术原理与核心优势。   一、DDS技术核心:数字化信号生成路径 普源DG5000的DDS架构基于数字信号处理原理,通过"相位-幅度
    的头像 发表于 10-17 11:27 724次阅读
    普源信号发生<b class='flag-5'>器</b>DG5000直接数字合成(<b class='flag-5'>DDS</b>)

    MD663B高速12位模数转换DAC)替代TI、ADI

    MD663B作为EUVIS的一款高速12位模数转换DAC),凭借其高达10GSPS的采样率与覆盖DC至5GHz的超宽带性能,能够精准实现高速信号的数字化转换,同时支持可调占空比、灵
    发表于 10-14 09:23

    信号发生产生正弦波的频率精准调节方法

    相位累加器。 特点:频率分辨率高(可达微赫兹级)、相位连续、易于程控,适用于精密测试场景。 2. 高速数模转换(DAC)与滤波 将离散的数
    的头像 发表于 08-27 17:49 1360次阅读
    信号发生<b class='flag-5'>器</b>产生正弦波的频率精准调节方法

    DS875替代AD9914/AD9958/AD9102/DAC38J84/LMK04828

    场景:MIMO系统、相干信号生成3. AD9102(集成DDS+波形存储器)- 差异化:- 内置SRAM存储任意波形,支持复杂调制- 180
    发表于 08-08 09:53

    Analog Devices Inc. AD9914S直接数字合成 (DDS)数据手册

    Analog Devices Inc. AD9914S直接数字合成 (DDS) 采用12位数模转换 (DAC)。AD9914S采用先进的DDS技术以及内部
    的头像 发表于 06-20 14:25 1116次阅读
    Analog Devices Inc. AD9914S直接数字合成 (<b class='flag-5'>DDS</b>)数据手册