一、 概述
在之前已經使用interconnect IP 實現了DDR4的多通道讀寫功能,接下來為了更能接近實用性和更直觀的展現多通道讀寫的功能,使用DDS IP 核生成兩組正弦波信號,將兩組正弦波信號通過其中兩個通道存儲到DDR4中,再使用另外兩個通道將兩組正弦波讀取出來。
二、DDS IP 配置
在DDS IP 的配置界面中,選擇兩個通道,參數選擇硬件參數,可以直觀看到DDS中的數字累加器的位寬,和輸出的數據位寬。
在手冊中可以看到輸出頻率和相位寬度,相位角增量之間的關系。如圖2所示。
在建立的IP工程中,每個通道的時鐘頻率為100MHz,相位的寬度為16位寬。想要輸出2MHz的波形時,計算相位角增量。
另一個通道輸出5MHz的波形:
在DDS IP核中,相位角增量配置如圖3所示。
我們需要輸出sin波形,在output selection選項中選擇輸出sine。
在補充說明界面中可以看到輸出了兩組數據,頻率分別為50MHz和25MHz。
三、 DDS仿真波形示例代碼
因為m_axis_data_tvalid始終為高,而且m_axis_data_tdata中包含了兩路數據,兩路通道的數據交替輸出。把數據m_axis_data_tdata分解為兩路。
1、dds輸出波形代碼:
module dds_top(
input wire aclk
);
reg [7:0] chnl_0;
reg [7:0] chnl_1;
wire m_axis_data_tvalid;
wire [7 : 0] m_axis_data_tdata;
reg chnl_flag = 0;
always @(posedge aclk ) begin
chnl_flag <= ~chnl_flag;
end
always @(posedge aclk ) begin
if (chnl_flag) begin
chnl_0 <= m_axis_data_tdata;
end
end
always @(posedge aclk ) begin
if (chnl_flag == 0) begin
chnl_1 <= m_axis_data_tdata;
end
end
dds_compiler_0 dds_compiler_0 (
.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 [7 : 0] m_axis_data_tdata
);
2、仿真代碼:
`timescale 1ps / 1ps
module dds_top_tb( );
reg aclk;
initial begin
aclk = 0;
end
always #2500 aclk = ~ aclk;
dds_top inst_dds_top (.aclk(aclk));
endmodule
四、仿真波形
可以看到m_axis_data_tdata包含了兩路數據,想要去除單通道的數據,需要將數據交替取出,并賦值給單通道的數據信號,從而得到兩路數據chnl_0和chnl_1。
五、總結
在今天的工程中,使用了dds產生兩組輸出正弦波,后邊會截取一部分波形,將這兩個波形放到ddr4中存儲。
本文章由威三學社出品
對課程感興趣可以私信聯系