DDS信号发生器原理与vivado仿真

DDS信号发生器原理与vivado仿真

1. DDS简介
        DDS信号发生器采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,把信号发生器的频率稳定度、准确度提高到与基准频率相同的水平,并且可以在很宽的频率范围内进行精细的频率调节。采用这种方法设计的信号源可工作于调制状态,可对输出电平进行调节,也可输出各种波形。

2. 原理
        DDS信号产生的理论基础是“奈奎斯特采样定理”。在定理中可知当抽样频率大于等于模拟信号最高频率两倍时,就可以从离散序列无失真的信号中恢复出原始模拟信号。DDS信号发生原理是对模拟信号进行抽样。当一个抽样过程已经发生且抽样值已经量化完成,从量化数值重建原始模拟信号。基本的DDS结构主要由相位累加器、波形量化数据存储器、D/A转换器组成。其中相位累加器和波形量化数据存储器称为数控振荡器,是DDS结构中的数字部分。DDS基本结构原理如下图所示。
在这里插入图片描述
        图中,相位累加器是由N位加法器与N位累加寄存器构成,它是DDS模块中一个极其重要的部分。在参考频率时钟的驱动下,DDS模块开始工作;当每来一个参考时钟时,累加器就把频率控制字FW与寄存器输出的值进行累加,将相加后的结果再输入到寄存器中,而累加寄存器就将在上一个参考时钟作用时产生的数据通过反馈的方式输送到累加器中。这样,在时钟的作用下,就可以不停的对频率控制字进行累加。此时,用相位累加器输出的数据作为地址在波形存储器中通过查找地址所对应的幅值表,就可以完成其从相位到幅值之间的转化。在DDS模块中,输出频率的公式为:在这里插入图片描述
由上式可以看出,在参考信号与累加器的位数给定时,信号最终的输出频率主要由频率控制字决定。故当频率控制字变化时,输出频率也跟着变化,从而可以实现调频的基本功能。

3. DDS代码

module DDS(

  input clk,
  input rst_n,
  input [31:0]fword,
  input [10:0]pword,
  output [11:0]DA
);

  reg [31:0] r_fword;
  reg [11:0] r_pword;
  
  reg [31:0] cnt;
  
  wire [11:0] rom_addr;
  
  always@(posedge clk or negedge rst_n)begin
    if(!rst_n) begin
      r_fword <= 0;
		  r_pword <= 0;
      end
    else begin
      r_fword <= fword;
		  r_pword <= pword;
		end
  end
       
  
  always@(posedge clk or negedge rst_n)
     if(!rst_n)
	    cnt <= 32'd0;
	   else
	    cnt <= cnt +r_fword;
		 
	assign rom_addr = cnt[31:20] + r_pword;
		 
blk_mem_gen_0 blk_mem_gen_1 (
  .clka(clk),    // input wire clka
  .addra(rom_addr),  // input wire [11 : 0] addra
  .douta(DA) // output wire [11 : 0] douta
);

endmodule 

其中blk_mem_gen_0例化模块为在vivado中调用的 “rom” IP核,设置如下两图所示。
在这里插入图片描述
在这里插入图片描述
        ROM的初始化coe文件可以由波形数据生成器或者matlab产生,保存至工程目录下,并在ROM中将初始化文件选择为生成的coe文件。

4. 测试文件

`timescale 1ns/1ns

module DDS_tb;

      reg clk;
		reg rst_n;
		reg [31:0] fword;
		reg [10:0] pword;
		
		wire [11:0] DA;
		
		DDS DDS0 (
		
		  .clk   (clk),
		  .rst_n (rst_n),
		  .fword (fword),
		  .pword (pword),
		  .DA    (DA)    
		);
		
		initial clk = 1;
		always #5 clk = ~clk;
		
		initial begin
		   rst_n = 0;
			fword = 42955;
			pword = 256;
			#201;
			rst_n = 1;
		end	
		  		
endmodule 
		

5. 仿真结果
        在vivado中点击 Run Simulation——Run Behavioral Simulation,选中DA,设置为模拟信号,如下图所示。
在这里插入图片描述
点击上方运行在这里插入图片描述
在这里插入图片描述
        测试文件中,输入时钟设置为100M,频率控制字为42955,相位控制字为256,由上面的输出频率计算公式计算频率为=42955x100000000/2^32=1000.12Hz,周期为1ms,对波形进行测量,得到周期约为1ms,如下图所示。
在这里插入图片描述

6. 总结
        由仿真结果可知,与预期效果一致,证明模块正确无误。有兴趣的读者可以将上面部分再加上DAC模块和低通滤波模块,就可以得到DDS信号发生器。

根据DDS技术原理,在vavido上编写DDS信号源硬件逻辑语言,可以实现频率、幅度和波形可调的信号源发生器。DDS是以数控振荡器的方式产生频率和相位可控制的波形,它需要基准时钟源、相位累加器、相位调制器和正弦ROM查找表等组成。有人在Zedboard上用Vivado编写了DDS信号发生器的工程文件,适用于产生任意波形,并且作者对此进行了几天的验证,是学习的最佳教材。所以,FPGA DDS信号发生器Vivado是一种使用Vivado软件编写的硬件逻辑语言来实现DDS信号发生器的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [基于FPGADDS信号发生器vivado版本)](https://blog.csdn.net/m0_58714286/article/details/128924266)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Xilinx DDS信号发生器vivado工程文件](https://download.csdn.net/download/u010879745/22647209)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值