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

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

3天内不再提示

DDS信号生成模块的Verilog实现

CHANBAEK 来源:新海客 作者:陈一伟 2023-11-08 14:39 次阅读

直接数字频率合成器(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使用方法与上述一致;

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

    关注

    0

    文章

    247

    浏览量

    25135
  • 频率合成器
    +关注

    关注

    5

    文章

    199

    浏览量

    32156
  • 无线通信
    +关注

    关注

    56

    文章

    4197

    浏览量

    142327
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302
  • DDS
    DDS
    +关注

    关注

    21

    文章

    614

    浏览量

    151731
收藏 人收藏

    评论

    相关推荐

    Verilog实现DDS正弦波发生器

    DDS 同 DSP(数字信号处理)一样,是一项关键的数字化技术。DDS 是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写。与传统的频率合成器相比,DDS
    的头像 发表于 12-22 09:48 448次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>实现</b><b class='flag-5'>DDS</b>正弦波发生器

    DDSVERILOG原代码

    DDSVERILOG原代码
    发表于 08-11 09:35

    基于FPGA 的DDS 调频信号的研究与实现

    基于FPGA 的DDS 调频信号的研究与实现
    发表于 08-17 11:41

    基于Verilog HDL的DDS设计与仿真

    基于Verilog HDL的DDS设计与仿真
    发表于 08-19 23:15

    Verilog通过DDS合成正弦波信号

    。而存储每一个幅度的比特数决定了幅度的量化误差。可以通过Quartus II的IP核资源创建。Verilog编写的DDS模块主要由三部分组成,一、相位累加器,用于决定输出信号频率的范围
    发表于 03-22 23:42

    急急急!!!各位大神帮帮忙!怎么用Verilog控制DDS芯片AD9852

    ,看了网上的资料,都是Verilog通过内部模块实现DDS。希望大神们给点给我个控制程序,让我参考一下。大恩大德,不胜感激!实在很急
    发表于 04-25 21:56

    请问怎么用Verilog写一个DDS产生Chirp线性调频信号

    有没有前辈用Verilog写一个DDS产生Chirp线性调频信号,方便的话能不能给个代码,我的邮箱是year2015@126.com,
    发表于 09-11 17:35

    基于DDS实现信号的频谱分析

    1 引言 直接数字频率合成(DDS)是近几年一种新型的频率合成法,其具有频率切换速度快,频率分辨率高,以及便于集成等优点。在此,设计了基于DDS的频谱分析仪,该频谱分析仪依据外差原理,被测信号与本征频率混频,
    发表于 05-31 08:01

    使用AD9739A生成信号,用FPGA的DDS生成信号,为什么谐波特别明显?

    使用AD9739A生成信号,用FPGA的DDS生成信号,见图,谐波特别明显,尤其是3次谐波,购买的是AD9739_FMC的评估板,下图中产生
    发表于 12-07 07:57

    基于FPGA的DDS信号源设计与实现

    基于FPGA的DDS信号源设计与实现 利用DDS和 FPGA 技术设计一种信号发生器.介绍了该信号
    发表于 02-11 08:48 223次下载

    DDS在罗盘测试信号产生模块中的应用

    本文在对DDS原理和AD9854芯片研究的基础上,介绍了一种罗盘测试信号产生模块的设计方案。通过单片机对DDS芯片的控制,可以产生正弦波信号
    发表于 07-31 10:45 12次下载

    基于DDS信号发生器设计

    基于dds函数信号发生器,用单片机及dds实现正玄波,三角波,矩形波的产生
    发表于 01-11 14:55 19次下载

    DDS多波信号发生器的实现

    详细介绍了直接数字频率合成器(DDS)的工作原理、基本结构。在参考DDS 相关文献的基础上,提出了符合结构的DDS 设计方案,利用DDS 技术设计了一种高频率精度的多波形
    发表于 11-22 14:35 0次下载

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

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

    教你如何利用verilog轻松实现高分辨率DDS

    上图就是DDS的的FPGA实现框图,完整的DDS还应该在外面有DAC和低通滤波器的,然而很多时候我们是不需要这两个的,因为上图的DDS输出的信号
    的头像 发表于 06-28 10:36 1145次阅读
    教你如何利用<b class='flag-5'>verilog</b>轻松<b class='flag-5'>实现</b>高分辨率<b class='flag-5'>DDS</b>