之前的文章對(duì)dds ip 的結(jié)構(gòu)、精度、參數(shù)、接口進(jìn)行了詳細(xì)的說(shuō)明,本文通過(guò)例化仿真對(duì)該IP的實(shí)際使用進(jìn)行演示。本文例化固定模式和可配置模式兩種模式分別例化ip并仿真,說(shuō)明該IP的應(yīng)用。
1、固定模式:
該模式下IP的參數(shù)設(shè)置如下圖,時(shí)鐘頻率設(shè)置為100Mhz,兩個(gè)通道時(shí)分復(fù)用,SFDR 60dB.
然后相位、相位偏差全部選擇固定模式,
輸出頻率配置為1Mhz和2Mhz:
設(shè)置完之后再summary這里可以看到該IP的實(shí)現(xiàn)細(xì)節(jié),輸出位寬10bit,2ch,沒(méi)ch的時(shí)鐘速率是50Mhz,使用一個(gè)M18K的BROM實(shí)現(xiàn)查找表等等的一些細(xì)節(jié)。
在additional summary里邊可以看到相應(yīng)的頻率控制字和實(shí)際精度,因?yàn)楫?dāng)前設(shè)置的時(shí)標(biāo)準(zhǔn)模式不是柵格(rasterized)模式,所以輸出是有頻偏的。
上述設(shè)置生成的IP端口如下,輸入端口為時(shí)鐘復(fù)位信號(hào),輸出sin cos和phase值。
dds_compiler_0 your_instance_name (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.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 [31 : 0] m_axis_phase_tdata
);
這個(gè)IP的tb就非常簡(jiǎn)單了,只有提供時(shí)鐘復(fù)位即可,但是輸出時(shí)時(shí)分復(fù)用的,所以tb對(duì)輸出信號(hào)進(jìn)行了處理將兩路輸出分開(kāi)了,方便波形觀察,如下:
`timescale 1ns/100ps
module tb_dds_fix_normal ;
reg aclk = 'd0;
reg aresetn = 'd0;
wire m_axis_data_tvalid ;
wire [31 : 0] m_axis_data_tdata ;
wire m_axis_phase_tvalid ;
wire [31 : 0] m_axis_phase_tdata ;
always #1 aclk = ~aclk;
initial
begin
#100;
aresetn =1'b1;
end
dds_compiler_0 dds_compiler_0 (
.aclk (aclk ), // input wire aclk
.aresetn (aresetn ), // input wire aresetn
.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 [31 : 0] m_axis_phase_tdata
);
reg S_ch0_valid ;
reg [15:0] S_ch0_cos ;
reg [15:0] S_ch0_sin ;
reg [31:0] S_ch0_pha ;
reg [15:0] S_ch1_cos ;
reg [15:0] S_ch1_sin ;
reg [31:0] S_ch1_pha ;
always @(posedge aclk)
if(!aresetn)
S_ch0_valid <= 1'b1;
else if(m_axis_data_tvalid)
S_ch0_valid <= ~S_ch0_valid;
always @(posedge aclk)
if(S_ch0_valid)
begin
S_ch0_cos <= m_axis_data_tdata[15:0] ;
S_ch0_sin <= m_axis_data_tdata[31:16] ;
S_ch0_pha <= m_axis_phase_tdata ;
S_ch1_cos <= S_ch1_cos ;
S_ch1_sin <= S_ch1_sin ;
S_ch1_pha <= S_ch1_pha ;
end
else
begin
S_ch0_cos <= S_ch0_cos ;
S_ch0_sin <= S_ch0_sin ;
S_ch0_pha <= S_ch0_pha ;
S_ch1_cos <= m_axis_data_tdata[15:0] ;
S_ch1_sin <= m_axis_data_tdata[31:16] ;
S_ch1_pha <= m_axis_phase_tdata ;
end
endmodule
仿真波形如下:
2、相位可配置模式:
該模式將相位偏差和相位步進(jìn)設(shè)置為axi配置模式,如下圖,其它配置保持不變:
生成的端口如下,該模式下增加了config端口,用于phase信息的配置:
dds_compiler_cfg your_instance_name (
.aclk(aclk), // input wire aclk
.aresetn(aresetn), // input wire aresetn
.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
.s_axis_config_tlast(s_axis_config_tlast), // input wire s_axis_config_tlast
.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
.event_s_config_tlast_missing(event_s_config_tlast_missing), // output wire event_s_config_tlast_missing
.event_s_config_tlast_unexpected(event_s_config_tlast_unexpected) // output wire event_s_config_tlast_unexpected
);
這時(shí),需要對(duì)tb進(jìn)行相應(yīng)的修改,增加config的配置,如下,新增一個(gè)11bit的計(jì)數(shù)器,計(jì)滿后對(duì)兩個(gè)通道的phase值進(jìn)行翻倍:
reg aclk = 'd0;
reg aresetn = 'd0;
reg s_axis_config_tvalid= 'd0;
reg [31 : 0] s_axis_config_tdata = {{16'd1310},{16'd1310}};
reg s_axis_config_tlast = 'd0;
wire m_axis_data_tvalid ;
wire [31 : 0] m_axis_data_tdata ;
wire m_axis_phase_tvalid ;
wire [15 : 0] m_axis_phase_tdata ;
always #1 aclk = ~aclk;
initial
begin
#100;
aresetn =1'b1;
end
reg [10:0] S_clk_cnt ;
always @(posedge aclk)
if(!aresetn)
S_clk_cnt <= 'd3;
else
S_clk_cnt <= S_clk_cnt + 'd1;
always @(posedge aclk)
s_axis_config_tvalid <= ((S_clk_cnt==0)||(S_clk_cnt==1));
always @(posedge aclk)
s_axis_config_tlast <= (S_clk_cnt==1);
always @(posedge aclk)
if(s_axis_config_tvalid)
s_axis_config_tdata <= s_axis_config_tdata + s_axis_config_tdata;
dds_compiler_cfg your_instance_name (
.aclk (aclk ), // input wire aclk
.aresetn (aresetn ), // input wire aresetn
.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
.s_axis_config_tlast (s_axis_config_tlast ), // input wire s_axis_config_tlast
.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
.event_s_config_tlast_missing (event_s_config_tlast_missing ), // output wire event_s_config_tlast_missing
.event_s_config_tlast_unexpected (event_s_config_tlast_unexpected) // output wire event_s_config_tlast_unexpected
);
仿真結(jié)果如下如,可以看到隨著phase步進(jìn)的不斷累加,兩個(gè)通道的輸出頻率也在不斷增加.
好了,本文就寫(xiě)的這里,希望通著這一系列的文章能幫助大家深入理解并正確使用DDS IP,詳細(xì)的仿真過(guò)程可參考B站視頻。
-
FPGA
+關(guān)注
關(guān)注
1644文章
22008瀏覽量
616494 -
Xilinx
+關(guān)注
關(guān)注
73文章
2184瀏覽量
124788 -
仿真
+關(guān)注
關(guān)注
52文章
4253瀏覽量
135535 -
DDS
+關(guān)注
關(guān)注
22文章
672瀏覽量
154227
發(fā)布評(píng)論請(qǐng)先 登錄
XILINX FPGA IP之Clocking Wizard詳解

XILINX FPGA IP之MMCM PLL DRP時(shí)鐘動(dòng)態(tài)重配詳解

Xilinx FPGA IP之Block Memory Generator仿真

IP core調(diào)用DDS
xilinx FPGA的FFT IP核的調(diào)用
如何使用Xilinx DDS Compiler IP并把它運(yùn)行在Ultra96板上的可編程邏輯中?
基于FPGA的DDS IP核設(shè)計(jì)方案

Xilinx DDR控制器MIG IP核的例化及仿真

IP例化和幾個(gè)基于FPGA芯片實(shí)現(xiàn)的Demo工程
關(guān)于Xilinx中DDS IP的運(yùn)用與講解

關(guān)于Ultra96的Xilinx DDS編譯器IP教程

Xilinx Vivado DDS IP使用方法

如何申請(qǐng)xilinx IP核的license

Xilinx DDS IP核的使用和參數(shù)配置

評(píng)論