使用DDR4控制器实现多通道数据读写(十九)
一、 概述
上一节我们使用dds生成了两个通道的波形数据,在这一节中,我们需要将dds生成的波形数据存储到ddr4中,在存储过程中,每次突发只能最多传输256个数据,并且如果使用dds产生双通到数据,那么两组波形出来后,需要同时存储。这些情况是存储时需要考虑的事情。接下来按照设计思路,逐步实现向ddr4中存储两个通道的波形数据。本章节着重讲述dds的配置设计。
二、 Dds配置设计
1、添加使能信号
在向ddr4中写入数据时,每次最多突发256个数据,而且dds生成的数据要实时的写进ddr4中。这时就需要用一个使能信号,来控制何时输出波形。在dds IP配置中,勾选上
ACLKEN选项。
通过控制aclken电平的高低,可以实现实时产生波形,如图2所示。
在图3中,可以看到m_axis_data_tdata只在aclken为高时输出sin波形,并且在aclken为低时数据保持不变,这样就确保了在aclken为高时的sin波形的连续性。
在如此情况下,可以将ddr4的写数据有效(wvalid与wready的握手)当做aclken,这样在向ddr4写数据时,不论wready何时有效,都可以产生连续的sin波形,并将波形存储到ddr4中。
2、使用两组dds IP输出波形
由于ddr4同时只能写入一个数据,不能实现将两通道的数据同时写入,所以在这里还需要另外创建一个dds IP,此时就有两个dds IP来产生sin波形数据了。所以在dds IP配置中,通道数量选择一个就可以了,以前输入的系统时钟为200MHz,单通道的输出波形的时钟频率为100MHz,此时改换为单通道的输出,系统时钟改为100MHz。如图4所示。
两个dds Ip配置中,相位角增量配置如下。通道0输出2MHz,通道1输出5MHz。
三、 dds模块仿真测试
dds控制模块代码:
module dds_top(
input wire clk,
input wire rst,
input wire aclken_0,
output wire [7:0] chnl_0_data,
input wire aclken_1,
output wire [7:0] chnl_1_data
);
wire m_axis_data_tvalid_0;
wire m_axis_data_tvalid_1;
dds_compiler_0 dds_compiler_0 (
.aclk(clk), // input wire aclk
.aclken(aclken_0),
.m_axis_data_tvalid(m_axis_data_tvalid_0), // output wire m_axis_data_tvalid
.m_axis_data_tdata(chnl_0_data) // output wire [7 : 0] m_axis_data_tdata
);
dds_compiler_1 dds_compiler_1 (
.aclk(clk), // input wire aclk
.aclken(aclken_1), // input wire aclken
.m_axis_data_tvalid(m_axis_data_tvalid_1), // output wire m_axis_data_tvalid
.m_axis_data_tdata(chnl_1_data) // output wire [7 : 0] m_axis_data_tdata
);
endmodule
dds仿真模块代码:
`timescale 1ns / 1ps
module dds_top_tb( );
reg clk;
reg rst;
reg aclken_0;
reg aclken_1;
wire [7:0] chnl_0_data;
wire [7:0] chnl_1_data;
initial begin
clk = 0;
rst = 1;
#500
rst = 0;
aclken_0 = 0;
aclken_1 = 1;
while(1) begin
repeat(256)@(posedge clk);
aclken_0 = ~aclken_0;
aclken_1 = ~aclken_1;
end
end
always #5 clk = ~ clk;
dds_top inst_dds_top(.clk (clk),.rst (rst),.aclken_0 (aclken_0),.chnl_0_data (chnl_0_data),.aclken_1 (aclken_1),.chnl_1_data (chnl_1_data));
endmodule
仿真波形如图7所示。
经过如此配置后,每个通道的数据与数据有效信号可以分别单独控制,以便根据ddr4的写数据握手情况来控制各自的dds IP输出自己的波形。并且输出的有效数据为连续的sin波形。
四、 章节总结
在本章节中,使用两个dds IP来分别产生sin波形,并添加了aclken信号,此信号为高时IP输出的波形有效,并且可以保障sin波形的连续性。下一章节来继续讲述如何截取波形并写进ddr4。
本文章由威三学社出品
对课程感兴趣可以私信联系