FPGA实验1:DDS IP 数字波形合成

该实验详细介绍了如何在Vivado环境中使用IPI配置DDSIP,通过VIO设置频率字,ILA观察波形验证频率设定。实验涉及DDS基本原理、系统结构及VIO使用,通过MATLAB分析ILA导出的CSV文件确认波形频率。实验步骤包括IP配置、模块设计、波形观察与频谱分析,最后展示了1MHz和3MHz正弦波的验证结果。
摘要由CSDN通过智能技术生成

1. 实验内容

  1. 使用 Vivado的IPI工具,例化DDS IP;
  2. DDS需要能够配置频率字(相位增量);
  3. DDS工作时钟使用PL的板载50MHz时钟;
  4. 使用ILA工具观察波形, 使用VIO设定频率字;
  5. 在ILA的波形窗口里,观察你设定的波形的周期,验证你频率字设定的正确性;
  6. 把ILA波形导出到CSV文件,波形样点长度不小于2048点,在Matlab里分析波形的频谱,验证你生成波形的正确性;
  7. 使用VIO更改频率字,分别生成1MHz和3MHz的正弦波形。使用以上流程,验证你输出波形的正确性。

2. 实验背景知识

2.1. DDS的概念

DDS(Direct Digital Synthesis):直接数字频率合成技术,是从相位概念出发直接合成所需波形的一种频率合成技术,通过控制相位的变化速度,直接产生各种不同频率、不同波形信号的一种频率合成方法。

2.2. DDS系统结构

DDS系统主要由相位累加器、波形存储器、数模(D/A)转换器和低通滤波器等四个大的结构组成,其结构框图如下图所示。
DDS系统结构
图中,参考频率为固定值;频率控制字k,用来调整输出信号的频率;相位累加器由N位加法器与N位累加寄存器构成,它根据频率控制字k,完成相位值的累加,并将此累加值输入到波形存储器中;波形存储器将相位累积器的值作为当地址,查找与相位值对应的信号数据,输出到D/A转换器;D/A转换器,将波形存储器输出的数字量转换为与之对应的模拟量;由于D/A转换器存在量化误差,输出波形中存在混叠,需要在输出端使用低通滤波器进行滤波,提高信号的输出性能。
DDS输出波形精度
DDS原理输出波形的精度与DAC分辨率、波形细分、输出滤波电路性能密切相关。
DAC分辨率:DAC将数字量转换为模拟量,在转换过程中存在量化误差,如图5所示。量化误差代表着波形在幅值上对要求波形的接近程度,DAC位数越多,即分辨率越高,DAC生成的信号越接近与所要求的模拟值。
波形细分:波形细分精度影响着波形形状的精度,对于一个波形来说,采样间隔越小,采样点数越多,越能够获得关于波形更多的信息。同理,DDS的波形数据的细分精度越高、点数越多,生成的波形效果越好。
输出滤波电路: DAC输出会存在混叠噪声,为了提高输出的性能需要使用滤波电路滤除掉其中的高频噪声,提高输出精度。

2.3. vio的使用

使用场景:在使用In system debug时需要使用按键触发查看相关信号,但不想用板子上的按键。
VIO:Virtual input output,即虚拟IO。
主要用作虚拟IO使用;VIO的输出可以控制模块的输入,VIO的输入可以显示模块的输出值。

连接如下图:
在这里插入图片描述

3. 实验步骤

1. 使用vivado的IP Catalog工具,配置DDS,ILA,VIO参数

DDS参数配置:
在这里插入图片描述

在这里插入图片描述
Output中的Polarity取消勾选Negative Sine(默认是勾选的)。这个勾选上的话输出的数值极性相反。
在这里插入图片描述

VIO参数配置:
在这里插入图片描述
在这里插入图片描述
位数为2,说明可以控制四种频率控制字,得到四种不同频率的正弦波。

ILA参数配置:
在这里插入图片描述
波形样点数为4096
在这里插入图片描述
一个时钟输入clk,其他三个输入分别为:
probe0:连接VIO按键控制频率控制字(key_PINC)
probe1:连接频率字(Fword)
probe2:连接输出正弦波形

2. 设计顶层(top)模块和按键控制频率控制字(Fword_set)模块,例化DDS,ILA,VIO,并将它们的接口对应连接起来。

程序结构:
在这里插入图片描述

顶层(top)模块:

`timescale 1ns / 1ps

module top(
    input           sys_clk         ,//系统时钟  50MHz  T=20ns
    input           sys_rst_n           //系统复位  
    
    );
   
// -----------0、VIO按键控制频率控制字(key_PINC)
 wire [1:0] key_PINC;
 vio_0 vio_0 (
      .clk(sys_clk),                // input wire clk
      .probe_out0(key_PINC)  // output wire [1 : 0] probe_out0
    );

//---------------1、信号频率控制模块--------------//
wire  [23:0]   Fword ;  //频率字
Fword_set Fword_set(
        //input
        .clk        (sys_clk            ),
        .rst_n      (sys_rst_n              ),
        .key_PINC   (key_PINC           ),
        //output
        .Fword      (Fword              )
        );

//---------------2、DDS模块--------------//
//input
wire [0:0]   fre_ctrl_word_en  ;    

//output
wire [0:0]   dds_m_axis_data_tvalid    ;
wire [7:0]   dds_m_axis_data_tdata     ;
wire [0:0]   dds_m_axis_phase_tvalid   ;
wire [23:0]  dds_m_axis_phase_tdata    ;

assign fre_ctrl_word_en=1'b1;

//例化DDS IP
dds_compiler_0 dds_compiler_0 (
  .aclk                 (sys_clk                ),    // input wire aclk
  .s_axis_config_tvalid (fre_ctrl_word_en       ),    // input wire s_axis_config_tvalid
  .s_axis_config_tdata  (Fword                  ),    // input wire [23: 0] s_axis_config_tdata
  .m_axis_data_tvalid   (dds_m_axis_data_tvalid     ),    // output wire m_axis_data_tvalid
  .m_axis_data_tdata    (dds_m_axis_data_tdata      ),    // output wire [15 : 0] m_axis_data_tdata
  .m_axis_phase_tvalid  (dds_m_axis_phase_tvalid    ),    // output wire m_axis_phase_tvalid
  .m_axis_phase_tdata   (dds_m_axis_phase_tdata     )     // output wire [23 : 0] m_axis_phase_tdata
); 

//例化ILA IP
ila_0 ila_0 (
	.clk(sys_clk), // input wire clk
    .probe0(key_PINC), // input wire [1:0]
    .probe1(Fword), // input wire [23:0]
    .probe2(dds_m_axis_data_tdata) // input wire [7:0] 
     
);   

endmodule

按键控制频率控制字(Fword_set)模块:

`timescale 1ns / 1ps
//
// 通过按键来选择对应的频率控制字,进而选择对应的信号频率
//
module Fword_set(
    input               clk         ,
    input               rst_n       ,
    input  [1:0]        key_PINC    ,
    
    output reg [23:0]   Fword
    );
    
//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 cl
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值