直接数字频率合成器(direct digital synthesizer,dds),是一种频率合成技术,具有相对带宽大、频率转换速度快、相位分辨率高、连续性好等优点,在数字信号处理中常用于调制信号的生成,模块设计较为简单,频率、相位容易控制,多用于无线通信领域。
dds发生器的组成原理精髓在于对“模板”信号在单个周期内的采样,在系统工作频率一定的情况下,输出信号频率和周期内的取样点数有着直接的关系,举个栗子,假设基波信号 u(t)=sin(2pift+θ )=sin( 2pit ) ,* 在0~2π内
等分周期,在相同的系统时钟下采用不同的抽样点数进行抽样,如下图所示:
以*π/4 *为步进在单个周期内抽样
以*π/8 *为步进在单个周期内抽样
可以很明显看出,相同系统时钟下使用不同的抽样点数,可以得到不同的输出频率;基本组成架构如下,系统时钟驱动频率控制字(抽样间隔)逐次累加生成存储着基波数据rom的对应抽样地址,相位控制字主要用来决定基波的起始相位;
在fpga中开辟一块block ram用于存储对应的“模板”信号,也就是要输周期信号的一个完整周期,输出数据位数决定采样波形存储rom的宽度,数据深度与采样精度有关,累加器用于按频率控制字步长控制等间隔采样精度,相位寄存器用于锁定波形发生起始的位置,生成的周期数列作为rom表的驱动地址,完成对模板信号不同频率的抽样;
模块设计前需要先准备rom初始化文件“ .coe ”,生成方式可以使用工具或者matlab,下面是个人使用的一个基于matlab的coe文件生成代码;
clc;clear;close all; width = 10; depth = 2048; t = linspace(0,2*pi,depth); sin_val = sin(t); % %cos_val = cos(t); plot(t,sin_val,'--'); sin_val = fix(sin_val*(2^width-1)/2 + 0.5); %四舍五入 % %cos_val = fix(cos_val*(2^width-1)/2 + 0.5);sin_val(find(sin_val< 0))=sin_val(find(sin_val< 0)) + 2^width; %求补码 addr = [0:depth - 1]; file = fopen('sin1024.coe','wt'); fprintf(file,'memory_initialization_radix=10;n);fprintf(file,'memory_initialization_vector=n');for i=1:depth fprintf(file,'%04x : %04x;n',addr(i), sin_val(i)); end fprintf(file,'end;n'); fclose(file);模块设计为便于修改添加部分参数定义,在有不同位宽需求时可以只修改参数和rom模块ip即可实现;频率计算公式不在推到,直接给出:
其中k为频率控制字,n为相位累加器位宽,f0为模块输出频率,fc为系统时钟频率;举个例子,设系统时钟为50mhz,相位宽度10bit,要输出1mhz的信号,则k=(2^101)/50; *设计代码如下,使用时只需添加rom模块的ip,然后就可以例化工程使用:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// company: nhike// engineer: chenyivi// // create date: 2019/11/03 19:25:35// design name:dds_rom_ip // module name: dds_rom// project name: dds_rom_ip// target devices: zynq7010// tool versions:1.0 // description: wavefrom// // dependencies: // // revision:// revision 0.01 - file created// additional comments:// //////////////////////////////////////////////////////////////////////////////////module dds_rom( clk, //系统时钟 rst_n, //系统复位 freword, //频率控制参数 phaword, //初始相位控制参数 wavedataout //输出信号 ); parameter frequencybitwidth = 32; parameter phasebitwidth =10; parameter dataoutbitwidth= 10; input clk; input rst_n; input [frequencybitwidth-1:0] freword; input [phasebitwidth-1:0] phaword; output [dataoutbitwidth-1:0] wavedataout; reg [frequencybitwidth-1:0] freword_temp; reg [phasebitwidth-1:0] phaword_temp; wire [phasebitwidth-1:0] waveadddata; always@(posedge clk or negedge rst_n)begin //data latch. if(!rst_n)begin freword_temp <= 32'b0; phaword_temp <= 10'b0; end else begin freword_temp <= freword; phaword_temp <= phaword; end end reg [frequencybitwidth-1:0] cnt; always @(posedge clk or negedge rst_n)begin //sampling control. if(!rst_n) cnt <= 0; else cnt <= cnt + freword_temp; end assign waveadddata = cnt[frequencybitwidth-1:frequencybitwidth-(dataoutbitwidth + 1)] + phaword_temp; //data precision interception waverom waverombase ( .clka(clk), .addra(waveadddata), .douta(wavedataout) );endmodule下面是仿真结果和rtl:
以上实现均在vivado中验证,quartus使用方法与上述一致;
台积电八项技术领先全球
通俗PROTEL电子线路PCB设计图解教程
企业通信服务怎样才能驾驭好
五分钟了解全新皇冠智能节油系统技术
2020年6月,世界半导体产业销售额为345亿美元
DDS信号生成模块的Verilog实现
腾讯宣布战略大调整,全面拥抱产业互联网
浅谈SSR的输入控制方法和电路驱动
社区沟通对于区块链有什么意义
抗辐射精密SAR ADC的单事件效应性能
华为折叠屏手机5G下载速度高达1Gbps
气密检漏仪:如何预防能源浪费和环境污染
华为云实时音视频应用开发大赛
给刚入行的web前端工程师的建议
组装电脑的步骤
Trinamic TMC2300制定物联网和便携式设备标准
从小米离职创业8个月量产AR眼镜,他如何做到?
使用 Maxim 的 MAX16162为低压物联网应用提供强大保护
解析夸克分布式文件系统如何实现资源共享
2018年第三季度AMOLED手机面板出货总量为557万片