【Xilinx DDS】Vivado代码实现FPGA DDS

18 篇文章 14 订阅
10 篇文章 12 订阅
本实验通过Vivado实现了一个使用DDSIP核生成16位宽度的正弦波形。首先配置Blockmemorygenerator为单端口ROM,加载16位宽的coe文件。然后编写顶层模块,实例化ROMIP核并定义读取地址方式。接着编写仿真文件,进行功能验证。最终通过仿真波形观察到正弦波输出。博客还提到了DDS的原理和参数设定。
摘要由CSDN通过智能技术生成

目录

 

实验目的

一、调用ROM IP核

二、生成顶层模块

三、仿真文件的编写

四、进行仿真验证


 

实验目的

本实验工程目的是实现输出数据位宽为16的正弦波形。

一、调用ROM IP核

打开vivado,创建实验工程,点击左侧菜单栏的IP Catalog,搜索Block,就可以看到block memory generator,双击打开进行配置。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

首先在basic选项卡中将memory type配置成单端口的ROM,因为我们会事先将数据存入ROM中,只需要对它的地址空间进行读取即可,同时也可以将这个IP定义成自己想要的名称,方便辨别。其余保持默认。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 在port A options选项卡中,将数据位宽配置成16,深度配置成65536,也可以根据自己的需求改变参数,但在之后的代码需要进行位宽的更改。其余保持默认。 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

在other option的选项卡中,加载所需要的coe文件,我用的是小梅哥的coe文件生成器,同样的也是将数据位宽配置成16,深度配置成65536.最后将所生成的coe文件加载其中即可。 配置完成点击ok。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

二、生成顶层模块

点击sources中的加号键,选择添加设计文件,一路点击确定。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_17,color_FFFFFF,t_70,g_se,x_16

再进行顶层模块的代码编写,这里的代码主要包括对端口的申明以及对ROM IP核的例化。

同时,也定义读取地址的方式,这里定义的步进为1,也就是依次对ROM的地址内的数据进行读取,也可以根据自己的需要进行更改,但是更改的同时也会改变输出波形的频率。

关于DDS的理论知识,可以看下另一篇博客,博客中详细介绍了DDS的原理以及相关参数的含义。

`timescale 1ns / 1ps

module dds_top(
	input			clk,
	input			rst,
	input			ena,
	output	[15:0]	data
    );

	reg		[15:0]		addr;
	parameter  fword = 1;
//addr
always @(posedge clk or posedge rst) begin
	if (rst) begin
		addr <= 'd0;
	end
	else if (ena == 1'b1) begin
		addr <= addr + fword;
	end
	else begin
		addr <= 'd0;
	end
end
//例化sinrom IP
sinrom sinrom_inst (
  .clka(clk),    // input wire clka
  .ena(ena),      // input wire ena
  .addra(addr),  // input wire [15 : 0] addra
  .douta(data)  // output wire [15 : 0] douta
);
endmodule

三、仿真文件的编写

同第二步的操作,点击加号添加仿真文件,测试代码如下。

`timescale 1ns / 1ps

module tb_sinrom(

    );
	reg				clk;
	reg				rst;
	reg				ena;
	wire	[15:0]	data;

	initial begin
		clk = 1'b0;
	end
	always #10 clk = ~clk;
	initial begin
		rst = 1'b1;
		ena = 1'b1;
		#200
		rst = 1'b0;
	end

	dds_top inst_dds_top (
		.clk(clk), 
		.rst(rst), 
		.ena(ena), 
		.data(data)
	);
endmodule

保存就可以看到测试文件已经将顶层和ROM IP核包含了。

四、进行仿真验证

点击左侧菜单栏中的 run simulation,即可看到仿真波形。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 将输出数据data的值设置为无符号的十进制以及波形形式设置为模拟波形,即可看到正弦波,如果只看到一点波形,可以多跑10ms。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 下面是之前写的博客,里面介绍DDS的相关原理以及参数设定含义,并实现两路波形的混频操作。

【Vivado DDS IP核】Vivado的DDS IP核使用以及混频操作_m0_61298445的博客-CSDN博客https://blog.csdn.net/m0_61298445/article/details/122442678?spm=1001.2014.3001.5501

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linest-5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值