控制正弦波的频率和相位(频率控制字+相位控制字)

  • 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 信号发生器(三)相关推荐

  1. 基于FPGA的DDS信号发生器

    基于FPGA的DDS信号发生器     两个礼拜前就像写这个文档了,但是一直鸽到现在,主要是人摆了.还有个技术上的原因是,我想用串口屏显示波形,在串口调试助手上返回的数据是对的,但是发到串口屏上啥反应 ...

  2. 【FPGA实例】基于FPGA的DDS信号发生器设计

    原文链接来源:www.runoob.com 基于FPGA的DDS信号发生器设计 DDS 原理 ------DDS(直接频率合成) 技术是根据奈奎斯特抽样定理及数字处理技术,把一系列的模拟信号进行不失真 ...

  3. CASE_05 基于FPGA的DDS信号发生器

             该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2 DDS原理与方案 2.1 方案一:基于CORD ...

  4. 基于FPGA的DDS信号发生器(vivado版本)

    一.设计目标 根据DDS技术原理,在vavido上编写DDS信号源硬件逻辑语言,实现频率.幅度.波形可调的信号源发生器. 频率调节分为11个档位,分别是:1Hz.10Hz.100Hz.500Hz.1k ...

  5. 基于FPGA的DDS 信号发生器(一)

    用DDS求角度的正弦值 1 DDS原理 1.1 书上的解释 1.2 自己的理解 2 DDS IP的参数设置 3 Vivado实现 3.1 编写源文件 3.2 编写testbench文件 3.3 仿真结 ...

  6. 国产紫光FPGA实现DDS信号发生器

    前言 随着信息技术的迅速发展,FPGA作为半定制电路具有可重复编程.计算能力强等优势,进入人们的视野,并在未来将发挥出越来越重要的作用. 作为电子专业的大三学生,我们小组在老师的带领下对现有国产FPG ...

  7. 基于FPGA实现DDS正弦波发生器

    名言:学无止境. 1 开发环境 操作系统:win7 开发软件:ISE14.7 硬件平台:Xilinx FPGA Spartan6 2 DDS简介 DDS(Direct Digital Synthesi ...

  8. 国产紫光FPGA实现DDS信号发生器(ModelSim仿真)

    简介 本文主要根据利用紫光同创软件联合ModelSim对DDS信号发生器进行仿真.前序步骤(DDS实现过程)见 国产紫光FPGA实现DDS信号发生器_窃听龙吟的博客-CSDN博客 该博客. 一.创建仿 ...

  9. 基于FPGA的DDS算法实现(可调幅值,附ISE联合Modelsim仿真结果)

    基于FPGA的DDS算法实现(附ISE联合Modelsim仿真结果) 声明:这篇博客是在充分参考前人成果的基础上写成的,如有侵权,请联系我作进一步处理.此外,这是我第一次写博客,描述不准确之处敬请指出 ...

最新文章

  1. 抓包工具 tcpdump 用法说明
  2. 汇总|C++常见知识点总结,涉及文本输出、排序、生成随机数、异常处理、关联容器、printf重定向、sprintf用法、cout重定向
  3. 任艳频老师关于信息与大数据课题组的讨论材料的意见
  4. spaugment--生成最小二乘增广矩阵
  5. win7任务栏计算机图标,Win7系统任务栏怎么添加显示桌面图标 显示桌面图标如何放到win7任务栏...
  6. UltraWebGrid控件在开发ASP.NET项目中的使用方法和技巧(转)
  7. IdentityServer4系列 | 资源密码凭证模式
  8. 【SpringCloud从0到6】 第二节:Spring Cloud 和 Dubbo
  9. java中JTextArea类_Swing JTextArea类
  10. Linux-sed command
  11. android指定分享到qq,Android使用系统分享文件给微信,QQ指定的用户
  12. Atitit 软件与开发的未来趋势 attilax总结 1.1. Sdx软件重构世界 软件定义未来 1 1.2. 《软件和信息技术服务业发展规划(2016-2020年)》( 2 1.3. Iot物联
  13. fork函数结果分析
  14. Win10自带微软输入法消失解决办法(无法显示输入法图标)
  15. c++语言编程软件视频教程下载,C++编程开发全套视频教程下载
  16. 如何更改Windows桌面文件夹路径
  17. 您未被授权查看该页 错误 401.3
  18. Mac系统如何运行Windows exe程序?mac打开exe文件方法教程
  19. Python爬虫之xlml解析库
  20. 华为 Mate 40 系⁠列详细参数对比,Mate 40\40Pro\40Pro+\40RS

热门文章

  1. Idea快速入门指南
  2. OpenMV扫码识别
  3. 安全运维和安全运营的区别
  4. HTML5 地理位置定位(HTML5 Geolocation)
  5. 最全Media 响应式 设置方法
  6. 银行资产负债表-分科目详细解释
  7. 面试必问题之Docker分布式搭建
  8. 迅为IMX6ULL开发板Linux学习教程
  9. 阿里ODPS降低大数据应用门槛
  10. “以撒的结合”地图是怎样生成的——RogueLike地图随机生成