当前位置: 首页 > news >正文

使用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。
本文章由威三学社出品
对课程感兴趣可以私信联系

http://www.dtcms.com/a/271116.html

相关文章:

  • 通过Tcl脚本命令:set_param labtools.auto_update_hardware 0
  • 闲庭信步使用图像验证平台加速FPGA的开发:第六课——测试图案的FPGA实现
  • 闲庭信步使用图像验证平台加速FPGA的开发:第七课——获取RAW图像
  • RAM带宽计算及分析
  • 双esp8266-01s间TCP通讯
  • 云服务器域名可以设置多少二级域名
  • 为什么Spring中推荐使用构造函数而不是@Autowired字段注入
  • WIFI协议全解析04:从芯片角度看WiFi协议:ESP32/8266 支持了哪些?
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘re’问题
  • python学习打卡:DAY 25 异常处理
  • 在 PyCharm 中安装并配置 Node.js 的指南
  • npm init vue@latestnpm error code ETIMEDOUT
  • windows指定某node及npm版本下载
  • 使用Python求解最优化问题:从理论到实践的全方位指南
  • 嵌入式调试LOG日志输出(以STM32为例)
  • Oracle 数据库升级踩坑:DBLink ORA-02019 问题解决思路
  • Mysql: Bin log原理以及三种格式
  • SAP ERP与Oracle EBS对比,两个ERP系统有什么区别?
  • 矩阵之方阵与行列式的关系
  • JSP动态网页开发基础
  • Rust与人工智能(AI)技术
  • 网络安全之RCE分析与利用详情
  • Hadoop(一)
  • Claude Code: Best practices for agentic coding
  • ReactNative【实战】轮播图(含组件封装 ImageSlider)
  • swiglu 激活函数学习笔记
  • 前端性能优化:从之理论到实践的破局道
  • Rust与Cypress应用
  • 11.7 ChatGPT奖励模型完全解读:RLHF核心技术深度剖析与Hugging Face实战
  • RPG46.制作boss的受击和boss的死亡