使用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。

本文章由威三学社出品

对课程感兴趣可以私信联系

相关推荐
尤老师FPGA18 天前
使用DDR4控制器实现多通道数据读写(十六)
fpga开发·ddr4
一只豌豆象1 个月前
【知识分享】DDR4 硬件架构基础知识
硬件工程·信号完整性·ddr4
尤老师FPGA2 个月前
使用DDR4控制器实现多通道数据读写(十三)
fpga开发·ddr4
尤老师FPGA2 个月前
使用DDR4控制器实现多通道数据读写(十二)
ddr4
尤老师FPGA2 个月前
使用DDR4控制器实现多通道数据读写(十)
fpga开发·ddr4
DDR内存测试9 个月前
UEFI BIOS&APP编程开发查询手册.pdf
ddr4·bios源码·dram test
DDR内存测试1 年前
各类专业技术的pdf电子书
ddr4·memory ras·bios源码·ice_tea_bios·rdimm
晓晓暮雨潇潇1 年前
『FPGA通信接口』DDR(3)DDR3颗粒读写测试
fpga·vivado·ddr3·ddr4·mig ip核·sodimms
FPGA狂飙2 年前
Xilinx FPGA平台DDR3设计详解(三):DDR3 介绍
fpga开发·fpga·vivado·xilinx·ddr·ddr3·ddr4