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

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

3天内不再提示

Verilog实现DDS正弦波发生器

ZYNQ 来源:ZYNQ 2023-12-22 09:48 次阅读

DDS简介:

DDS 同 DSP数字信号处理)一样,是一项关键的数字化技术。DDS 是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写。与传统的频率合成器相比,DDS 具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。

DDS 芯片的功能主要包括频率控制寄存器、高速相位累加器和正弦计算器三个部分。频率控制寄存器可以串行或并行的方式装载并寄存用户输入的频率控制码;而相位累加器根据频率控制码在每个时钟周期内进行相位累加,得到一个相位值;正弦计算器则对该相位值计算数字化正弦波幅度(芯片一般通过查表得到)。

DDS 芯片输出的一般是数字化的正弦波,因此还需经过高速 D/A 转换器和低通滤波器才能得到一个可用的模拟频率信号。关于想了解更多的 DDS 的相关知识, 大家可以到百度直接搜索。

下面主要来给大家介绍FPGA 程序的设计, DDS IP 的配置和调试。

编写 dds_wave 的 verilog 程序

`timescale1ns/1ps

//////////////////////////////////////////////////////////////////////////////////

//Company:

//Engineer:

//

//CreateDate:103307/17/2018

//DesignName:

//ModuleName:dds_wave

//ProjectName:

//TargetDevices:

//Toolversions:

//Description:

//

//Dependencies:

//

//Revision:

//Revision0.01-FileCreated

//AdditionalComments:

//

//////////////////////////////////////////////////////////////////////////////////

moduledds_wave(clk,key1,data,da_clk

);

inputclk,key1;

output[7:0]data;

outputda_clk;



reg[15:0]key1_cout;

reg[7:0]data_o;

regdds_we;

reg[28:0]dds_data;

reg[3:0]dds_freq=0;

regdds_we_req;



wire[7:0]sine;



assignsine_reg=sine[6:0];

assignda_clk=clk;

assigndata=data_o;



//有符号数转化为无符号输出到DA

always@(posedgeclk)

begin

if(sine[7]==1'b1)

data_o<= sine - 128;

 else

  data_o <= sine + 128;

end

//控制DDS输出不同

always @(negedge clk)

begin

 dds_we <= dds_we_req;

 case(dds_freq)

 4'd0:

  dds_data <= 29'd107;  //10Hz:(dds_data*2^29/50*1000000)

 4'd1:

  dds_data <= 29'd1074; //100Hz:(dds_data*2^29/50*1000000)

 4'd2:

  dds_data <= 29'd10737; //1kHz:(dds_data*2^29/50*1000000)

 4'd3:

  dds_data <= 29'd53687; //5kHz:(dds_data*2^29/50*1000000)

 4'd4:

  dds_data <= 29'd107374; //10kHz:(dds_data*2^29/50*1000000)

 4'd5:

  dds_data <= 29'd536871; //50kHz:(dds_data*2^29/50*1000000)

 4'd6:

  dds_data <= 29'd1073742; //100Hz:(dds_data*2^29/50*1000000)

 4'd7:

  dds_data <= 29'd5368709; //500Hz:(dds_data*2^29/50*1000000)

 4'd8:

  dds_data <= 29'd10737418; //1mHz:(dds_data*2^29/50*1000000)  

 4'd9:

  dds_data <= 29'd21474836; //2mHz:(dds_data*2^29/50*1000000)

 4'd10:

  dds_data <= 29'd32212255; //3mHz:(dds_data*2^29/50*1000000)

 4'd11:

  dds_data <= 29'd42949672; //4mHz:(dds_data*2^29/50*1000000)

 4'd12:

  dds_data <= 29'd53687091; //5mHz:(dds_data*2^29/50*1000000)

 4'd13:

  dds_data <= 29'd64424509; //6mHz:(dds_data*2^29/50*1000000)

 4'd14:

  dds_data <= 29'd75161928; //7mHz:(dds_data*2^29/50*1000000)

 4'd15:

  dds_data <= 29'd85899346; //8mHz:(dds_data*2^29/50*1000000)

 default:

  dds_data <= 29'd107; // 1kHz:(dds_data*2^29/50*1000000)

 endcase

end

 

//按钮处理程序,改变DDS的输出频率

always @(posedge clk)

begin

 if(key1 == 1'b0)

  key1_cout <= 0;

 else if((key1 == 1'b1) & (key1_cout <= 16'hc350))

  key1_cout <= key1_cout + 1'b1;

 

 if(key1_cout == 16'hc349)

 begin

  dds_freq <=dds_freq + 1'b1;

  dds_we_req <= 1'b1;

 end

 else begin

  dds_freq <=dds_freq;

  dds_we_req <= 1'b0;

 end

end 

 

//DDS IP产生sin/cos波形

sin_cos sin_cos_inst(

 .clk(clk),

 .we(dds_we),

 .data(dds_data),

 .cosine(cosine),

 .sine(sine),

 .phase_out()

);

 

endmodule

程序通过检测开发板上按键 KEY1 ,如果按键 KEY1 每按下一次,寄存器 dds_freq 的值就会加 1, 程序就会对 DDS IP 写入一个 data 数据来改变相位的增加量,从而改变输出波形的频率。程序中设置了 16 种相位的增加量,所以可以让 DDS 产生 16 个不同频率的正弦波。在本实验的 DDS IP 的配置中,相位增加的数据宽度为 29 位,所以最小的频率输出为50Mhz/2^29, 约 0.093Hz。如果想让 DDS 输出 1Khz 的波形,就需要写入相位增加值10737 。相位增加值和频率的计算公式如下:

相位增加值=( fhz * 2^29 )/( 50 * 1000000)

仿真图如下:

6b4e7ca2-a05f-11ee-8b88-92fbcf53809c.png

审核编辑:汤梓红

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

    关注

    0

    文章

    247

    浏览量

    25134
  • 正弦波发生器

    关注

    1

    文章

    25

    浏览量

    15449
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302
  • DDS
    DDS
    +关注

    关注

    21

    文章

    614

    浏览量

    151731

原文标题:Verilog实现DDS 正弦波发生器

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

收藏 人收藏

    评论

    相关推荐

    Verilog通过DDS合成正弦波信号

    本帖最后由 蓝e 于 2016-7-12 22:32 编辑 用Verilog通过DDS合成正弦波信号主要原理:DDS:直接数字合成,正弦波
    发表于 03-22 23:42

    求学 基于DDS芯片的正弦波发生器

    ,主要由DDS正弦信号发生器及增益匹配电路、调制信号发生器、调幅电路、调频电路键盘与显示电路等组成。主要性能指标(1)正弦波输出频率范围:1
    发表于 07-17 09:44

    【Z-turn Board试用体验】+基于FPGA和DDS技术的三相正弦波发生器设计

    芯片的可编程性和实现方案易改动的特点,提出了一种基于FPGA和DDS技术的任意波形发生器设计方案。目前任意波形发生器的设计还在进行中。本文只给出实验阶段的三相
    发表于 05-30 10:50

    基于DDS的波形发生器

    最近在做基于DDS的信号发生器,MCU用的是STC12C5A60S2单片机,可以发生正弦波0~50Mhz内都很稳定,频率可步进,但是不知道如何去产生一个占空比可控的方波,求大神指导代码
    发表于 08-05 21:26

    请问哪位大神做过51单片机控制的AD9834的DDS波形发生器啊?产生正弦波、三角、方波的?

    请问哪位大神做过51单片机控制的AD9834的DDS波形发生器啊?产生正弦波、三角、方波的?做过的朋友能帮帮忙给份程序吗?
    发表于 10-07 20:41

    如何设计一种基于DDS器件AD9951的射频正弦波信号发生器

    设计一种基于DDS器件AD9951的射频正弦波信号发生器,通过设计、制作和调试,所得实验结果较好,随后进行分析,提出了改进意见。
    发表于 04-07 06:24

    怎么实现基于DDS技术的高频正弦波发生器的设计?

    本文采用直接数字合成(DDS)技术,采用专用集成芯片 AD9834作为正弦波产生模块,由 C8051F020作为控制来完成整个系统的设计。
    发表于 05-18 06:41

    基于DSP的正弦波信号发生器源程序

    基于DSP的正弦波信号发生器源程序(汇编语言)正弦波信号发生器源程序D.1用泰勒级数开展开法计算一个角度的余弦值
    发表于 08-17 07:15

    怎样去设计一个基于DDS技术的正弦波信号发生器

    摘 要本系统采用AT89S51单片机为核心,辅以必要的模拟,数字电路,构成了一个基于DDS技术的正弦波信号发生器。该软件系统采用4*4键盘操作,以菜单形式进行显示,操作方便简单,软件增加了许多
    发表于 12-08 08:02

    dsp正弦波发生器

    dsp正弦波发生器,在C5000系列DSP上实现正弦波发生器
    发表于 01-02 19:29 85次下载

    基于DDS技术的高频正弦波发生器的设计

    以混合信号单片机C8051F020 及DDS 芯片AD9834 为核心,采用直接数字合成(DDS)技术完成多功能高频正弦信号发生器的设计。该正弦
    发表于 08-10 15:27 107次下载

    基于DDS技术的高频正弦波发生器的设计

    以混合信号单片机C8051F020 及DDS 芯片AD9834 为核心,采用直接数字合成(DDS)技术完成多功能高频正弦信号发生器的设计。该正弦
    发表于 12-18 15:32 111次下载

    正弦波发生器

    正弦波发生器
    发表于 10-07 11:46 905次阅读
    <b class='flag-5'>正弦波</b><b class='flag-5'>发生器</b>

    基于Verilog实现DDS任意波形发生器

    DDS是从相位的概念直接合成所需波形的一种频率合成技术。不仅可以产生不同频率的正弦波,而且可以控制波形的初始相位。本文为大家介绍基于Verilog实现
    发表于 01-08 11:58 6494次阅读
    基于<b class='flag-5'>Verilog</b><b class='flag-5'>实现</b>的<b class='flag-5'>DDS</b>任意波形<b class='flag-5'>发生器</b>

    正弦波信号发生器基本原理与设计

    本文主要介绍了一种正弦波信号发生器基本原理与设计,正弦信号发生器主要由两部分组成:正弦波信号发生器
    发表于 01-14 13:11 7.8w次阅读
    <b class='flag-5'>正弦波</b>信号<b class='flag-5'>发生器</b>基本原理与设计