vivado DDS IP核的使用及仿真

这篇具有很好参考价值的文章主要介绍了vivado DDS IP核的使用及仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考:https://blog.csdn.net/weixin_45303812/article/details/123704440

新人第一次写文档,有错误的地方请大佬指点。

文档:Xilinx官网搜DDS

vivado DDS IP核的使用及仿真

Configuration 可配置参数

1.Configuration Options,有如下三种模式

Phase Generator and SIN/COS LUT (DDS):相位和sin和cos的数据都是IP核自己产生

Phase Generator only:只要相位输出


SIN/COS LUT only模式:只需要sin/cos模块输出但此模式需要外部不断的输入累加的相位

2.System clock  系统时钟频率,同样也是采样率

3.Number of channels 通道数,本次用的是四通道,单通道设置为1

4.Mode of operation 不太懂,没涉及到,一般选择standard

5.Parameter selection分为两种模式,Hardware Parameter 和 System Parameter

Hardware Parameter模式没用过,看起来是设置输出的数据位宽和相位位宽就可以了。

System Parameter模式

SFDR:无杂散动态范围

vivado DDS IP核的使用及仿真

简单来说就是每增加6dB,数据位宽增加1位,16位宽,就是96dB

Frequency Resolution:频率分辨率

vivado DDS IP核的使用及仿真

这个决定了数据的精度,用时钟频率除以2的n次方,n为位宽,如果是多通道,需要再除以通道数

比如我这里设置是32位宽,4通道,时钟是491.52MHz,491.52*10^6 / (2^32*4),那么可以算出来这个大约设置在0.029-0.06之间,这边写个0.04,然后左边可以看到数config_tdata的位宽变成32位,位宽更大这样输入的频率精度就更精确。

vivado DDS IP核的使用及仿真

Implementation可配置参数

1.Phase Increment Programmability相位增量(即频率控制字)控制模式选择一般选择固定或者可编程模式,如果是固定模式,可以通过第四个配置页Output Frequencies配置输出的频率,这里选择可编程模式,该模式下在valid有效时可对相位增量进行配置

vivado DDS IP核的使用及仿真

如图,也就是congfig配置这个,我们需要4通道,那么valid就需要持续四个时钟周期,然后每个时钟周期输入我们需要的tdata,这个参数是根据我们之前设置的精度和时钟来算。具体下面tb用到时讲。

2.Phase Offset Programmability相位偏移量(即相位控制字)控制模式选择暂时没用到,用法应该和频率控制字类似。

3.Output  输出: sin、cos、sin&cos字面意思,这里选sin&cos

4.Has Phase Out :本实验不需要相位输出,不选。

其他的默认。

vivado DDS IP核的使用及仿真

Detailed Implementation:设置输入输出的一些格式,需不需要ready,last等,根据需要选择即可。

Output Frequencies:输出频率,固定模式的时候设置这个,此处不需要。

最终配置如下:

vivado DDS IP核的使用及仿真

代码部分:

直接调用IP核。

module dds_test(
		input 						aclk								,
		input 						aresetn								,
		input 						s_axis_config_tvalid				,
		output						s_axis_config_tready				,
		input 			[31: 0] 	s_axis_config_tdata					,
		input 						s_axis_config_tlast					,
		output						m_axis_data_tvalid					,
		input 						m_axis_data_tready					,
		output			[31: 0] 	m_axis_data_tdata					,
		output						m_axis_data_tlast					,
		output						event_s_config_tlast_missing		,
		output						event_s_config_tlast_unexpected		
    );

dds_compiler_0 dds_0 (
  .aclk(aclk),                                                        // input wire aclk
  .aresetn(aresetn),                                                  // input wire aresetn
  .s_axis_config_tvalid(s_axis_config_tvalid),                        // input wire s_axis_config_tvalid
  .s_axis_config_tready(s_axis_config_tready),                        // output wire s_axis_config_tready
  .s_axis_config_tdata(s_axis_config_tdata),                          // input wire [31 : 0] s_axis_config_tdata
  .s_axis_config_tlast(s_axis_config_tlast),                          // input wire s_axis_config_tlast
  .m_axis_data_tvalid(m_axis_data_tvalid),                            // output wire m_axis_data_tvalid
  .m_axis_data_tready(m_axis_data_tready),                            // input wire m_axis_data_tready
  .m_axis_data_tdata(m_axis_data_tdata),                              // output wire [31 : 0] m_axis_data_tdata
  .m_axis_data_tlast(m_axis_data_tlast),                              // output wire m_axis_data_tlast
  .event_s_config_tlast_missing(event_s_config_tlast_missing),        // output wire event_s_config_tlast_missing
  .event_s_config_tlast_unexpected(event_s_config_tlast_unexpected)   // output wire event_s_config_tlast_unexpected
);

endmodule

 tb部分,生成了四路正余弦IQ信号。

其中最重要的是上文提到的设置输出信号频率的参数设置。

以生成10M信号为例,我们的时钟采用的是491.52MHz,一共4路信号,那么实际采样率就是122.88MHz,我们设置的精度为32位,因此,10M信号的参数计算如下:

10/122.88 * 2^32 ≈ 32‘h 14D55555;

如果是-10M信号,由于频谱翻转,位置是122.88M-10M,计算如下

112.88/122.88 * 2^32 ≈ 32‘h EB2AAAAB

或者用2^32 - 10/122.88 * 2^32 ≈ 32‘h EB2AAAAB都可以,一个意思。

此外,DDS多通道的配置是,每个时钟周期VALID有效时,输入的参数才有效,因此多通道必须一个输入时钟一个参数,同时拉高valid,最后一个数据加last。

`timescale 1ns/1ps
module dds_tb();

reg 						aclk								;
reg 						aresetn								;
reg 						s_axis_config_tvalid				;
wire						s_axis_config_tready				;
reg 			[31: 0] 	s_axis_config_tdata					;
reg 						s_axis_config_tlast					;
wire						m_axis_data_tvalid					;
reg 						m_axis_data_tready					;
wire			[31: 0] 	m_axis_data_tdata					;
wire						m_axis_data_tlast					;
wire						event_s_config_tlast_missing		;
wire						event_s_config_tlast_unexpected		;

reg    	[1 : 0]   	cnt_chan				;
reg 	[31: 0] 	m_dout_0				;
reg 	[31: 0] 	m_dout_1				;
reg 	[31: 0] 	m_dout_2				;
reg 	[31: 0] 	m_dout_3				;

always @(posedge aclk) begin
	if (!aresetn) begin
		cnt_chan <= 2'b0;// reset
	end
	else begin
		cnt_chan <= cnt_chan + 1'b1;
	end
end
always @(posedge aclk) begin
	if (cnt_chan == 2'b0) begin
		m_dout_0 <= m_axis_data_tdata;
	end
	else if(cnt_chan == 2'b01)begin
		m_dout_1 <= m_axis_data_tdata;
	end
	else if(cnt_chan == 2'b10)begin
		m_dout_2 <= m_axis_data_tdata;
	end
	else if(cnt_chan == 2'b11)begin
		m_dout_3 <= m_axis_data_tdata;
	end
end

parameter fre_ch0 = 32'h14D55555  ,//10M
          //fre_ch0 = 873813333   ,
          fre_ch1 = 32'hEB2AAAAB  ,//-10M
          fre_ch2 = 32'h29AAAAAA     ,//20M
          fre_ch3 = 32'hD6555556    ;//-20M

initial aclk = 1'b0;
always #(500/491.52) aclk = ~aclk;
initial begin
        aresetn = 1'b0;s_axis_config_tvalid=0;s_axis_config_tdata = 0;s_axis_config_tlast=0;m_axis_data_tready=1'b0;
		#(1000*100/491.52)   aresetn = 1'b1;
		#(1000*100/491.52)    s_axis_config_tvalid = 1;s_axis_config_tdata = fre_ch0;m_axis_data_tready=1'b1;
		#(1000/491.52) s_axis_config_tvalid = 1;s_axis_config_tdata = fre_ch1;
		#(1000/491.52) s_axis_config_tvalid = 1;s_axis_config_tdata = fre_ch2;
		#(1000/491.52) s_axis_config_tvalid = 1;s_axis_config_tdata = fre_ch3;s_axis_config_tlast=1;
		#(1000/491.52) s_axis_config_tvalid = 0;s_axis_config_tdata = 0;s_axis_config_tlast=0;
end


dds_test tb (
  .aclk(aclk),                                                       
  .aresetn(aresetn),                                                 
  .s_axis_config_tvalid(s_axis_config_tvalid),                       
  .s_axis_config_tready(s_axis_config_tready),                       
  .s_axis_config_tdata(s_axis_config_tdata),                         
  .s_axis_config_tlast(s_axis_config_tlast),                         
  .m_axis_data_tvalid(m_axis_data_tvalid),                           
  .m_axis_data_tready(m_axis_data_tready),                           
  .m_axis_data_tdata(m_axis_data_tdata),                             
  .m_axis_data_tlast(m_axis_data_tlast),                             
  .event_s_config_tlast_missing(event_s_config_tlast_missing),       
  .event_s_config_tlast_unexpected(event_s_config_tlast_unexpected)  
);
endmodule

仿真结果:

vivado DDS IP核的使用及仿真

输出的四路信号分别为10M,-10M,20M,-20M的IQ信号,图片仿真的结果没把IQ拆出来,大概看个波形,可以看出得到了想要的结果。文章来源地址https://www.toymoban.com/news/detail-414603.html

到了这里,关于vivado DDS IP核的使用及仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Vivado】ram ip核的使用

    ​ ram 的英文全称是 Random Access Memory,即随机存取存储器, 它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据, 其读写速度是由时钟频率决定的。 ram 主要用来存放程序及程序执行过程中产生的中间数据、 运算结果等。 ​ rom为只读存储

    2024年02月02日
    浏览(35)
  • Vivado中VIO IP核的使用

      Vivado中的VIO(Virtual Input/Output) IP核是一种用于调试和测试FPGA设计的IP核。它允许设计者通过使用JTAG接口读取和写入FPGA内部的寄存器,从而检查设计的运行状态并修改其行为。VIO IP核提供了一个简单易用的接口,使得用户可以轻松地与FPGA内部寄存器进行交互。通过使用

    2024年02月06日
    浏览(87)
  • IP核的使用之FIFO(Vivado)

    在开始介绍 FIFO IP核 之前,我们先设想这么一个 实际场景 :FPGA内部有个16位计数器,以50MHz的频率计数,此时,我们希望随机截取计数器连续256个计数周期的值发到电脑上进行分析处理。用串口发送到电脑上。( 数据产生速率大于数据使用速率 ),此时需要使用存储器先将

    2024年01月18日
    浏览(48)
  • Vivado PLL锁相环 IP核的使用

    本文纯属学习笔记,使用的FPGA是Xilinx的XC7A35TFGG484-1,使用Vivado调用PLL IP核来实现倍频效果,使50Mhz的晶振时钟源倍频到100Mhz、200Mhz和400Mhz。 Clocking Options 1.MMCM与PLL相比,PLL的时钟质量更高,所以对时钟质量要求较高的时候需要选择PLL,但是一般可以不用纠结。 2.修改Input Fre

    2024年02月08日
    浏览(40)
  • 如何使用Synplify综合vivado带IP核的工程

    下面的说法来自网上: 综合时间更好,综合出来所使用的逻辑更少 综合的时序更好 在IC设计中,使用Synplify综合+Vivado组合比较多。synplify 用于生成网表,然后将网表倒入FPGA中,进行布局布线等操作。 Libero集成开发环境中Synplify应用与提高-Microsemi(Actel) FPGA开发工具——周

    2024年02月11日
    浏览(51)
  • 如何使用Vivado DDS ip核产生正余弦波

    实验要求:使用50M的系统时钟分别产生一路12位的10KHZ的正弦波和余弦波 第一步:打开DDS ip核 Configuration Options: 选择有Sin和Cos模式 System Clk:选择50MHz Mode Of Operation:这里可以有两种选择Standard模式和Rasterized模式 在Standard模式下:填写Phase width(相位位宽): 默认16位不变,填写

    2024年04月11日
    浏览(38)
  • vivado中时钟ip核的调用

    时钟ip核(MMCM PPL),MMCM(混合模式时钟管理)和PPL(锁相环)是FPGA内部的时钟资源。 作用:对时钟网络进行一个系统级的时钟管理和偏斜控制,具有时钟倍频、分频、相位偏移等功能 一、7系列FPGA高层次时钟结构视图     Clock Region :区域时钟。 Clock Backbone :全局时钟线

    2024年01月19日
    浏览(46)
  • Vivado DDS IP配置

            本文记录Vivado中DDS IP核相关配置方法,主要涉及输出信号位宽、频率、频率分辨率、相位等相关内容。       一、点击 IP Catalog,打开DDS IP配置界面 Configuration界面: 1、System Requirement         System Clock:产生DDS的时钟         Number of Channels:默认为1 2、System Par

    2024年02月15日
    浏览(39)
  • XILINX关于Adder/Subtracter加法器减法器 IP核的使用与仿真

    平台:vivado21018.3,modelsim 10.6c 芯片:xc7k325tffg900-2 (active) Adder/Subtracter IP可提供LUT和单个DSP48 slice加法/减法实现方案。Adder/Subtracter 模块可实现加法器 (A+B)、减法器 (A–B),以及可通过签名或未签名数据运行的动态可配置加法器/减法器。该功能能够以单个DSP48 slice方式实现,也

    2024年02月15日
    浏览(47)
  • FPGA中FIFO的应用(三)——Vivado FIFO IP核的调用

    ⭐️作者简介: 小瑞同学 ,一个努力精进的 FPGA 和通信学习者。 🍎个人主页:小瑞同学的博客主页 🌻个人信条:越努力,越幸运! ⏰日期:2023.12.6 🔍来源:自学经历 📖文章内容概述:简单介绍了 FIFO IP核 常用参数的配置,通过仿真分析了异步IP的 读写数据 过程。 连载

    2024年01月18日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包