基于FPGA的DDS参考设计
目录
- 前言
- 一、DDS的原理
- 二、设计过程
- 1.DDS电路核心RTL
- 2.DDS开发板测试平台
- 作业回答
前言
DDS (Direct Digital Synthesizer)直接数字频率合成,能在一个很宽的频率范围内以快捷的速度, 提供大量高精度、高稳定度的频率信号。
DDS的原理简图:
// 实验作业:掌握DDS的原理,并且能够回答以下问题
//
// 1、如何根据CLK频率和输入频率字来设定输出波形的频率
// 2、补码格式能够直接送给DAC么?为什么仿真工具里观察数据有多种选项, 比如 unsigned/hex/binary/signed decimal 等等
// 3、如何自动生成波表ROM的verilog代码?
// 4、如何调节ROM的地址空间容量和数据字长?调节这些参数有什么意义和代价?
// 5、如何评价DDS输出波形的质量?
一、DDS的原理
它由相位累加器、只读存储器(ROM)、数模转换器(DAC)及低通平滑滤波器(LPF)构成.在时钟脉冲的控制下, 频率控制字 K 由累加器累加得到相应的相码 , 相码寻址 ROM 进行相码-幅码变换输出不同的幅度编码 ,再经过数模变换器得到相应的阶梯波, 最后经低通波器对阶梯波进行平滑, 即得到由频率控制字 K 决定的连续变化的输出波形 .
DDS 的频率控制字 K 由N 位的二进制数组成 ,即使用 N 位二进制累加器 ,故频率分辨率等于最低输出频率
只要 N 足够大, 即累加器的位数具有足够长度 ,总能得到所需的频率分辨率.输出频率由频率控制字决定
二、设计过程
1.DDS电路核心RTL
DDS核心电路RTL如下:
可以看出主要是一个DDS-ROM波表
代码如下
module DDS_CORE_ROM(CLK , // clockRA , // read addressRD ); // read data
input CLK;
input [9 :0] RA;
output [11 :0] RD;
reg [11 :0] RD;
always @ (posedge CLK)case(RA)10'd 0 :RD = #1 12'b 000000000000; // 0 0x0 10'd 1 :RD = #1 12'b 000000001100; // 12 0xC 10'd 2 :RD = #1 12'b 000000011001; // 25 0x19 10'd 3 :RD = #1 12'b 000000100101; // 37 0x25 10'd 4 :RD = #1 12'b 000000110010; // 50 0x32 ....10'd 1009 :RD = #1 12'b 111101000100; // -188 0xF44 10'd 1010 :RD = #1 12'b 111101010001; // -175 0xF51 10'd 1011 :RD = #1 12'b 111101011101; // -163 0xF5D 10'd 1012 :RD = #1 12'b 111101101010; // -150 0xF6A 10'd 1013 :RD = #1 12'b 111101110110; // -138 0xF76 10'd 1014 :RD = #1 12'b 111110000011; // -125 0xF83 10'd 1015 :RD = #1 12'b 111110010000; // -112 0xF90 10'd 1016 :RD = #1 12'b 111110011100; // -100 0xF9C 10'd 1017 :RD = #1 12'b 111110101001; // -87 0xFA9 10'd 1018 :RD = #1 12'b 111110110101; // -75 0xFB5 10'd 1019 :RD = #1 12'b 111111000010; // -62 0xFC2 10'd 1020 :RD = #1 12'b 111111001110; // -50 0xFCE 10'd 1021 :RD = #1 12'b 111111011011; // -37 0xFDB 10'd 1022 :RD = #1 12'b 111111100111; // -25 0xFE7 10'd 1023 :RD = #1 12'b 111111110100; // -12 0xFF4 default : RD = #1 0;endcase
endmodule
DDS电路代码如下
module dds_core_sin(CLK , // clock, posedge validRST , // reset, high level resetFWEN , // frequency word update enable, high level enableFWIN , // input frequency wordCLKOUT, // output clockSINOUT); // sine signal output, 2's complement formatinput CLK;
input RST;
input FWEN;
input [32-1:0] FWIN;
output[12-1:0] SINOUT;
output CLKOUT;parameter FW_WL = 32; // frequency word word length in bit
parameter RA_WL = 10; // rom address word length in bit
parameter RD_WL = 12; // rom data word word length in bitreg [FW_WL -1:0] fwin_R; // freq word DFF
reg [FW_WL -1:0] acc_R; // phase ACC DFF
reg [RA_WL -1:0] addr_R; // rom address DFF
reg [RD_WL -1:0] sinout_R; // sin wave output DFF
wire [RD_WL -1:0] romout_W; // rom data output wirealways @ (posedge CLK or posedge RST) beginif(RST) beginfwin_R <= 0;acc_R <= 0;addr_R <= 0;sinout_R <= 0;endelse begin// update fwin_R DFFif(FWEN)fwin_R <= #1 FWIN;elsefwin_R <= #1 fwin_R;// update acc_Racc_R <= #1 fwin_R + acc_R;// update addr_R, the acc_R high RA_WL is rom addressaddr_R <= acc_R[FW_WL-1:FW_WL-1-(RA_WL-1)]; // update output DFFsinout_R <= #1 romout_W;end
endDDS_CORE_ROM u_sinrom(.CLK (CLK ), // clock.RA (addr_R ), // read address.RD (romout_W )); // read dataassign SINOUT = sinout_R;
assign CLKOUT = CLK;endmodule // module dds_core
对该部分进行波形仿真,并以波形的形式观察输出结果
选择step或line形式
即可得到如下波形仿真结果
这是时域的近似波形
2.DDS开发板测试平台
本阶段目标是在开发板上运行DDS电路模块
1.使用按键来控制频率字的改变
2.设定频率的UP和DOWN按键,让DDS轮流输出1MHz,2MHz,…10MHz的时域波形
验证方法:使用Quartus的Signal TAP 观察DDS的输出波形
。 需要调节Signal TAP的观察格式为“有符号数的曲线”模式
按动button,采样频率从1MHz到10MHz变化,用signaltap观察波形
并
导出 Signal TAP 的捕获数据至电脑(生成List文件)
用UltraEdit的列操作模式编辑数据的格式,使之成为一个Matlab的变量定义文件
使用Matlab分析DDS生成的正弦信号的频谱纯度
1MHz
右键,生成list文件
将其中的数据复制粘贴到excel中,选择数据-分列,即可得到所需的sinout数据
将SINOUT列数据提出,复制到matlab中进行频域分析
调用函数,画出频域图形
如下
1M
2M
3M
4M
5M
6M
7M
8M
9M
10M
下图展示了在一个 5比特的相位累加器,4比特的波形ROM地址线宽的DDS中,相位增量为1、2、4的情况下,输出波形和相位累加器以及ROM地址的关系
可直观的理解DDS合成的原理,代码如下:
%
% USUAGE : demo the dds principle
% AUTHOR : duweitao AT cuc.edu.cn
% DATE : 2011-11-15
%
N_rom = 16; % number of rom data
N_plot = 32; % number of sine wave plot points
idx_N = [0:N_rom-1] ; % rom indexacc_WL = 5; % phase acc word length in bits
rom_WL = log2(N_rom); % wave table rom word length
acc_inc_val_1 = 1; % acc increase value
acc_inc_val_2 = 2;
acc_inc_val_3 = 4;
max_acc_val = 2^acc_WL - 1;
rom_data = sin(2*pi*idx_N/N_rom);acc_val_plot = zeros(3,N_plot);
idx_plot = [0:N_plot-1]; % plot index
acc_val_plot(1,:) = mod(idx_plot*acc_inc_val_1, max_acc_val);
acc_val_plot(2,:) = mod(idx_plot*acc_inc_val_2, max_acc_val);
acc_val_plot(3,:) = mod(idx_plot*acc_inc_val_3, max_acc_val);
wav_val_plot = zeros(3,N_plot);
rom_addr = bitshift(acc_val_plot,rom_WL-acc_WL);
wav_val_plot(1,:) = rom_data(rom_addr(1,:)+1);
wav_val_plot(2,:) = rom_data(rom_addr(2,:)+1);
wav_val_plot(3,:) = rom_data(rom_addr(3,:)+1);figure; subplot(3,1,1);
stem(idx_plot, wav_val_plot(1,:), 'fill');
title_str = sprintf('DDS Sine Wave, %dbit ACC, %dbit ROM ADDRESS, ACC INCREASE VAL is %d ', ...acc_WL, rom_WL, acc_inc_val_1);
title(title_str, 'FontSize', 14);
for(i_loop = 0:N_plot-1) text(i_loop +0.1,0.1*sign(wav_val_plot(1,i_loop+1)+1E-10),...num2str(acc_val_plot(1,i_loop+1)),'FontSize',12, 'color', 'r') ;text(i_loop +0.1,0.3*sign(wav_val_plot(1,i_loop+1)+1E-10),...num2str(rom_addr(1,i_loop+1)),'FontSize',12, 'color', 'k') ;
end;
subplot(3,1,2);
stem(idx_plot, wav_val_plot(2,:), 'fill');
title_str = sprintf('DDS Sine Wave, %dbit ACC, %dbit ROM ADDRESS, ACC INCREASE VAL is %d ', ...acc_WL, rom_WL, acc_inc_val_2);
title(title_str, 'FontSize', 14);
for(i_loop = 0:N_plot-1) text(i_loop +0.1,0.1*sign(wav_val_plot(2,i_loop+1)+1E-10),...num2str(acc_val_plot(1,i_loop+1)),'FontSize',12, 'color', 'r') ;text(i_loop +0.1,0.3*sign(wav_val_plot(2,i_loop+1)+1E-10),...num2str(rom_addr(2,i_loop+1)),'FontSize',12, 'color', 'k') ;
end;
subplot(3,1,3);
stem(idx_plot, wav_val_plot(3,:), 'fill');
title_str = sprintf('DDS Sine Wave, %dbit ACC, %dbit ROM ADDRESS, ACC INCREASE VAL is %d ', ...acc_WL, rom_WL, acc_inc_val_3);
title(title_str, 'FontSize', 14);
for(i_loop = 0:N_plot-1) text(i_loop +0.1,0.1*sign(wav_val_plot(3,i_loop+1)+1E-10),...num2str(acc_val_plot(3,i_loop+1)),'FontSize',12, 'color', 'r') ;text(i_loop +0.1,0.3*sign(wav_val_plot(3,i_loop+1)+1E-10),...num2str(rom_addr(3,i_loop+1)),'FontSize',12, 'color', 'k') ;
end;
作业回答
- CLK频率为fc,输出波形频率为f0,输入字频率为K,输入位宽为N,则
- 补码格式不能直接送给DAC,因为正数的补码是本身,而负数的补码是除第一位外其余按位取反再加1,不能直观的观察到负数的趋势。且AD9762是最大电压对应MAX值、0电压对应0值的无符号DAC器件,有符号补码需要先把高位取反再送给DAC
仿真工具里观察数据有很多种格式
这些表示不同的数制,只显示数字,而不会表现出趋势
这些格式可以显示出变化趋势,其中signed line chart (有符号的折线图)可以显示出正弦波
运行该函数,可以生成波表文件
只要改变输入信号的位宽即可
地址容量越大,字长越长,采样点就越多,正弦波最小频率就越小,输出的波形就越稳定
代价是:会造成很大的空间和资源消耗,延时会增大。
6. 所需要的频率衰减都比较少,而其他频率成分的衰减都低于-60dB,可以忽略,所以频谱纯度比较好
基于FPGA的DDS参考设计相关推荐
- 【FPGA实例】基于FPGA的DDS信号发生器设计
原文链接来源:www.runoob.com 基于FPGA的DDS信号发生器设计 DDS 原理 ------DDS(直接频率合成) 技术是根据奈奎斯特抽样定理及数字处理技术,把一系列的模拟信号进行不失真 ...
- 【FPGA学习】3-基于FPGA的DDS参考设计
目录 一.认识DDS 二.DDS设计 设计目标 目标1 DDS电路核心RTL 目标2 DDS开发板测试平台 三.DDS设计要点 四.实验作业 掌握DDS的原理,并且能够回答以下问题 一.认识DDS 定 ...
- 基于FPGA的DDS实现
DDS(Direct DIgital Synthesizer)-直接数字频率合成,是一种用于通过单个固定频率的参考时钟信号生成任意波形的频率合成器,被广泛用于测试测量仪表和通信系统中 一.DDS的主要 ...
- 基于FPGA的DDS算法实现(可调幅值,附ISE联合Modelsim仿真结果)
基于FPGA的DDS算法实现(附ISE联合Modelsim仿真结果) 声明:这篇博客是在充分参考前人成果的基础上写成的,如有侵权,请联系我作进一步处理.此外,这是我第一次写博客,描述不准确之处敬请指出 ...
- 基于FPGA的电子计算器设计(下)
今天给大侠带来基于FPGA的电子计算器设计,由于篇幅较长,分三篇.今天带来第三篇,下篇,话不多说,上货. 导读 本篇介绍了一个简单计算器的设计,基于 FPGA 硬件描述语言 Verilog HDL,系 ...
- 基于FPGA的数字时钟设计
基于FPGA的数字时钟设计 芯片与开发板 技术指标 1.具有正常的日时分秒技术显示功能,用七个数码管分别显示日,时,分,秒. 2.有按键校日,校时,校分,校秒. 3.利用led模拟整点报时功能. 4. ...
- 基于FPGA数字时钟的设计(附源码)
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注"FPGA技术江湖"微信公众号,在"闯荡江湖"."行侠仗义"栏里获取其 ...
- 基于FPGA的LSTM加速器设计(MNIST数据集为例)
摘要 本文以MNIST手写数字识别任务为例,使用FPGA搭建了一个LSTM网络加速器,并选取MNIST数据集中的10张图片,通过vivado软件进行仿真验证.实验结果表明,本文设计的基于FPGA的LS ...
- 基于FPGA的DDS信号发生器
基于FPGA的DDS信号发生器 两个礼拜前就像写这个文档了,但是一直鸽到现在,主要是人摆了.还有个技术上的原因是,我想用串口屏显示波形,在串口调试助手上返回的数据是对的,但是发到串口屏上啥反应 ...
最新文章
- linux检查文件一致性,3.20 fsck(检查并修复Linux 文件系统)
- VS2017新建视图中文乱码解决办法
- 图解基本C语言程序一
- 程序员的半衰期只有15年?
- java输出的文本内容不对_java 字符串写入文件后再读出不一样? 有什么解决办法吗?...
- LintCode_408 二进制求和
- python计算器代码,Python实现两款计算器功能示例
- [绍棠] Xcode9无线调试教程
- jemalloc java_jemalloc源码结构分析
- 【Windows】Windows如何使用注册表修改软件默认安装路径?
- 联想拯救者y9000k和y9000p的区别
- c语言中用括号将花括号括起来给变量赋值
- 问题:现有12个外形相同的小球,只有其中一个小球质量不同(不能确定较重还是较轻),请用天平找出是哪个小球不同,而且还要找出究竟是轻是重?条件:只能称三次
- teradata数据库--常用的数据字典表
- 文件IO——标准IO和文件IO的区别
- 我是培训机构出身的程序员,但不敢告诉任何人 !
- linux开机启动动画
- ASP.NET Core IP白名单
- 中国邮政集团邮编查询
- PHPCMS系统使用的弹出窗口插件artDialog
热门文章
- Java学习笔记:web2
- 衣服、商品、商城网站模板首页,仿U袋网,vue+elementui简洁实现(二)
- 【ECharts】 # ECharts入门学习
- WPS中的段落布局行号数字怎么取消
- npm ERR! code ETIMEDOUT npm ERR! errno ETIMEDOUT npm ERR! network 问题小记
- 18年程序员生涯,读了200多本编程书,挑出一些精华分享给大家
- 嵌入式Linux学习笔记(1-1)——linux系统搭建
- sso单点登陆实现过程汇总记录
- 办公室服务器文件管理制度,办公室文件管理制度
- 1153天数据告诉你黄山云海在哪些天容易遇见