FPGA读写DDR4 (一)MIG IP核控制信号

FPGA读写DDR4 (一)MIG IP核控制信号

前言

        这几个星期在倒腾DDR4内存的读写控制,期间看了不少资料,这几天终于完工了于是想着把做过的内容总结一下,于是有了这篇文章,由于控制DDR4的内容很多,这一篇文章就只讲基础的,也就是DDR4的控制IP核 MIG的控制信号。

        主要参考内容:【正点原子】MPSoC-P4之FPGA开发指南_V2.0,[XILINX] pg150-ultrascale-memory-ip-en-us-1.4

MIG IP核控制信号

IP核创建界面

        MIG IP核(memory interface generator)是用户与DDR4进行沟通的桥梁,因为如果我们自己去写直接DDR4代码的话,其内容将会非常复杂,而且即便写出来其性能可能也不会好,以XILINX提供的MIG IP核为例,在综合布线后查看utilization,能发现MIG IP核足足使用了约7500个LUT和9000个register资源,足以看出其编写的复杂,不过对于我们普通用户,能够操作MIG提供的用户接口就我觉得就算差不多了,既然要使用IP核,我们就从IP核的创建界面开始说起,这部分正点原子的教程中解释的很清楚,我偷懒贴一下他们的说明:

        这里我要额外解释一个很重要的概念,也就是memory option中的Burst Length这个参数在上图所示的这块DDR4芯片中,其固定了Burst Length=8,我们知道DDR4是速度快且容量高的ram,但它与我们平时在FPGA中常用的RAM有个很大的不同点,当我们给定了地址ADDR,并启动传输后DDR4内存会同时将Burst Length*Data Width大小的数据一起传送到数据总线上,其真正传输了数据的地址范围也就是ADDR~ADDR+Burst Length-1这个范围,以图中的参数为例,假设我们给出了地址ADDR=0,并给出读数据指令,在隔一段时间后,就会在8*16=128位的数据总线上得到0~7这些地址单元上的数据,所以我们无论进行写操作还是读操作,假设我们都是进行顺序读写,那每次我们给控制器的地址都是以8为步进的,这点在我们后面的程序编写中很重要。

IP核控制信号

       接下来我们开始正式看MIG的控制信号以及相关时序,PG150中给出了用户接口的所有控制信号,如下图:

        图中标黄的信号就是我们主要要关注的,我们可以大致分为四类,全局接口,命令接口,写接口,读接口,我们先从全局接口说起:

全局接口

        三个全局接口分别代表着MIG给用户使用的用户时钟,校准完成指示,以及与用户时钟同步的复位信号,这里要注意我们所有的操作用户接口的逻辑都必须等到校准完成信号拉高后才能进行。

命令接口

        第二类接口是命令接口

        命令接口用来指示DDR能够接受读取或者写入命令以及对应的命令类型的一组接口,简单来说,假设我们要读取或者写入一组数据,我们首先要给命令接口发送命令,以读命令为例,首先我们要将app_cmd设为3'b001,然后等待app_rdy信号拉高,其拉高表示DDR能够接受读写命令,然后我们拉高app_en并同时给出要读的地址app_addr,则在若干个周期后,数据就会连同数据有效信号一起出现。由于app_cmd指示不同的命令类型,我们首先给出其不同值代表的命令:

        一次成功的命令传输时序如下图所示:

        这个图大家千万不要被app_en拉高了三个周期而迷惑,实际上只有三个周期的最后一个周期命令才被写入到IP核,因为此时app_rdy才被拉高。另外,图中的app_autoprecharge信号被一同拉高可能会让大家感到迷惑,实际上我们使用IP时可能根本不会操作这一信号,因为我们在IP核中要额外设置才能使用app_autoprecharge这一信号,这一信号以我的理解是用来在同一bank中进行读写时为了提高读写效率而使能的,其用途与DDR颗粒的结构有关,如果还是感到疑惑可以查看这篇描述DDR结构的文章:https://zhuanlan.zhihu.com/p/663697786

写接口

        第三类接口是写接口

       app_wdf_data也就是写数据总线,不多解释。app_wdf_rdy信号其实就是写操作的app_rdy信号,对于一次写操作来说,只有当app_rdy和app_wdf_rdy同时为高时,写命令才能有效。app_wdf_wren拉高表示当前数据总线上数据就是要写入的数据,具体用法等会看时序就知道了。app_wdf_mask信号是写数据的屏蔽位,所谓屏蔽就是被写入为1的那个字节将不会被写入到DDR中,举例来说,对于位宽16,burst length8的ddr,一次传输为16*8=128=16字节,其mask以字节为单位屏蔽,则mask大小为16bit。app_wdf_end这个信号比较抽象,它表示的是当前时钟周期是写入数据的最后一周期,而对于我们之前一直举例的ddr,其用户时钟与DDR时钟分频比为1:4,其实就代表着每个用户时钟周期都会进行一次完整的Burst传输,则app_wdf_end实际上和app_wdf_wren是一起拉高的,(假设分频比为2:1,则数据总线宽度将会减半,一次Burst传输需要用户时钟的两个周期,这个是我的理解,不一定正确),我们实际应用时将其与app_wdf_wren连到一起即可。接下来我们看写数据的两种时序:

        第一种时序被称为非背靠背或者单次写入的时序,这个时序比较的抽象,其描述的是我们给出写命令的前一个到后两个周期在给出写控制信号以及数据,这些数据也能够被写入DDR,这种操作说实话应该是不太常用到的,但是我们还是要关注到,app_wdf_wren和app_wdf_en一同拉高时,该周期数据总线上的数据才是会被写入的数据,而app_en被拉高的那个周期地址和控制命令才会被写入,这点一定注意。

        第二种时序被称为背靠背写入时序,实际上其与非背靠背写入除了连续性上只有一个不同点,app_en信号和app_wdf_wren以及app_wdf_end信号是对其的,这是个非常好理解的时序,而且也比较好编写,我们只要将这些信号在app_rdy以及app_wdf_rdy为高时一起拉高即可实现写入。

读接口

        第四类接口是读接口:

        读接口就没什么好说的了,读数据没有额外的控制接口,只需要操作前面提到的命令接口就能够实现读数据,这里要额外说每一句DDR读数据会有很大的延迟,在给出读指令后,需要很多个时钟周期数据和数据有效标识才会出现,当然还要注意data_vaild会和有效的读出数据一起出现,和我们平时操作ram或者fifo一样。两种读操作时序如下图所示:

        实际上,除了这四组接口,还有一些额外的用户接口没有被使用,例如像PG150的130也就描述了另外一部分_ref或者_req信号的其他操作,由于我也没用上就不说了,可能还要多注意的就是app_hi_pri这个信号,PG150中没有详细描述,只是说要保留且置为0:

总结

        看我上面这些时序,其实我们能够发现MIG的操作时序并不复杂,但是在我们进行代码编写时注意点可能就比较多了,而且我们还要注意到,整个MIG IP核其用户逻辑工作在一个很高的时钟下,以我的DDR IP核配置为例,DDR工作时钟1200Mhz,用户时钟300Mhz,假设我要对一个100Msps,采样位数16bit的ADC进行数据采集并存入DDR,很显然,FIFO在这其中是必不可少的。而为了实现这种跨时钟域的数据传输,其中对于FIFO的复杂操作才是我们将遇到的最大困难,我们下一期将DDR读取操作与读写FIFO的设计。

Read more

基于深度学习yolo系列+deepseek+qwen大模型的智能识别系统 中草药检测+行人车辆检测+垃圾分类检测+茶叶病虫害检测+无人机目标检测

基于深度学习yolo系列+deepseek+qwen大模型的智能识别系统 中草药检测+行人车辆检测+垃圾分类检测+茶叶病虫害检测+无人机目标检测

智能检测系统综合概述 定制联系文末卡片 目标检测系统应用场景表 系统类型检测目标适用领域中草药检测45种中草药中医药、药材鉴定脑肿瘤检测胶质瘤等脑部肿瘤医疗影像诊断行人车辆检测行人、车辆等多目标交通监控、安防玉米病虫害检测6种玉米病害农业植保裂缝检测6种表面缺陷工业质检、建筑检测垃圾分类检测4类垃圾环保、智慧城市遥感目标检测地理空间目标遥感分析、军事侦察西瓜病虫害检测多种西瓜病害农业种植管理海洋生物检测海豚、鲨鱼等海洋科研、教育茶叶病虫害检测6种茶叶病害茶叶种植、农业 包括但不限于此!!!! 🏗️ 统一技术架构 所有系统都基于相似的模块化技术栈: • 前端:Vue3 + Element-Plus + TypeScript + Echarts • 后端:SpringBoot + MyBatis-Plus + Flask • 深度学习:YOLO系列 + PyTorch • 数据库:MySQL • 大模型集成:DeepSeek + Qwen 🔄 标准化功能模块 检测功能四合一 1. 图片检测 - 单张图片上传识别 2. 批量

By Ne0inhk

Vivado 2019.2安装破解教程:零基础手把手指南

从零搭建Vivado 2019.2开发环境:不只是“破解”,更是理解FPGA工具链的开始 你是否曾在尝试启动 Vivado 的时候,被一个弹窗拦住去路:“License required for synthesis”? 或者刚下载完庞大的安装包,面对一堆补丁文件却不知从何下手? 这并不是你技术能力的问题。事实上, 每一个 FPGA 开发者都曾经历过这个阶段 ——在官方授权门槛和学习成本之间挣扎。而 Vivado 2019.2,作为 Xilinx 工具链中最后一个稳定、功能完整且社区支持广泛的经典版本,至今仍是高校实验、个人项目甚至部分企业原型验证的首选。 但它的安装与授权配置过程,远比点几下“下一步”复杂得多。本文不打算教你如何“绕过法律”,而是带你 真正搞懂整个系统是怎么运作的 :为什么需要许可证?补丁到底改了什么?Xilinx License Manager 背后又是怎样的机制? 更重要的是,我会手把手带你走完一条清晰、可复现、稳定性高的部署路径,

By Ne0inhk

yolo13-C3k2-WDBB_海下垃圾清理机器人环境感知与障碍物识别系统_1

本数据集为海下垃圾清理机器人环境感知任务提供训练支持,包含4485张经过预处理的水下环境图像,采用YOLOv8格式进行标注。数据集分为训练集、验证集和测试集三个部分,所有图像均经过自动方向调整( stripping EXIF方向信息)并统一拉伸至640×60像素尺寸,未应用任何图像增强技术。数据集共包含三个类别:‘bucket’(桶)、‘gate’(门)和’obstacle’(障碍物),这些类别代表了海下垃圾清理机器人可能面临的主要环境目标和障碍物。该数据集采用CC BY 4.0许可证授权,由qunshankj平台用户提供,通过qunshankj计算机视觉平台完成图像收集、组织和标注工作。数据集的构建旨在支持开发能够有效识别水下环境中的垃圾容器、结构门和其他障碍物的计算机视觉系统,从而提升海下垃圾清理机器人的自主导航和目标识别能力。 1. 深入解析87种目标检测模型:从经典到前沿的全面指南 目标检测作为计算机视觉的核心任务之一,在过去十年里经历了飞速发展。从传统的R-CNN系列到如今的YOLO系列,各种创新模型层出不穷。本文将深入解析87种主流目标检测模型,帮助你全面了解这个领域

By Ne0inhk

Telegram搜索机器人推荐——查找海量资源,提升信息检索效率

大家好,本文首发于 ZEEKLOG 博客,主要面向需要在 Telegram 中高效检索资源的同学。我结合自己的实测体验,总结了几款实用的搜索机器人与完整操作流程,帮助大家解决“怎么快速找到频道、群组、文件”的痛点。如果你也在为信息筛选耗时头疼,建议耐心读完并亲手试试,收获会很大。觉得有帮助别忘了给个点赞、收藏和关注支持一下 🙂 📚 本文目录 * 使用准备 * 什么是Telegram搜索机器人? * Telegram搜索机器人的核心功能 * 推荐的Telegram搜索机器人 * 如何使用Telegram搜索机器人? * Telegram搜索机器人的应用场景 * 总结 在信息爆炸的时代,如何高效获取自己想要的资源?Telegram搜索机器人为你带来全新解决方案,无需翻找频道、群组,只需输入关键词,即可一键查找海量内容。无论是影视剧、电子书、图片还是优质群组,Telegram搜索机器人都能帮你轻松找到。推荐搜索机器人:@soso、@smss、@jisou 使用准备 1. 能访问外网,不会魔法的同学请参考:这里 2. 安装 Telegram

By Ne0inhk