我是靠谱客的博主 丰富大叔,最近开发中收集的这篇文章主要介绍【Xilinx DDS】Vivado代码实现FPGA DDS实验目的一、调用ROM IP核二、生成顶层模块三、仿真文件的编写四、进行仿真验证,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

 

实验目的

一、调用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

 

最后

以上就是丰富大叔为你收集整理的【Xilinx DDS】Vivado代码实现FPGA DDS实验目的一、调用ROM IP核二、生成顶层模块三、仿真文件的编写四、进行仿真验证的全部内容,希望文章能够帮你解决【Xilinx DDS】Vivado代码实现FPGA DDS实验目的一、调用ROM IP核二、生成顶层模块三、仿真文件的编写四、进行仿真验证所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部