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

DDR3保姆级使用教程:ZYNQ 7010

内容:使用DDR3 IP核,向DDR3写入数据,然后再读出数据,通过串口打印。

设备:ZYNQ 7010 xc7z010clg-400-1。软件VIVADO 2018.3

(1)工程模块:一个写FIFO,一个读FIFO。一个ZYNQ IP核(DDR3在ZYNQ IP核内勾选)。一个AXI4通信接口转换模块。

(2)工程的运行逻辑简介:

AXI4的接口是64位,也就是,两个FIFO(读FIFO、写FIFO)与ZYNQ 的接口位宽是64位。我们进入和出来DDR3的数据都是64位的。

整个工程分为两个流程:

  1. 突发写DDR3(设置一次突发写的长度是16个64位的数据)
    顶层文件内,持续向写FIFO写入数据,写FIFO的读计数会累积增加。每次写入FIFO的数据位宽是16位,当我们写入64个16位的数据,读计数值(rd_cnt)就会等于16(代表16个64位的数据排列在FIFO里)。
    当rd_cnt = 16 就代表满足一次突发写DDR3的设置长度“16”,那就会自动执行一次DDR3的突发写,数据就进入到DDR3里了(每次向DDR3里写1个64位数,重复了16次)。

  2. 突发读DDR3(设置一次突发读的长度是16个64位的数据)
    我们要把之前写到DDR3里的数据读出来放到读FIFO里。DDR3的读操作受限于读FIFO的写计数值(wr_cnt)。wr_cnt在读FIFO被写入数据后会自动增加,增加1就代表DDR3给FIFO写了1个64位的数据。在读FIFO复位后,wr_cnt会清零,如果wr_cnt小于等于我们设定的16,DDR就自动往读FIFO搬运数值,一直到wr_cnt等于16了,DDR3就不会往FIFO里搬运数据。(当wr_cnt等于16就等于DDR3给了读FIFO16个64位的数据,代表一次突发读完成)

关于两个过程的一些问题:

在这里插入图片描述
红色箭头代表写流程,绿色箭头代表读流程
其中有很多的问题,比如时钟,信号线等等。看看我们怎么代码实现对DDR3的数据写入和读取吧。

**代码块一:**给写FIFO写入数据,这些数据会自动存入到DDR3中
/***********************方式2*  直接使能计数****************************/
reg [15:0] dat2;
wire wrfifo_data_en = dat2 ==1024;   //代表输入1024个16位数  rd = 256 *64always@(posedge loc_clk100m or posedge cnt_en_reg2)beginif(cnt_en_reg2)dat2 <= 16'd0;else if(!wrfifo_data_en && !cnt_en_reg2)dat2 <= dat2 + 1'b1;elsedat2 <= dat2;endassign wrfifo_clr  = reset;assign wrfifo_wren =!wrfifo_data_en & !cnt_en_reg2; assign wrfifo_din  = dat2;

assign wrfifo_wren 代表允许写FIFO写入数据的使能信号
assign wrfifo_din 代表给写FIFO写入的数据,在使能信号为1的情况下有效

**代码块二:**读FIFO的读出数据。DDR3会自动把数据给读FIFO,我们要把读FIFO的数据读出
/***********************方式1*   标志位cnt读计数****************************/
wire rdfifo_empty;
wire rdfifo_rd_rst_busy;
wire rd_en;
wire rdfifo_en_reg2;
reg [19:0] rdfifo_en_reg;
reg rd_clr;
assign rdfifo_en_reg2 = rdfifo_en_reg[19];
// //延迟20个时钟周期always@(posedge loc_clk100m or negedge wrfifo_data_en)beginif(!wrfifo_data_en)rdfifo_en_reg <= {20{1'b1}};elserdfifo_en_reg <= rdfifo_en_reg << 1;endassign rd_en = rdfifo_empty | rdfifo_rd_rst_busy;
reg [15:0] rd_dat;
reg rd_send_en;
wire rdfifo_data_en = rd_dat ==1024;   //代表输入1024个16位数  reg [31:0] rd_cnt;always @ (posedge loc_clk100m or posedge rdfifo_en_reg2)if(rdfifo_en_reg2)beginrd_dat <= 0;rd_cnt <= 0;rd_send_en <=  0;endelse  if(!rdfifo_data_en  &&  !rd_en)beginif(rd_cnt == 32'd9_999_999)   begin//   d199_999rd_dat <= rd_dat +1'b1;rd_send_en <= 1;rd_cnt <= 0;endelse beginrd_cnt <= rd_cnt + 1'b1;rd_dat <= rd_dat;rd_send_en <=  0;endendelse beginrd_cnt <= 0 ;rd_send_en <=  0;rd_dat <= rd_dat;endreg rd_send_en_reg;always @ (posedge loc_clk100m or posedge rdfifo_en_reg2)if(rdfifo_en_reg2)rd_send_en_reg <=  0;else  if(rd_send_en)rd_send_en_reg <= 1;else rd_send_en_reg <=  0;assign rdfifo_rden =rd_send_en;assign rdfifo_clr  = reset   | rd_clr;

这里的rd_send_en 是读FIFO的读使能信号,每隔“d9_999_999”也就是9_999_999 + 1 = 10_000_000 * 10ns = 100 ms读一次"读FIFO"的数据,因为读使能和读数据有一个周期的延迟,因此rd_send_en_reg 出现了,他被用来给uart模块块用来发送读FIFO的数据,来验证我们整个流程是否正确。

**代码块三:**串口打印
  uart tx  /
uart_byte_tx uart_byte_tx(.clk(loc_clk100m),.reset(reset),.data_byte(rdfifo_dout),.send_en(rd_send_en_reg),.baud_set(3'd0),.uart_tx(uart_tx),.tx_done( ),.uart_state());	

rdfifo_dout就是读FIFO的数据口了,因为rdfifo_dout是16位的,我们这样使用会直接输出低八位的数据。

在代码块一,我们看到
/***********************方式2*  直接使能计数****************************/
reg [15:0] dat2;
wire wrfifo_data_en = dat2 ==1024;   //代表输入1024个16位数  rd = 256 *64always@(posedge loc_clk100m or posedge cnt_en_reg2)beginif(cnt_en_reg2)dat2 <= 16'd0;else if(!wrfifo_data_en && !cnt_en_reg2)dat2 <= dat2 + 1'b1;elsedat2 <= dat2;endassign wrfifo_clr  = reset;assign wrfifo_wren =!wrfifo_data_en & !cnt_en_reg2; assign wrfifo_din  = dat2;

assign wrfifo_din = dat2;
dat2作为一直给FIFO,也就是一直给DDR3的数据是从0~1024开始变化的。所以串口打印的数据只有八位8h00到8hFF,一共256个数据。那么根据1024个数据挨个打印出来,在低八位上显示的效果就是4次循环打印输出00到FF
在这里插入图片描述

到这里整个流程就结束了,由于这个DDR3的工程涉及到PS与PL侧的资源,导致会有很多出BUG的地方。因此,整个工程代码难度比较高,我还是建议使用一个基础版的工程文件来学习整个DDR3的运行流程,接下来我会上传我自己编写的基础版的代码供大家学习参考

相关文章:

DDR3保姆级使用教程:ZYNQ 7010

内容:使用DDR3 IP核&#xff0c;向DDR3写入数据&#xff0c;然后再读出数据&#xff0c;通过串口打印。 设备&#xff1a;ZYNQ 7010 xc7z010clg-400-1。软件VIVADO 2018.3 &#xff08;1&#xff09;工程模块&#xff1a;一个写FIFO&#xff0c;一个读FIFO。一个ZYNQ IP核&am…...

OpenCV 模板匹配全解析:从单模板到多模板的实战指南

简介&#xff1a;本文深入探讨 OpenCV 中的模板匹配技术。详细介绍构建输入图像与模板图像的步骤&#xff0c;包括读取、截取、滤波与存储等操作。剖析 cv2.matchTemplate 语法及其参数含义&#xff0c;阐述不同匹配方法下结果值的意义。同时讲解 cv2.minMaxLoc 语法&#xff0…...

【JAVA] 杂谈: java中的拷贝(克隆方法)

这篇文章我们来介绍什么是拷贝&#xff0c;并且实现浅拷贝到深拷贝。 目录 一、浅拷贝 1.1 clone 方法 1.2 实现浅拷贝&#xff1a; 1.2.1 重写 clone方法 1.2.2 实现接口 Cloneable 1.2.3 调用克隆方法 1.2.4 原理图&#xff1a;​ 1.3 浅拷贝的不足 1.3.1 增加引用…...

使用 PDF API 合并 PDF 文件

内容来源&#xff1a; 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户&#xff0c;该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…...

关于BeanUtils.copyProperties是否能正常复制字段【详细版】

话不多说&#xff01;先总结&#xff1a; 1、字段相同&#xff0c;类型不同&#xff08;不复制&#xff0c;也不报错&#xff09; 2、子类父类 (1)子类传给父类&#xff08;可以正常复制&#xff09; (2)父类传给子类&#xff08;可以正常复制&#xff09; 3、子类父类&#x…...

爬虫框架快速入门——Scrapy

适用人群&#xff1a;零基础、对网络爬虫有兴趣但不知道从何开始的小白。 什么是 Scrapy&#xff1f; Scrapy 是一个基于 Python 的网络爬虫框架&#xff0c;它能帮助你快速爬取网站上的数据&#xff0c;并将数据保存到文件或数据库中。 特点&#xff1a; 高效&#xff1a;支…...

鸿蒙开发-HMS Kit能力集(应用内支付、推送服务)

1 应用内支付 开发步骤 步骤一&#xff1a;判断当前登录的华为账号所在服务地是否支持应用内支付 在使用应用内支付之前&#xff0c;您的应用需要向IAP Kit发送queryEnvironmentStatus请求&#xff0c;以此判断用户当前登录的华为帐号所在的服务地是否在IAP Kit支持结算的国…...

TYUT设计模式大题

对比简单工厂&#xff0c;工厂方法&#xff0c;抽象工厂模式 比较安全组合模式和透明组合模式 安全组合模式容器节点有管理子部件的方法&#xff0c;而叶子节点没有&#xff0c;防止在用户在叶子节点上调用不适当的方法&#xff0c;保证了的安全性&#xff0c;防止叶子节点暴露…...

Webman中实现定时任务

文章目录 Webman中实现定时任务一、引言二、安装与配置1、安装Crontab组件2、创建进程文件3、配置进程文件随Webman启动4、重启Webman5、Cron表达式&#xff08;补充&#xff09;例子 三、使用示例四、总结 Webman中实现定时任务 一、引言 在现代的后端开发中&#xff0c;定时…...

《以 C++破局:人工智能系统可解释性的探索与实现》

在当今科技飞速发展的时代&#xff0c;人工智能已深度融入我们的生活&#xff0c;从医疗诊断到金融决策&#xff0c;从交通管控到司法审判&#xff0c;其影响力无处不在。然而&#xff0c;在这些涉及重大利益和社会影响的关键领域&#xff0c;人工智能系统却面临着严峻的信任危…...

C++:QTableWidget删除选中行(单行,多行即可)

转自博客&#xff1a; Qt C -在QTableWidget中删除行 - 腾讯云开发者社区 - 腾讯云 我的界面&#xff1a; 采集机器人位置和姿态信息并写入QTableWidget控件中 删除代码&#xff1a; 1.获取要删除行的索引 2.删除行 QList<QTableWidgetItem*> items ui->tableW…...

C++类中多线程的编码方式

问题 在C++代码中,一般的代码是需要封装在类里面,比如对象,方法等。否则就不能很好的利用C++面向对象的能力了。 但是这个方式在处理线程时会碰到一个问题。 考虑下面一个简单的场景: class demoC { public:std::thread t;int x;void threadFunc(){std::cout<<x&…...

数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了

文章目录 一、数据湖概念1、企业对数据的困扰2、什么是数据湖3、数据中台、数据湖、数据仓库、数据集市的区别 网上看了好多有关数据湖的帖子&#xff0c;还有数据中台、数据湖、数据仓库、数据集市的区别的帖子&#xff0c;发现帖子写的都很多&#xff0c;而且专业名词很多&am…...

EDKII之安全启动详细介绍

文章目录 安全启动简介安全启动流程介绍签名过程BIOS实现小结 安全启动简介 安全启动&#xff08;Secure Boot&#xff09;是一种计算机系统的安全功能&#xff0c;旨在确保系统启动过程中只能加载经过数字签名的受信任的操作系统和启动加载程序。通过使用安全启动&#xff0c…...

原生js上传图片

无样式上传图片 创建一个 FormData 对象&#xff1a;这个对象可以用于存储数据。 将文件添加到 FormData 对象&#xff1a;通过 append() 方法&#xff0c;将用户选择的文件添加到 formData 对象中。 使用 fetch 发送请求&#xff1a;使用 fetch API 或者其他方法将 FormDat…...

使用torch==2.5.1版本用的清华源遇到的坑

解决安装torch后,torch.cuda.is_available()结果为false的问题 清华源下载到的torch2.5.1版本的Lib\site-packages\torch\version.py 其中&#xff0c;清华源指的是&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorchhttps://mirrors.tuna.tsinghua.…...

泷羽Sec-星河飞雪-BurpSuite之解码、日志、对比模块基础使用

免责声明 学习视频来自 B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;http…...

对拍详细使用方法

对拍的作用 对于我们在学校OJ&#xff0c;cf&#xff0c;牛客…各种只提供少量测试数据的题目&#xff0c;常常交上代码常常超时&#xff0c;能写出正确的暴力代码而题目要求的时间复杂度更低。然而这时你写出了能通过样例且时间复杂度更低的代码&#xff0c;但交上去就是错误…...

Python面向对象编程与模块化设计练习

需求&#xff1a; 编写一个BankAccount类&#xff0c;模拟银行账户功能&#xff1a; 属性&#xff1a;账户名、余额 方法&#xff1a;存款、取款、查询余额 使用模块将类和测试代码分离。 模块文件&#xff1a;bank_account.py 该模块包含 BankAccount 类。 class BankAccoun…...

Linux系统硬件老化测试脚本:自动化负载与监控

简介&#xff1a; 这篇文章介绍了一款用于Linux系统的自动化硬件老化测试脚本。该脚本能够通过对CPU、内存、硬盘和GPU进行高强度负载测试&#xff0c;持续运行设定的时长&#xff08;如1小时&#xff09;&#xff0c;以模拟长时间高负荷运行的环境&#xff0c;从而验证硬件的稳…...

AI自主报告正常胸片:技术原理、临床价值与英国NHS实践挑战

1. 项目概述&#xff1a;当AI开始“读”胸片作为一名在医学影像和人工智能交叉领域摸爬滚打了十多年的从业者&#xff0c;我亲眼见证了AI从实验室里的新奇玩具&#xff0c;逐渐成长为临床医生案头一个值得信赖的“第二双眼睛”。最近&#xff0c;一个特别的应用场景正在全球范围…...

别再死记硬背截止、放大、饱和了!用Arduino+面包板,5分钟直观演示三极管三种工作状态

用Arduino实战破解三极管工作状态的秘密 记得第一次学三极管时&#xff0c;盯着课本上那些截止区、放大区、饱和区的曲线图&#xff0c;我完全无法理解这些抽象概念和实际电路有什么关系。直到有一天&#xff0c;我在实验室里用Arduino和几个简单元件搭建了一个测试电路&#x…...

OpenCore Legacy Patcher深度解析:让老旧Mac重获新生的技术实现

OpenCore Legacy Patcher深度解析&#xff1a;让老旧Mac重获新生的技术实现 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 对于拥有2008年至2017年Intel Mac…...

程序员连夜带团队跑路,省了23万:这AI太贵,真的用不起了

好的&#xff0c;收到&#xff01;你说得对&#xff0c;之前的风格可能信息密度太高&#xff0c;有点“极客狂欢”的味道。 今天咱们换个姿势&#xff0c;用唠家常、说人话的方式&#xff0c;把5月11日AI圈最有趣、最魔幻的几件事儿聊明白。保证你在地铁上、蹲坑时&#xff0c;…...

Tiny AI Client:零依赖、轻量化的AI API调用库设计与实战

1. 项目概述与核心价值最近在折腾AI应用本地化部署和轻量化客户端时&#xff0c;发现了一个挺有意思的项目——piEsposito/tiny-ai-client。这名字起得就很直白&#xff0c;“tiny”意味着小巧&#xff0c;“ai-client”点明了它是一个AI客户端。乍一看&#xff0c;你可能会觉得…...

全栈AI智能体开发实战:基于LangGraph与Next.js的工程化模板解析

1. 项目概述&#xff1a;一个全栈AI智能体模板的诞生 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 vstorm-co/full-stack-ai-agent-template 。光看名字&#xff0c;你可能会觉得这又是一个“AI全栈”的缝合怪&#xff0c;或者是一个过度包装的概念。但作为一个在AI…...

ComfyUI-Impact-Pack完整安装指南:为什么你的V8版本功能不全?终极解决方案

ComfyUI-Impact-Pack完整安装指南&#xff1a;为什么你的V8版本功能不全&#xff1f;终极解决方案 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, …...

用Qt快速搭建一个局域网文件传输工具:QTcpServer/QTcpSocket完整项目实战

用Qt快速搭建一个局域网文件传输工具&#xff1a;QTcpServer/QTcpSocket完整项目实战 在数字化办公场景中&#xff0c;局域网文件传输是高频刚需。想象这样的场景&#xff1a;会议室里需要快速共享设计稿&#xff0c;实验室多台设备要同步采集数据&#xff0c;或者家庭网络中手…...

手把手教你用RecFusion和3D Scan:Kinect v2与RealSense D435三维重建完整流程与软件配置

手把手教你用RecFusion和3D Scan&#xff1a;Kinect v2与RealSense D435三维重建完整流程与软件配置 刚拿到Kinect v2或RealSense D435时&#xff0c;许多开发者最迫切的需求不是理解原理&#xff0c;而是快速完成第一次三维扫描。本文将用最简明的操作流&#xff0c;带你在30分…...

让机房管理告别粗放,每一寸资源都物尽其用

对于机房运维人员而言&#xff0c;U 位管理看似是基础小事&#xff0c;却是决定机房运维效率、资产安全与合规水平的关键。当前&#xff0c;不少企业机房、单位机房仍沿用传统人工管理模式&#xff0c;机柜 U 位全靠记忆、台账全靠 Excel、盘点全靠熬夜&#xff0c;看似节省了成…...