1 DDS IP概述
•相位生成器和SIN/COS查找表可以单独生成,也可以与可选抖动一起生成,以提供完整的DDS解决方案。
•光栅化功能消除了相位截断产生的相位噪声。
•正弦、余弦或正交输出。
•可选的累积相位的每通道重新同步。
•查找表可以存储在分布式或块RAM中。
•可选相位抖动扩展谱线能量,以获得更大的杂散自由动态范围(SFDR)。
•相位抖动或泰勒级数校正选项使用最少的FPGA资源提供高动态范围信号。支持18dB到150dB的SFDR。
•多达16个独立的时分复用信道。
•使用高达48位相位累加器的精细频率分辨率,带有DSP切片或FPAGA逻辑选项。
•3位至26位带符号输出采样精度
2 DDS IP 架构
3 DDS IP 配置
4 FPGA 实验
module dds_top(
input wire aclk,
input wire reset_n,
output valid,
output signed [7:0] sin,
output signed [7:0] cos
);
wire s_axis_phase_tvalid;
wire [31 : 0] s_axis_phase_tdata;
wire s_axis_config_tvalid;
wire [31 : 0] s_axis_config_tdata;
wire m_axis_data_tvalid;
wire [15 : 0] m_axis_data_tdata;//输出为16位,高8位是sin波形,低8位是cos波
wire m_axis_phase_tvalid;
wire [31 : 0] m_axis_phase_tdata;
assign valid = m_axis_data_tvalid;
assign sin =m_axis_data_tdata[15:8];
assign cos =m_axis_data_tdata[7:0];
dds_ctl Udds_ctl(
.aclk(aclk),//100mhz
.reset_n(reset_n),
.phase_tvalid(s_axis_phase_tvalid),
.phase_tdata(s_axis_phase_tdata),
.config_tvalid(s_axis_config_tvalid),
.config_tdata(s_axis_config_tdata)
);
dds_compiler_0 UDDS (
.aclk(aclk), // input wire aclk
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(s_axis_phase_tdata), // input wire [31 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(s_axis_config_tdata), // input wire [31 : 0] s_axis_config_tdata
.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
.m_axis_phase_tvalid(m_axis_phase_tvalid), // output wire m_axis_phase_tvalid
.m_axis_phase_tdata(m_axis_phase_tdata) // output wire [31 : 0] m_axis_phase_tdata
);
endmodule
//config_tdata -- detla=Fout*2^32/Fclk
module dds_ctl(
input aclk,//100mhz
input reset_n,
output wire phase_tvalid,
output wire [31 : 0] phase_tdata,
output wire config_tvalid,
output wire [31 : 0] config_tdata
);
//参数定义
parameter F_word_1KHz = 32'hA7C5 ;//1KHz频率控制字 M = 1_000*2^32/100_000_000
parameter F_word_10KHz = 32'h68DB8 ;//10KHz频率控制字 M = 10_000*2^32/100_000_000
parameter F_word_change = 32'h1 ;//1KHz-10KHz变化精度
//信号定义
reg [31:0] config_data_reg ;//频率控制字寄存器
reg max_flag ;//当频率控制字最大时,拉高
//max_flag
always @(posedge aclk or negedge reset_n)begin
if(!reset_n)begin
max_flag <= 1'b0;
end
else if(config_data_reg >= F_word_10KHz)begin
max_flag <= 1'b1;
end
else if(config_data_reg == F_word_1KHz)begin
max_flag <= 1'b0;
end
end
//控制频率控制字均匀变化
always @(posedge aclk or negedge reset_n)begin
if(!reset_n)begin
config_data_reg <= F_word_1KHz;
end
else if(max_flag == 1'b1)begin
config_data_reg <= config_data_reg - F_word_change;
end
else begin
config_data_reg <= config_data_reg + F_word_change;
end
end
//输出
assign phase_tvalid = 1'b1;
assign phase_tdata = 32'h0;//设置相位控制字为0
assign config_tvalid = 1'b1;
assign config_tdata = config_data_reg;
endmodule
`timescale 1ns / 1ps
module tb(
);
reg aclk;
reg reset_n;
wire valid;
wire signed [7:0] sin;
wire signed [7:0] cos;
initial begin
aclk =0;
reset_n =0;
#1000;
reset_n =1;
end
always #(5) aclk =~aclk;
dds_top Udds_top(
.aclk(aclk),
.reset_n(reset_n),
.valid(valid),
.sin(sin),
.cos(cos)
);
endmodule
- THE END -
🍁
往期精选
FPGA技术江湖广发江湖帖
无广告纯净模式,给技术交流一片净土,从初学小白到行业精英业界大佬等,从军工领域到民用企业等,从通信、图像处理到人工智能等各个方向应有尽有,QQ微信双选,FPGA技术江湖打造最纯净最专业的技术交流学习平台。
FPGA技术江湖微信交流群
加群主微信,备注姓名+学校/公司+专业/岗位进群
FPGA技术江湖QQ交流群
备注姓名+学校/公司+专业/岗位进群