一、 概述
在之前已经使用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中存储。
本文章由威三学社出品
对课程感兴趣可以私信联系