网上一些代码写的不是很清楚,在我学习的时候造成了很大困扰,因此我将我学习过程中的一点想法以及代码放在这里,对于不明白如何使用DDS乃至IPcore的初学者朋友,这篇文章也许能帮助到你。
生成DDS IP
在vivado界面中,点击IP Catalog,并搜索DDS,双击DDS Compiler进入DDS的编辑界面。
下面我写一下我的设置:
注意:在点击finish之后会有generate IPcore的设定,在这里我选择了Global才没有报错,不知道是不是我的问题。
调用代码和测试代码
调用
然后写顶层文件的代码
调用的函数可以参考IPsources中对应的IPcore中以veo结尾的那个文件
没被注释掉的部分就是调用示例
顶层模块
module DDS_top(
input aclk,
output m_axis_data_tvalid,
output [15:0] m_axis_data_tdata
);
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
dds_compiler_0 your_instance_name (
.aclk(aclk), // input wire aclk
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata) // output wire [15 : 0] m_axis_data_tdata
);
endmodule
testbench
`timescale 1ns / 1ps
module dds_tb(
);
// inputs
reg clk;
// outputs
wire m_axis_data_tvalid;
// wire [31:0] m_axis_data_tdata;
wire [15:0] output_sin;
// assign output_cos = m_axis_data_tdata[31:16];
DDS_top uut(
.aclk(clk),
.m_axis_data_tvalid(m_axis_data_tvalid),
.m_axis_data_tdata(output_sin)
);
initial
begin
#0 clk = 0;
// Wait 100 ns for global reset to finish
#100 ;
forever
#5 clk =~clk;
end
endmodule
仿真结果
这里输出的数据中需要对数据的表示进行调整:
用有符号数表示
以及以模拟形式表示
调整设置,生成sin和cos 的信号
设置如下:
代码:
verilog: cos_sin.v
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/07/14 09:24:52
// Design Name:
// Module Name: sin_cos
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module sin_cos(
input wire aclk,
output wire m_axis_data_tvalid,
output wire [31 : 0] m_axis_data_tdata,
output wire m_axis_phase_tvalid,
output wire [15 : 0] m_axis_phase_tdata
);
dds_compiler_0 dds0 (
.aclk(aclk), // input wire aclk
.m_axis_data_tvalid(m_axis_data_tvalid), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata), // output wire [31 : 0] m_axis_data_tdata
.m_axis_phase_tvalid(m_axis_phase_tvalid), // output wire m_axis_phase_tvalid
.m_axis_phase_tdata(m_axis_phase_tdata) // output wire [15 : 0] m_axis_phase_tdata
);
endmodule
testbench:
`timescale 1ns / 1ps
module sin_cos_tb(
);
// inputs
reg clk;
// outputs
wire [31 : 0] m_axis_data_tdata;
wire m_axis_phase_tvalid;
wire [15 : 0] m_axis_phase_tdata;
wire [11:0] sin;
wire [11:0] cos;
wire [11:0] phase;
assign sin = m_axis_data_tdata[27:16];
assign cos = m_axis_data_tdata[11:0];
assign phase = m_axis_phase_tdata[11:0];
sin_cos sin_cos0 (
.aclk(clk),
.m_axis_data_tvalid(m_axis_data_tvalid),
.m_axis_data_tdata(m_axis_data_tdata),
.m_axis_phase_tvalid(m_axis_phase_tvalid),
.m_axis_phase_tdata(m_axis_phase_tdata)
);
initial
begin
#0 clk = 0;
// Wait 100 ns for global reset to finish
forever
#5 clk =~clk;
end
endmodule
仿真结果: