DDS,Director Digital Synthesis,直接頻率合成技術(shù),是指通過固定頻率的參考時鐘(采樣時鐘)生成指定頻率的正余弦信號。采用FPGA配合DAC芯片,可以實現(xiàn)頻率、相位可調(diào)的模擬信號用于一些特定的領(lǐng)域。
01、DDS-IP核理論部分
1.1、4個重要概念
PINC, Phase Increase,頻率控制字,用于生成期望頻率的波形數(shù)據(jù);
POFF, Phase Offset,相位控制字,用于生成期望初始相位的波形數(shù)據(jù);
Spurious Free Dynamic Range (dB),無雜散動態(tài)范圍,用于調(diào)整正弦和余弦輸出數(shù)據(jù)的位寬,假設(shè)需要的正弦和余弦輸出數(shù)據(jù)的位寬是16bit,動態(tài)范圍的數(shù)值設(shè)置為16*6 = 96 ;
Frequency Resolution(Hz),頻率分辨率,IP核輸出正余弦信號能夠達(dá)到的最小頻率。參考時鐘/采樣時鐘(f_clk)、頻率控制字(delta_theta)、輸出頻率(f_out),三個變量之間的計算關(guān)系如下:
上述公式中2^n(公式中的分母),n取決于頻率分辨率,分辨率越小,n的數(shù)值越大,頻率控制字(delta_theta)的位寬越大。
相位控制字與位寬n之間的關(guān)系如下:
POFF = phase * (2^n-1)/360,比如期望輸出的正弦波初始相位是90度,那么POFF = 90* (2^n-1)/360 = (2^n-1)/4。
1.1.1、輸出信號的頻率f_out和頻率控制字delta_theta之間的關(guān)系
前面的公式:
假設(shè)系統(tǒng)的參考時鐘是f_clk=250MHz, 通過公式易知,頻率控制字delta_theta的取值范圍還是0 ~ 2^n,對應(yīng)輸出信號的頻率,其取值范圍是0~f_clk。根據(jù)采樣定理,所產(chǎn)生的信號頻率不能超過時鐘頻率(采樣時鐘頻率,250Mhz)的一半,在實際應(yīng)用中,為了保證信號的輸出質(zhì)量,輸出頻率不要高于時鐘頻率的33%,以免混疊或諧波落入有用輸出頻帶內(nèi)。
1.2、DDS-IP 核配置
step1:在Ip-catalog中搜索dds,找到 DDS Compiler。
step2:設(shè)置PINC/POFF的數(shù)據(jù)形式,F(xiàn)ixed-Programmable-Streaming。
三種模式的區(qū)別如下:
Fixed是固定相位增量,IP核運行過程中不可更改,即輸出的信號頻率固定不變;
Programmable可編程,可在DDS運行過程中隨時寫入頻率控制字改變輸出波形的頻率,用于偶爾改變頻率;
Streaming應(yīng)用于頻繁改變頻率。
輸出信號如果勾選為正弦和余弦信號,輸出信號的結(jié)果如下:高位bit31:16為正弦信號,低位bit15:0為余弦信號。
step3:IP核復(fù)位信號
step4:IP核配置summary
02、DDS-IP核應(yīng)用部分
2.1 、使用DDS-IP 核合成高頻信號
工程需求 :參考時鐘是250MHz,使用8路DDS合成具備2G采樣率的信號,輸出到DAC芯片。
解決方案 :參考時鐘是250MHz,周期為4ns,2G采樣率的信號,采樣周期為0.5ns,使用DDS-IP核輸出250MHz的信號,相鄰2個采樣點之間的時間間隔是4ns,要滿足2G采樣率,原始4ns的周期內(nèi)需要有8個采樣點,DDS-IP核的信號輸出通過移相實現(xiàn),每個DDS-IP核移相的大小為頻率控制字的1/8。
2.2、代碼實現(xiàn)
邏輯代碼頂層,模擬DAC芯片內(nèi)部2G采樣時鐘信號,對8路DDS-IP核的輸出信號連續(xù)采樣,合成高頻信號。
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/06/09 19:15:35
// Design Name:
// Module Name: dds_ctrl
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module dds_ctrl(
input wire sclk,
input wire sclk_2gHz,
input wire rst_n,
input wire s_axis_phase_tvalid, // 初始相位控制字
input wire [23:0] s_axis_phase_tdata,
input wire s_axis_config_tvalid,
input wire [23:0] s_axis_config_tdata, // 頻率控制字
output wire m_axis_data_tvalid0,
output wire [15:0] m_axis_data_tdata0,
output wire m_axis_data_tvalid1,
output wire [15:0] m_axis_data_tdata1,
output wire m_axis_data_tvalid2,
output wire [15:0] m_axis_data_tdata2,
output wire m_axis_data_tvalid3,
output wire [15:0] m_axis_data_tdata3,
output wire m_axis_data_tvalid4,
output wire [15:0] m_axis_data_tdata4,
output wire m_axis_data_tvalid5,
output wire [15:0] m_axis_data_tdata5,
output wire m_axis_data_tvalid6,
output wire [15:0] m_axis_data_tdata6,
output wire m_axis_data_tvalid7,
output wire [15:0] m_axis_data_tdata7,
output wire analog_data_valid,
output wire [127:0] analog_data_128bit,
output reg [2:0] cnt,
output reg [15:0] sample_data
);
wire [23: 0] config_pinc_0;
wire [23: 0] config_poff_0;
wire [23: 0] config_pinc_1;
wire [23: 0] config_poff_1;
wire [23: 0] config_pinc_2;
wire [23: 0] config_poff_2;
wire [23: 0] config_pinc_3;
wire [23: 0] config_poff_3;
wire [23: 0] config_pinc_4;
wire [23: 0] config_poff_4;
wire [23: 0] config_pinc_5;
wire [23: 0] config_poff_5;
wire [23: 0] config_pinc_6;
wire [23: 0] config_poff_6;
wire [23: 0] config_pinc_7;
wire [23: 0] config_poff_7;
assign analog_data_valid = m_axis_data_tvalid0 |m_axis_data_tvalid1 | m_axis_data_tvalid2 |m_axis_data_tvalid3 | m_axis_data_tvalid4 |m_axis_data_tvalid5 | m_axis_data_tvalid6 | m_axis_data_tvalid7;
assign analog_data_128bit ={ m_axis_data_tdata0,
m_axis_data_tdata1,
m_axis_data_tdata2,
m_axis_data_tdata3,
m_axis_data_tdata4,
m_axis_data_tdata5,
m_axis_data_tdata6,
m_axis_data_tdata7
};
mux1_8 inst_mux1_8 (
.sclk (sclk),
.rst_n (rst_n) ,
.config_pinc (s_axis_config_tdata) , // 頻率控制字
.config_poff (s_axis_phase_tdata), // 初始相位控制字
.poff_dds_ctrl (s_axis_config_tdata),
.config_pinc_0 (config_pinc_0) ,
.config_poff_0 (config_poff_0) ,
.config_pinc_1 (config_pinc_1) ,
.config_poff_1 (config_poff_1) ,
.config_pinc_2 (config_pinc_2) ,
.config_poff_2 (config_poff_2) ,
.config_pinc_3 (config_pinc_3) ,
.config_poff_3 (config_poff_3) ,
.config_pinc_4 (config_pinc_4) ,
.config_poff_4 (config_poff_4) ,
.config_pinc_5 (config_pinc_5) ,
.config_poff_5 (config_poff_5) ,
.config_pinc_6 (config_pinc_6) ,
.config_poff_6 (config_poff_6) ,
.config_pinc_7 (config_pinc_7) ,
.config_poff_7 (config_poff_7)
);
dds_compiler_0 your_instance_name0 (
.aclk(sclk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(config_poff_0), // input wire [23 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_pinc_0), // input wire [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid0), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata0) // output wire [15 : 0] m_axis_data_tdata
);
dds_compiler_0 your_instance_name1 (
.aclk(sclk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(config_poff_1), // input wire [23 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_pinc_1), // input wire [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid1), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata1) // output wire [15 : 0] m_axis_data_tdata
);
dds_compiler_0 your_instance_name2 (
.aclk(sclk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(config_poff_2), // input wire [23 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_pinc_2), // input wire [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid2), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata2) // output wire [15 : 0] m_axis_data_tdata
);
dds_compiler_0 your_instance_name3 (
.aclk(sclk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(config_poff_3), // input wire [23 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_pinc_3), // input wire [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid3), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata3) // output wire [15 : 0] m_axis_data_tdata
);
dds_compiler_0 your_instance_name4 (
.aclk(sclk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(config_poff_4), // input wire [23 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_pinc_4), // input wire [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid4), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata4) // output wire [15 : 0] m_axis_data_tdata
);
dds_compiler_0 your_instance_name5 (
.aclk(sclk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(config_poff_5), // input wire [23 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_pinc_5), // input wire [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid5), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata5) // output wire [15 : 0] m_axis_data_tdata
);
dds_compiler_0 your_instance_name6 (
.aclk(sclk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(config_poff_6), // input wire [23 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_pinc_6), // input wire [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid6), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata6) // output wire [15 : 0] m_axis_data_tdata
);
dds_compiler_0 your_instance_name7 (
.aclk(sclk), // input wire aclk
.aresetn(rst_n), // input wire aresetn
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(config_poff_7), // input wire [23 : 0] s_axis_phase_tdata
.s_axis_config_tvalid(s_axis_config_tvalid), // input wire s_axis_config_tvalid
.s_axis_config_tdata(config_pinc_7), // input wire [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid(m_axis_data_tvalid7), // output wire m_axis_data_tvalid
.m_axis_data_tdata(m_axis_data_tdata7) // output wire [15 : 0] m_axis_data_tdata
);
reg [15:0] sample_data;
//(* keep = "true" *) reg [2:0] cnt;
always @(posedge sclk_2gHz or negedge rst_n) begin
if (~rst_n) begin
cnt <= 3'b0;
end
else if (analog_data_valid == 1'b1) begin
if (cnt == 3'd7) begin
cnt <= 3'b0;
end
else begin
cnt <= cnt + 1'b1;
end
end
else begin
cnt <= 3'b0;
end
end
always @(posedge sclk_2gHz or negedge rst_n ) begin
if (~rst_n) begin
sample_data <= 16'b0;
end
else begin
case (cnt)
3'd0: sample_data <= m_axis_data_tdata0;
3'd1: sample_data <= m_axis_data_tdata1;
3'd2: sample_data <= m_axis_data_tdata2;
3'd3: sample_data <= m_axis_data_tdata3;
3'd4: sample_data <= m_axis_data_tdata4;
3'd5: sample_data <= m_axis_data_tdata5;
3'd6: sample_data <= m_axis_data_tdata6;
3'd7: sample_data <= m_axis_data_tdata7;
endcase
end
end
endmodule
DDS-IP核移相實現(xiàn)過程
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/06/09 19:20:43
// Design Name:
// Module Name: mux1_8
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module mux1_8(
input wire sclk,
input wire rst_n,
input wire [23: 0] config_pinc, // 頻率控制字
input wire [23: 0] config_poff, // 初始相位控制字
input wire [23: 0] poff_dds_ctrl, // dds 相位偏移控制
output wire [23: 0] config_pinc_0,
output wire [23: 0] config_poff_0,
output wire [23: 0] config_pinc_1,
output wire [23: 0] config_poff_1,
output wire [23: 0] config_pinc_2,
output wire [23: 0] config_poff_2,
output wire [23: 0] config_pinc_3,
output wire [23: 0] config_poff_3,
output wire [23: 0] config_pinc_4,
output wire [23: 0] config_poff_4,
output wire [23: 0] config_pinc_5,
output wire [23: 0] config_poff_5,
output wire [23: 0] config_pinc_6,
output wire [23: 0] config_poff_6,
output wire [23: 0] config_pinc_7,
output wire [23: 0] config_poff_7
);
/*--------------- DDS 相位偏移作為輸入參數(shù)傳入 ------------------*/
// localparam poff_dds_ctrl = 4194303 ; // 2^22-1
//localparam poff_dds_ctrl = 176161 ; // 10Mhz 2^22-1 360度 的 1/25-周期(167773)
// localparam poff_dds_ctrl = 335544 ; // 20Mhz
// localparam poff_dds_ctrl = 838861 ; // 50Mhz
// localparam poff_dds_ctrl = 1677721 ; // 100 Mhz
// localparam poff_dds_ctrl = 4194303 > > 1 ; // 125 Mhz --(2097151)
// localparam poff_dds_ctrl = 2642415 ; // 150 Mhz
// localparam poff_dds_ctrl = 4194303 > > 2 ; // 250 Mhz
assign config_pinc_0 = config_pinc;
assign config_pinc_1 = config_pinc;
assign config_pinc_2 = config_pinc;
assign config_pinc_3 = config_pinc;
assign config_pinc_4 = config_pinc;
assign config_pinc_5 = config_pinc;
assign config_pinc_6 = config_pinc;
assign config_pinc_7 = config_pinc;
assign config_poff_0 = config_poff;
assign config_poff_1 = config_poff+ (poff_dds_ctrl > > 3);
assign config_poff_2 = config_poff+ (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3);
assign config_poff_3 = config_poff+ (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3);
assign config_poff_4 = config_poff+ (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3);
assign config_poff_5 = config_poff+ (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3);
assign config_poff_6 = config_poff+ (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3);
assign config_poff_7 = config_poff+ (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3) + (poff_dds_ctrl > > 3);
endmodule
仿真激勵文件
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/06/08 19:56:44
// Design Name:
// Module Name: tb_top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module tb_top(
);
reg aclk;
reg sclk_2gHz;
reg rst_n;
reg s_axis_phase_tvalid;
reg [23:0] s_axis_phase_tdata;
reg s_axis_config_tvalid;
reg [23:0] s_axis_config_tdata;
wire m_axis_data_tvalid0;
wire m_axis_data_tvalid1;
wire m_axis_data_tvalid2;
wire m_axis_data_tvalid3;
wire m_axis_data_tvalid4;
wire m_axis_data_tvalid5;
wire m_axis_data_tvalid6;
wire m_axis_data_tvalid7;
wire [15:0] m_axis_data_tdata0;
wire [15:0] m_axis_data_tdata1;
wire [15:0] m_axis_data_tdata2;
wire [15:0] m_axis_data_tdata3;
wire [15:0] m_axis_data_tdata4;
wire [15:0] m_axis_data_tdata5;
wire [15:0] m_axis_data_tdata6;
wire [15:0] m_axis_data_tdata7;
wire analog_data_valid;
wire [127:0] analog_data_128bit;
wire [15:0] sample_data;
wire [2:0] cnt;
initial begin
s_axis_config_tvalid = 1'b1;
//s_axis_config_tdata = 24'd16777; // ---1 MHZ 頻率控制字
//s_axis_config_tdata = 24'd167770; // ---10MHZ 頻率控制字 --- 由頻率分辨率決定 --- (10*10^6*2^22)/250*10^6 = (0.0167772)* 10*10^6 = 167770
//s_axis_config_tdata = 24'd335540; // ---20MHZ 頻率控制字
//s_axis_config_tdata = 24'd838850; // ---50MHZ 頻率控制字
//s_axis_config_tdata = 24'd1677700; // ---100MHZ 頻率控制字
//s_axis_config_tdata = 24'd2097125; // ---125MHZ 頻率控制字
//s_axis_config_tdata = 24'd2516550; // ---150MHZ 頻率控制字
s_axis_config_tdata = 24'd4194250; // ---250MHZ 頻率控制字
//s_axis_config_tdata = 4194250 < < 1; // ---500MHZ 頻率控制字
//s_axis_phase_tdata = 24'd0; // --- 相位控制字 - 0度
s_axis_phase_tdata = 24'd524288; // --- 相位控制字 - 45度
//s_axis_phase_tdata = 24'd1048576; // --- 相位控制字 - 90度
s_axis_phase_tvalid = 1'b1;
rst_n = 0;
#10
rst_n = 1;
//#1000
//s_axis_phase_tdata = 24'd1048576; // --- 相位控制字 - 90度
//#500
//s_axis_phase_tdata = 24'd524288; // --- 相位控制字 - 45度
end
initial
begin
aclk = 0; forever #2 aclk = ~aclk;
end
initial
begin
sclk_2gHz = 0; forever #0.25 sclk_2gHz = ~sclk_2gHz;
end
dds_ctrl your_dds_ctrl (
.sclk(aclk), // input wire aclk
.sclk_2gHz(sclk_2gHz),
.rst_n(rst_n),
.s_axis_phase_tvalid(s_axis_phase_tvalid), // input wire s_axis_phase_tvalid
.s_axis_phase_tdata(s_axis_phase_tdata), // input wire [23 : 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 [23 : 0] s_axis_config_tdata
.m_axis_data_tvalid0(m_axis_data_tvalid0), // output wire m_axis_data_tvalid
.m_axis_data_tdata0(m_axis_data_tdata0), // output wire [15 : 0] m_axis_data_tdata
.m_axis_data_tvalid1(m_axis_data_tvalid1),
.m_axis_data_tdata1(m_axis_data_tdata1), // output wire [15 : 0] m_axis_data_tdata
.m_axis_data_tvalid2(m_axis_data_tvalid2),
.m_axis_data_tdata2(m_axis_data_tdata2), // output wire [15 : 0] m_axis_data_tdata
.m_axis_data_tvalid3(m_axis_data_tvalid3),
.m_axis_data_tdata3(m_axis_data_tdata3), // output wire [15 : 0] m_axis_data_tdata
.m_axis_data_tvalid4(m_axis_data_tvalid4),
.m_axis_data_tdata4(m_axis_data_tdata4), // output wire [15 : 0] m_axis_data_tdata
.m_axis_data_tvalid5(m_axis_data_tvalid5),
.m_axis_data_tdata5(m_axis_data_tdata5), // output wire [15 : 0] m_axis_data_tdata
.m_axis_data_tvalid6(m_axis_data_tvalid6),
.m_axis_data_tdata6(m_axis_data_tdata6), // output wire [15 : 0] m_axis_data_tdata
.m_axis_data_tvalid7(m_axis_data_tvalid7),
.m_axis_data_tdata7(m_axis_data_tdata7), // output wire [15 : 0] m_axis_data_tdata
.analog_data_valid(analog_data_valid),
.analog_data_128bit(analog_data_128bit),
.cnt(cnt),
.sample_data(sample_data)
);
endmodule
2.3、仿真驗證結(jié)果
圖2-3-1、生成50Mhz正弦波信號,采樣率為2G
圖2-3-2、生成100Mhz正弦波信號,采樣率為2G
圖2-3-3、生成250Mhz正弦波信號,采樣率為2G
2.4、仿真驗證總結(jié)
1、單個DDS調(diào)制模塊在使用的時候,如果輸出頻率高于采用時鐘頻率的一半時候,DDS輸出信號會失真。比如設(shè)置輸出頻率超過時鐘頻率的一半(大于125Mhz),導(dǎo)致單個DDS輸出信號失真。實驗發(fā)現(xiàn)盡管單個DDS輸出信號失真,整合后的輸出信號(8路DDS移相后輸出)仍然可以保證設(shè)置的信號頻率,比如圖2-3-3中單個DDS輸出信號失真,但是合成后的信號依然質(zhì)量較高;
2、每個DDS-IP核移相的大小為頻率控制字的1/8,頻率控制字的位寬為24bits,頻率分辨率為100hz, 即整個DDS模塊可以輸出頻率為100hz或者100hz整數(shù)倍的波形數(shù)據(jù)。頻率控制字的位寬決定了頻率分辨率的大小,頻率控制字的位寬越大,DDS輸出信號的頻率分辨率越小,系統(tǒng)輸出信號的頻率范圍越寬。
2.5、板級測試結(jié)果
圖2-5-1 50Mhz正弦波信號,通過采樣率為2G的DAC芯片輸出模擬信號
圖2-5-2 250Mhz正弦波信號,通過采樣率為2G的DAC芯片輸出模擬信號
-
FPGA
+關(guān)注
關(guān)注
1629文章
21748瀏覽量
603958 -
時鐘
+關(guān)注
關(guān)注
11文章
1735瀏覽量
131543 -
DDS
+關(guān)注
關(guān)注
21文章
634瀏覽量
152714 -
IP核
+關(guān)注
關(guān)注
4文章
329瀏覽量
49520 -
輸出信號
+關(guān)注
關(guān)注
0文章
284瀏覽量
11879
發(fā)布評論請先 登錄
相關(guān)推薦
評論