1 DDS IP概述
直接數(shù)字合成器(DDS)或數(shù)控振蕩器(NCO)是許多數(shù)字通信系統(tǒng)中的重要部件。正交合成器用于構(gòu)造數(shù)字下變頻器和上變頻器、解調(diào)器,并實(shí)現(xiàn)各種類型的調(diào)制方案,包括PSK(相移鍵控)、FSK(頻移鍵控(frequency shift keying))和MSK(minimum shift keyed)。
數(shù)字生成復(fù)數(shù)或?qū)崝?shù)正弦曲線采用查找表方案。查找表存儲(chǔ)正弦曲線的樣本。數(shù)字積分器用于生成合適的相位自變量,該相位自變量由查找表映射到期望的輸出波形。簡(jiǎn)單的用戶界面接受系統(tǒng)級(jí)參數(shù),例如所需的輸出頻率和所生成波形的雜散抑制。
?相位生成器和SIN/COS查找表可以單獨(dú)生成,也可以與可選抖動(dòng)一起生成,以提供完整的DDS解決方案。
?光柵化功能消除了相位截?cái)喈a(chǎn)生的相位噪聲。
?正弦、余弦或正交輸出。
?可選的累積相位的每通道重新同步。
?查找表可以存儲(chǔ)在分布式或塊RAM中。
?可選相位抖動(dòng)擴(kuò)展譜線能量,以獲得更大的雜散自由動(dòng)態(tài)范圍(SFDR)。
?相位抖動(dòng)或泰勒級(jí)數(shù)校正選項(xiàng)使用最少的FPGA資源提供高動(dòng)態(tài)范圍信號(hào)。支持18dB到150dB的SFDR。
?多達(dá)16個(gè)獨(dú)立的時(shí)分復(fù)用信道。
?使用高達(dá)48位相位累加器的精細(xì)頻率分辨率,帶有DSP切片或FPAGA邏輯選項(xiàng)。
?3位至26位帶符號(hào)輸出采樣精度
IP 文檔連接:PG141
2 DDS IP 架構(gòu)
3 DDS IP 配置
(1)Component Name 可以修改IP核名字
(2)Configuration options 配置選項(xiàng):這里我們選擇phase generator and sin cos LUT
(3)system clock(系統(tǒng)時(shí)鐘) 100MHz(范圍0.01—1000MHZ);通過(guò)奈奎斯特定理可知,最大輸出的頻率為50MHz,實(shí)際測(cè)得輸出最大頻率為50MHz,當(dāng)輸出的頻率超過(guò)25MHz的時(shí)候頻率就開(kāi)始不穩(wěn)定;要想輸出更大的頻率,可以通過(guò)增加系統(tǒng)時(shí)鐘來(lái)實(shí)現(xiàn);
(4)Number of channels(通道數(shù)選擇) 1;最多可以選擇16個(gè)通道輸出,本項(xiàng)目為實(shí)現(xiàn)任意可調(diào)頻率輸出只用到單通道輸出即可;
(5)Frequency per channel (每通道頻率)100MHz;通過(guò)系統(tǒng)時(shí)鐘除以通道數(shù)得到每通道的頻率;
(6)Parameter selection (參數(shù)選擇) system parameters;系統(tǒng)參數(shù),為了更精確的輸出任意頻率,選擇系統(tǒng)參數(shù)模式;
(7)Spurious free dynamic range(偽動(dòng)態(tài)自由范圍)48(決定輸出正余弦數(shù)據(jù)位寬n,范圍為6*(n-1)~6*n,后面選擇正弦或者余弦輸出時(shí)位寬為8位,如果正余弦同時(shí)輸出則位寬為16位,正弦為高8位,余弦為低8位)
(9)Frequency resolution(頻率分辨率) 0.02910383045673370361328125(決定相位位寬,由相位位寬函數(shù)可得出頻率分辨率,分辨率越精確,可調(diào)輸出頻率越精確,相位位寬函數(shù)在后面講到)
(10)Noise shaping(噪聲整形):控制是否相位截?cái)?、抖?dòng)或泰勒級(jí)數(shù)校正使用;
1)Phase increment programmability(相位增量可編程性)
Fixed(固定模式);固定輸出頻率,不可任意調(diào)整;
Programmable(可編程模式);根據(jù)設(shè)計(jì)需求選擇相位增量可編程模式,通過(guò)頻率輸出函數(shù)可知,輸入不同相位增量時(shí)可輸出不同頻率,頻率輸出函數(shù)后面講到;
Streaming(流水模式);
(2)Phase offset programmability
None(無(wú));選擇無(wú)相位偏移;
Fixed(固定模式);固定相位偏移;
Programmable(可編程模式);可以調(diào)整波形相位;
Streaming(流水模式);
(3)Output selection(輸出選擇)
Sine and cosine(正弦和余弦);如果用到正弦和余弦同時(shí)輸出,則高8位表示正弦輸出,低8位表示余弦輸出;
Sine(正弦);選擇正弦輸出即可;
Cosine (余弦);
(4)Polarity (極性)沒(méi)用上,不用選;
Negative sine(負(fù)極性正弦);
Negative cosine(負(fù)極性余弦);
(5)Implementation options(實(shí)現(xiàn)選項(xiàng))
Memory type(內(nèi)存類型:它控制SIN/COS查找表的實(shí)現(xiàn)):auto默認(rèn)選擇自動(dòng)、distribution rom(分布rom)、block rom(塊rom)
Optimization goal(優(yōu)化目標(biāo):選擇控制實(shí)現(xiàn)決策的目標(biāo)是最高速度還是最低資源):auto默認(rèn)選擇自動(dòng)、area(區(qū)域)、speed(速度)
DSP48 use(控制相位累加器和后續(xù)添加階段(相位偏移或抖動(dòng)噪聲添加)的實(shí)現(xiàn)):minimal(默認(rèn)最?。?、maximal(最大)
4 FPGA 實(shí)驗(yàn)
調(diào)用DDS IP核實(shí)現(xiàn)掃頻信號(hào),我這里設(shè)計(jì)的掃頻范圍是1KHz–10KHz,通過(guò)控制頻率控制字來(lái)更改輸出的波形的頻率,讓其在1KHz到10KHz直接變化,又讓其從10KHz變化到1KHz。
DDS_top:
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
dds_ctl
//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
);
//參數(shù)定義
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變化精度
//信號(hào)定義
reg [31:0] config_data_reg ;//頻率控制字寄存器
reg max_flag ;//當(dāng)頻率控制字最大時(shí),拉高
//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;//設(shè)置相位控制字為0
assign config_tvalid = 1'b1;
assign config_tdata = config_data_reg;
endmodule
tb
`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
仿真波形: