基于FPGA的DDS 信号发生器(三)
控制正弦波的频率和相位(频率控制字+相位控制字)
- 1 DDS原理
- 1.1 书上的解释
- 1.2 自己的理解
- 2 DDS IP的参数设置
- 3 源码
- 3.1 顶层文件
- 3.2 频率控制字模块
- 3.3 相位控制字模块
- 3.4 testbench文件
- 4 结果
1 DDS原理
1.1 书上的解释
DDS(Direct Digital Synthesizer)技术是一种全新的频率合成方法,是从相位概念出发直接合成所需波形的一种频率合成技术,通过控制相位的变化速度,直接产生各种不同频率、不同波形信号的一种频率合成方法。
系统的核心是相位累加器,其内容会在每个时钟周期(system clock)更新。相位累加器每次更新时,存储在Δ相位寄存器中的数字字M就会累加至相位寄存器中的数字。假设Δ相位寄存器中的数字为00…01(即M=1),相位累加器中的初始内容为00…00。相位累加器每个时钟周期都会按00…01(M=1)更新。如果累加器为32位宽,则在相位累加器返回至00…00前需要2^32(超过40亿)个时钟周期,周期会不断重复。
相位累加器的截断输出用作正弦(或余弦)查找表的地址。查找表中的每个地址均对应正弦
波的从0°到360°的一个相位点。查找表包括一个完整正弦波周期的相应数字幅度信息。
(实际上,只需要90°的数据,因为两个MSB中包含了正交数据)。因此,查找表可将相位
累加器的相位信息映射至数字幅度字,进而驱动DAC。图3用图形化的“相位轮”显示了这
一情况。
考虑n = 32,M = 1的情况。相位累加器会逐步执行2^ 32 (2^n/M)个可能的输出中的每一个,直至溢出并重新开始。相应的输出正弦波频率等于输入时钟频率 2 ^ 32分频。若M=2,相位累加器寄存器就会以两倍的速度“滚动”计算,输出频率也会增加一倍。以上内容可总结如下:
1.2 自己的理解
DDS系统主要由相位累加器、波形存储器、数模(D/A)转换器和低通滤波器等四个大的结构组成,其结构框图如下图所示。
参考时钟:
图中,参考频率f_clk为固定值,一般我们选择系统时钟(system clock),这里设置的是100MHz。
频率控制字:
用来调整输出信号的频率。如何根据参考频率得到输出频率,DDS IP的官方文档给出了相应公式。
相位控制字:
相位累加器:
由N位加法器与N位累加寄存器构成,它根据频率控制字k,完成相位值的累加,并将此累加值输入到波形存储器中。
波形存储器:
将相位累积器的值作为当地址,查找与相位值对应的信号数据,输出到D/A转换器。
D/A转换器:
将波形存储器输出的数字量转换为与之对应的模拟量。
低通滤波器:
由于D/A转换器存在量化误差,输出波形中存在混叠,需要在输出端使用低通滤波器进行滤波,提高信号的输出性能。
2 DDS IP的参数设置
需要注意的是,上面的频率分辨率(frequency resolution)的值是算出来的,这个值必须和summer的频率分辨率保持一致。100M/(2^20)=95.36743
3 源码
程序结构
3.1 顶层文件
`timescale 1ns / 1psmodule top(input sys_clk ,// 系统时钟input rst_n ,// 系统复位input [1:0] key_PINC ,// 频率控制字对应的按键input [1:0] key_POFF // 相位控制字对应的按键);//-----------频率控制字模块
wire [23:0] PINC ; //频率字
Fword_set Fword_set_inst(//input.clk (sys_clk ),.rst_n (rst_n ),.key_PINC (key_PINC ),//output.PINC (PINC ));//-----------相位控制字模块wire [23:0] POFF ; //相位字
POFF_set POFF_set_inst(//input.clk (sys_clk ) ,.rst_n (rst_n ) ,.key_POFF (key_POFF ) ,//output.POFF (POFF ));//-------------DDS模块
//input
wire [0:0] fre_ctrl_word_en ; //output
wire [0:0] m_axis_data_tvalid ;
wire [47:0] m_axis_data_tdata ;
wire [0:0] m_axis_phase_tvalid ;
wire [23:0] m_axis_phase_tdata ;assign fre_ctrl_word_en=1'b1;dds_sin dds_sin_inst (.aclk (sys_clk ), // input wire aclk.s_axis_config_tvalid (fre_ctrl_word_en ), // input wire s_axis_config_tvalid.s_axis_config_tdata ({POFF,PINC} ), // input wire [47 : 0] s_axis_config_tdata.m_axis_data_tvalid (m_axis_data_tvalid ), // output wire m_axis_data_tvalid.m_axis_data_tdata (m_axis_data_tdata ), // output wire [47 : 0] m_axis_data_tdata.m_axis_phase_tvalid (m_axis_phase_tvalid ), // output wire m_axis_phase_tvalid.m_axis_phase_tdata (m_axis_phase_tdata ) // output wire [23 : 0] m_axis_phase_tdata
); endmodule
3.2 频率控制字模块
`timescale 1ns / 1ps
//
// 通过按键来选择对应的频率控制字,进而选择对应的信号频率
//module Fword_set(input clk ,input rst_n ,input [1:0] key_PINC ,output reg [23:0] PINC);//always@(posedge clk or negedge rst_n)
//begin
// if(!rst_n)
// key_sel <= 4'd0;
// else
// key_sel <= key_sel;
//end// The output frequency(f_out ) , of the DDS waveform is a function of the system clock frequency(f_clk ) .
// the phase width, that is, number of bits (B ) in the phase accumulator
// and the phase increment value (deta_theta) .
// The output frequency in Hertz is defined by:f_out=f_clk*deta_theta/(2^B)
// fre_ctrl_word是如何确定的?
// 根据IP核的summery, phase width=20bits Frequency per channel=100MHz
// 输出频率的计算公式f_out=f_clk*deta_theta/(2^B)=100M* 104857/(2^20 )= 10M
always@(*)
begincase(key_PINC)0: PINC <= 'h28f5; //1Mhz 10485 每次相位增加的值 deta_theta1: PINC <= 'h51eb; //2Mhz 209712: PINC <= 'ha3d7; //4Mhz 419433: PINC <= 'h19999; //10Mhz 104857endcase
endendmodule
3.3 相位控制字模块
`timescale 1ns / 1ps
//
// 通过按键来选择对应的相位控制字,进而选择对应的信号初始相位
/module POFF_set(input clk ,input rst_n ,input [1:0] key_POFF ,output [23:0] POFF);//always@(posedge clk or negedge rst_n)
//begin
// if(!rst_n)
// key_sel <= 4'd0;
// else
// key_sel <= key_sel;
//end// 根据IP核的summery, phase_width=20bits Frequency per channel=100MHz
// 输出相位的计算公式:POFF=phase*phase_modulus/360
// phase:想要输出的相位,输入0~360即可
// phase_modulus:相位系数为2^phase_width-1=2^20-1,
// phase_width即相位位宽,在生成IP的summary可以查看
reg [8:0] phase; //0-360 always@(*)
begincase(key_POFF)0: phase <= 'h0; //01: phase <= 'h5a; //902: phase <= 'hb4; //1803: phase <= 'h10e; //270endcase
endassign POFF=phase*1048575/360;endmodule
3.4 testbench文件
`timescale 1ns / 1psmodule sim_top;reg sys_clk ;reg rst_n ;reg [1:0] key_PINC; reg [1:0] key_POFF; //例化源文件top top_inst(.sys_clk (sys_clk ),.rst_n (rst_n ),.key_PINC (key_PINC ),.key_POFF (key_POFF ));initialbegin//初始化sys_clk=0;rst_n=0;key_PINC=2'd0;key_POFF=2'd0; //30#100rst_n=1;key_PINC=0; //1Mhz 10485 每次相位增加的值 deta_theta#4000key_PINC=1; //2Mhz 20971#4000key_PINC=2; //4Mhz 41943#4000key_PINC=3; //10Mhz 104857#4000key_POFF=1; //60#4000key_POFF=2; //90#4000key_POFF=3; //180end// create clock;always #5 sys_clk=~sys_clk;//每次间隔5ns,取一次反,也就是周期为10ns,所以频率为100MHzendmodule
4 结果
基于FPGA的DDS 信号发生器(三)相关推荐
- 基于FPGA的DDS信号发生器
基于FPGA的DDS信号发生器 两个礼拜前就像写这个文档了,但是一直鸽到现在,主要是人摆了.还有个技术上的原因是,我想用串口屏显示波形,在串口调试助手上返回的数据是对的,但是发到串口屏上啥反应 ...
- 【FPGA实例】基于FPGA的DDS信号发生器设计
原文链接来源:www.runoob.com 基于FPGA的DDS信号发生器设计 DDS 原理 ------DDS(直接频率合成) 技术是根据奈奎斯特抽样定理及数字处理技术,把一系列的模拟信号进行不失真 ...
- CASE_05 基于FPGA的DDS信号发生器
该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2 DDS原理与方案 2.1 方案一:基于CORD ...
- 基于FPGA的DDS信号发生器(vivado版本)
一.设计目标 根据DDS技术原理,在vavido上编写DDS信号源硬件逻辑语言,实现频率.幅度.波形可调的信号源发生器. 频率调节分为11个档位,分别是:1Hz.10Hz.100Hz.500Hz.1k ...
- 基于FPGA的DDS 信号发生器(一)
用DDS求角度的正弦值 1 DDS原理 1.1 书上的解释 1.2 自己的理解 2 DDS IP的参数设置 3 Vivado实现 3.1 编写源文件 3.2 编写testbench文件 3.3 仿真结 ...
- 国产紫光FPGA实现DDS信号发生器
前言 随着信息技术的迅速发展,FPGA作为半定制电路具有可重复编程.计算能力强等优势,进入人们的视野,并在未来将发挥出越来越重要的作用. 作为电子专业的大三学生,我们小组在老师的带领下对现有国产FPG ...
- 基于FPGA实现DDS正弦波发生器
名言:学无止境. 1 开发环境 操作系统:win7 开发软件:ISE14.7 硬件平台:Xilinx FPGA Spartan6 2 DDS简介 DDS(Direct Digital Synthesi ...
- 国产紫光FPGA实现DDS信号发生器(ModelSim仿真)
简介 本文主要根据利用紫光同创软件联合ModelSim对DDS信号发生器进行仿真.前序步骤(DDS实现过程)见 国产紫光FPGA实现DDS信号发生器_窃听龙吟的博客-CSDN博客 该博客. 一.创建仿 ...
- 基于FPGA的DDS算法实现(可调幅值,附ISE联合Modelsim仿真结果)
基于FPGA的DDS算法实现(附ISE联合Modelsim仿真结果) 声明:这篇博客是在充分参考前人成果的基础上写成的,如有侵权,请联系我作进一步处理.此外,这是我第一次写博客,描述不准确之处敬请指出 ...
最新文章
- 抓包工具 tcpdump 用法说明
- 汇总|C++常见知识点总结,涉及文本输出、排序、生成随机数、异常处理、关联容器、printf重定向、sprintf用法、cout重定向
- 任艳频老师关于信息与大数据课题组的讨论材料的意见
- spaugment--生成最小二乘增广矩阵
- win7任务栏计算机图标,Win7系统任务栏怎么添加显示桌面图标 显示桌面图标如何放到win7任务栏...
- UltraWebGrid控件在开发ASP.NET项目中的使用方法和技巧(转)
- IdentityServer4系列 | 资源密码凭证模式
- 【SpringCloud从0到6】 第二节:Spring Cloud 和 Dubbo
- java中JTextArea类_Swing JTextArea类
- Linux-sed command
- android指定分享到qq,Android使用系统分享文件给微信,QQ指定的用户
- Atitit 软件与开发的未来趋势 attilax总结 1.1. Sdx软件重构世界 软件定义未来	1 1.2. 《软件和信息技术服务业发展规划(2016-2020年)》(	2 1.3. Iot物联
- fork函数结果分析
- Win10自带微软输入法消失解决办法(无法显示输入法图标)
- c++语言编程软件视频教程下载,C++编程开发全套视频教程下载
- 如何更改Windows桌面文件夹路径
- 您未被授权查看该页 错误 401.3
- Mac系统如何运行Windows exe程序?mac打开exe文件方法教程
- Python爬虫之xlml解析库
- 华为 Mate 40 系⁠列详细参数对比,Mate 40\40Pro\40Pro+\40RS