详解DDR3原理以及使用Xilinx MIG IP核(app 接口)实现DDR3读写测试

news2025/2/28 19:39:34

系列文章目录

(1)详解SDRAM基本原理以及FPGA实现读写控制


文章目录

  • 系列文章目录
  • 一、DDR简介
    • 1.1 什么是 SDRAM、DDR、DDR2、DDR3
    • 1.2 SDRAM、DDR、DDR2、DDR3核心频率、工作频率以及等效频率的计算
    • 1.3 DDR3带宽以及容量的计算
  • 二、MIG IP核的介绍
  • 三、MIG 用户接口信号介绍
  • 四、MIG 操作时序
    • 4.1 命令操作时序
    • 4.2 写数据时序
    • 4.3 读数据时序
  • 五、配置 MIG 步骤
  • 六、MIG 读写控制代码编写


一、DDR简介

  在前文《详解SDRAM基本原理以及FPGA实现读写控制》中我们学会了SDRAM的基本原理以及读写操作时序,本文讲解的DDR3全称为“Double Data Rate 3”(双倍数据速率第三代),它是一种用于计算机和其他设备的随机存取存储器(RAM)技术。

1.1 什么是 SDRAM、DDR、DDR2、DDR3

  SDRAM、DDR、DDR2和DDR3都是不同类型的动态随机存取存储器(DRAM)技术,它们在数据传输速率、功耗、电压和性能方面有所不同。以下是这几种内存的区别:

  1. SDRAM(Synchronous DRAM)

    • 同步动态随机存取存储器,是最早的一种同步内存技术,它与系统总线同步工作。
    • SDRAM 需要两个时钟周期来传输数据,因此数据传输速率相对较低。
  2. DDR SDRAM(Double Data Rate Synchronous DRAM)

    • 双倍数据速率同步动态随机存取存储器,简称DDR。
    • DDR 内存在每个时钟周期的上升沿和下降沿都能传输数据,因此数据传输速率是SDRAM的两倍。
    • DDR 内存的电压通常为 2.5V 或 3.3V。
  3. DDR2 SDRAM

    • DDR2 是 DDR 的后继产品,具有更高的数据传输速率和更低的电压。
    • DDR2 内存的电压为 1.8V,比 DDR 的 2.5V 或 3.3V 低,有助于降低功耗。
    • DDR2 内存的起始频率为 400 MHz,最高可达 1200 MHz。
  4. DDR3 SDRAM

    • DDR3 是 DDR2 的后继产品,进一步提高了数据传输速率和降低了电压。
    • DDR3 内存的电压为 1.5V,比 DDR2 的 1.8V 更低,进一步降低了功耗。
    • DDR3 内存的起始频率为 800 MHz,最高可达 2133 MHz 或更高。
  5. 主要区别

    • 数据传输速率:DDR3 > DDR2 > DDR > SDRAM。
    • 电压:DDR3 (1.5V) < DDR2 (1.8V) < DDR (2.5V/3.3V) < SDRAM。
    • 功耗:随着电压的降低和制造工艺的改进,DDR3 的功耗最低。
    • 性能:DDR3 提供了最高的性能,其次是 DDR2 和 DDR,SDRAM 性能最低。
    • 兼容性:新一代的内存技术通常不兼容旧一代的内存插槽,例如 DDR3 内存不能在只支持 DDR2 的主板上使用。

1.2 SDRAM、DDR、DDR2、DDR3核心频率、工作频率以及等效频率的计算

  从DDR1开始,后续迭代的DDR速度都越来越快,其速度提高的原因就是Prefetch(预读取)。什么是预读取? Prefetch是指内存在处理数据请求时,不仅读取请求的数据,还会预先读取额外的数据到缓存中。这种机制可以提高内存的效率和性能。
  我们知道DDR在时钟周期的上沿和下沿都能传输数据,所以传输率比SDRAM快了一倍,这就说DDR上升沿传输一位数据,下降沿传输一位数据,在一个时钟周期内一共传输2bit数据,这儿是2bit是指2倍芯片位宽的数据。
  DDR2一次性可以从存储单元预读取4bit的数据,然后在时钟上升沿和下降沿发送出去,因此DDR2需要2个时钟周期才能完成传输。
  DDR3一次性可以从存储单元预读取8bit的数据,然后在时钟上升沿和下降沿发送出去,因此DDR3需要4个时钟周期才能完成传输。
  核心频率是指DDR物理内部的运行时钟频率,因为是双沿传输,所以DDR的工作频率是2倍核心频率。再由上面可知,DDR2预读取4bit需要2个时钟,因此DDR2的等效频率也就是实际的数据传输速率就等于工作频率*2。常见的DDR频率表如下:

在这里插入图片描述
  例如DDR3-1333是指核心频率为166MHZ,工作频率=1662=333MHZ,因为DDR3预读取8bit数据需要4个周期,所以等效频率=3334约等于1333MHZ。

  在用户控制方面来看,如果我想让DDR3跑等效800M数据速率,这是双沿的速率,所以实际上DDR3 IO速率为400M,因为DDR3预读取8bit需要4个时钟周期,所以用户操作逻辑只需要400/4=100M的时钟来读写数据。

1.3 DDR3带宽以及容量的计算

  DDR带宽=等效频率 * 位宽。 例如:位宽64位的DDR3-800的带宽=800M * 64bit=51.2Gbit/s=6.4GB/s。对于用户操作读写的数据位宽=800M * 64bit/100M=512bit。因此用户只需要用100M的时钟操作512位的数据,即可让DDR3跑800M 64位的速率。

  以MT41K256M16TW-107为例计算DDR3容量,打开芯片手册如下:

在这里插入图片描述
  BANK的数据位宽位3位,因此BANK数量=2 ^ 3=8;行地址位宽为15位,因此一个BANK一行的存储单元数量 = 2 ^ 15=32768=32K;列地址位宽为10,因此一个BANK一列的存储单元数量=2 ^ 10 = 1024 =1K;数据位宽为16位,所以这片DDR3总的容量= 8 ✖ 32768 ✖ 1024 ✖ 16 = 4294967296 bit = 4096Mb = 512MB

二、MIG IP核的介绍

  前面我们介绍了DDR3的一些知识,对DDR3有了一个大致了解,那么我们怎么去使用DDR3呢?与SDRAM不同的是DDR3 的时序非常复杂,用户直接编写DDR3的控制代码是相当耗时以及性能得不到保证,那么绝大部分开发者都会使用芯片厂家提供的控制器来操作DDR3。
  MIG(Memory Interface Generators) IP 核是Xilinx提供给7系以及以上的用户来实现 DDR3 的读写控制器。MIG有AXI接口版本以及app接口的版本,本次我们讲解app接口的MIG,AXI接口的后续在讲。app接口的MIG系统框图如下所示:

在这里插入图片描述

  • 最右侧的DDR2/DDR3 SDRAM为物理上的DDR3存储器。
  • 中间的7 Series FPGAs Memory Interface Solution 就是上面所说的MIG IP核,它与DDR3控制器通过右边以ddr开头命名的信号相连接。
  • 最左侧是我们用户自己的逻辑,使用以app开头的信号与MIG IP核相连接。

  对于用户来说,只有正确的控制app这些信号才能操作MIG,还要负责分配正确的DDR3管脚,其他不用关心。。MIG内部负责产生具体的DDR3操作时序,并直接操作DDR3读写。

三、MIG 用户接口信号介绍

  从上面系统框图来看,MIG提供给用户的接口有很多,但是对于用户来说,不是所有信号都必须使用,我们先来看每个信号的意思,信号方向是相对于MIG来说的。具体如下表所示:

信号名称 信号方向信号说明
ui_clk 输出MIG输出的用户时钟,必须是DDR3 IO时钟的1/2或者1/4
ui_clk_sync_rst输出用户时钟复位信号,高电平有效
init_calib_complete输出DDR3初始化完成信号,高电平有效,
app_addr[ADDR_WIDTH – 1:0] 输入用户地址输入,地址的位宽ADDR_WIDTH等于RANK位宽+BANK位宽+ROW位宽+COL位宽
app_en输入MIG IP核命令写入使能,高电平有效。写命令时需要拉高该信号
app_cmd[2:0] 输入控制命令信号;读:001;写:000。其他值保留。
app_rdy 输出MIG IP核准备接收读写命令,高电平有效。
app_wdf_wren输入MIG IP核数据写使能,高电平有效
app_wdf_mask[APP_MASK_WIDTH – 1:0] 输入数据掩码信号,指示当前写数据那些位有效
app_wdf_rdy 输出MIG IP核准备接收数据信号,高电平有效。
app_wdf_end输入指示当前写入下是最后一个数据,高电平有效。
app_wdf_data [APP_DATA_WIDTH-1:0] 输入需要写入的数据
app_rd_data[APP_DATA_WIDTH – 1:0] 输出MIG从DDR3读出来的数据
app_rd_data_valid 输出读数据有效信号,高电平有效
app_rd_data_end 输出指示当前读出的数据是最后一个数据,高电平有效
app_sz 输入保留信号,置0
app_sr_req 输入保留信号,置0
app_sr_active 输出保留信号
app_ref_req 输入刷新请求信号
app_ref_ack 输出刷新请求响应信号
app_zq_req 输出请求校准阻抗匹配信号

四、MIG 操作时序

4.1 命令操作时序

  当用户逻辑app_en信号被断言且app_rdy信号从MIG被断言时,MIG接受命令。每当app_rdy被取消断言时,MIG将忽略该命令。用户逻辑需要将app_en与有效命令和地址值沿着保持为高电平,直到app_rdy被断言,如下图所示:

在这里插入图片描述
  只有当app_rdy 与 app_en同时为高时,命令和地址才会被写入到MIG,如图红色的位置,这类似于AXI里的握手信号。

4.2 写数据时序

  首先需要检查app_wdf_rdy,该信号为高表明此时IP核数据接收处于准备状态,可以接收用户发过来的数据,在当前时钟拉高写使能(app_wdf_wren),同时给出写数据这样加上发起的写命令操作就可以成功向IP核写数据,具体时序如下图所示:

在这里插入图片描述
  如上图所示,写数据有三种情形均可以正确写入:

  1. 写数据时序和写命令时序发生在同一拍
  2. 写数据时序比写命令时序提前一拍
  3. 写数据时序比写命令时序至多延迟两拍

4.3 读数据时序

  用户发出读命令后,用户只需等待数据有效信号(app_rd_data_valid)拉高,为高表明此时数据总线上的数据是有效的返回数据,有效读数据要晚若干周期才出现在数据总线上。如下图所示:

在这里插入图片描述

五、配置 MIG 步骤

  打开IP库搜索MIG,然后打开,第一个界面是MIG的一些简要说明,直接点NEXT就行。

在这里插入图片描述

  第二个界面主要就是自定义MIG名称,以及MIG核数量和是否用AXI接口的MIG,本次实验先用默认的app接口,所以不选AXI4。

在这里插入图片描述
  第三个界面选择兼容的FPGA器件,这里不用就不选择

在这里插入图片描述
  第四个界面选择控制什么类型的DDR,这里选择DDR3
在这里插入图片描述
  第五个界面选择DDR3具体的物理参数

在这里插入图片描述

  1. Clock Period:MIG输出给DDR3物理运行的时钟频率,DDR3基于此时钟双沿采样,因此DDR3的实际传输数据速率为800M。
  2. PHY to Controller Clock Ratio:DDR3物理芯片运行时钟和MIG IP核的用户端(FPGA)的时钟之比;一般有 4:1 和 2:1 两个选项,本次实验选 4:1。由于 DDR 芯片的运行时钟是 400MHz,因此 MIG IP 核的用户时钟(ui_clk)就是100MHz。
  3. Memory Type:DDR3 储存器类型选择。默认选择 Component,即贴片式的DDR。SODIMM为笔记本的DDR,RDIMM为服务器的DDR,UDIMM是台式机用的DDR。
  4. Memory Part:DDR3具体型号,这里选择开发板上的MT41J12816-125,如果没有找到自己开发板的型号,可以选择相近的芯片型号或者点击Create Custom Part来自定义芯片内部参数。
  5. Memory Voltage:DDR电压,上文可知DDR3的电压为1.5V,所以这里固定1.5V。
  6. Data Width:数据位宽选择,因为是开发板上有2块ddr3,所以这里位宽选择32。
  7. ECC:校验使能,数据位宽为 72 位的时候才能使用。
  8. Data Mask:数据屏蔽管脚使能
  9. Number of Bank Machines:是用来对具体的BANK使用几个Bank Machine来单独控制的,选择多了控制效率就会高,相应的占用的资源也多,本次芯片内部有8个bank,这里就选择4,每一个Bank Machine来控制2个BANK
  10. ORDERING: 该信号用来决定MIG控制器是否可以对它收到的指令进行重新排序,选择Normal则允许,Strict则禁止。本次选择Normal,从而获得更高效率。

  第六个界面选择MIG的设置
在这里插入图片描述

  1. Input Clock Period:输入给MIG核的时钟,MIG通过此时钟分频或者倍频出其它时钟,这里选择200M
  2. Read Burst Type and Length:突发类型选择顺序突发,且突发长度只支持8
  3. Output Driver Impdance Control:输出阻抗控制,这里选择默认的RZQ/7即可
  4. RTT:终端电阻,选择默认的RZQ/4即可
  5. Controller Chip Select Pin:片选引脚使能
  6. BANK_ROW_COLUMN:寻址方式选择第二种

  选择MIG参考时钟以及复位
在这里插入图片描述

  1. System Clock:选择上一个界面选择的时钟来源,如果是外部单端晶振进来,就选择Single-Ended;如果是外部差分晶振进来,就选择Differential;如果是内部锁相环产生,就选择No Buffer,这里我们是内部PLL产生,所以选择No Buffer。

  2. Reference Clock:MIG IP 核参考时钟。IP 核参考时钟要求是200Mhz,而MIG IP 核的系统时钟刚好也使用了200Mhz的系统时钟,所以可以选择Use System Clock这个选项

  3. System Reset Polarity:复位信号电平选择,这里选择低有效

  下一个界面是配置阻抗匹配,默认50Ohms即可

在这里插入图片描述
  下一个界面是选择DDR管脚,如果只是单纯仿真,选上面就好,如果是下板验证,就要选择下面这个根据实际开发板管脚选择
在这里插入图片描述
  下一个界面是选择一些信号引脚,这里全都选择No connect即可,后续没有配置了,一路点next就完成了MIG核的配置
在这里插入图片描述

六、MIG 读写控制代码编写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1968820.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Datawhale AI夏令营第三期 AI+物质科学学习记录 Task2 RNN建模SMILES进行反应产率预测

引导 如何将化学知识转化为计算机可识别的形式 提到化学应该会想到元素周期表&#xff0c;分子式&#xff0c;化学反应方程等等&#xff0c;化学这门学科的知识和内容都有专有符号记录的&#xff0c;但计算机不能理解&#xff0c;所以需要将这些符号让计算机能理解 Ai4Chemi…

python orm框架有哪些

ORM概念 ORM&#xff08;Object Ralational Mapping&#xff0c;对象关系映射&#xff09;用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样&#xff0c;我们在具体的操作实体对象的时候&#xff0c;就不需要再去和复杂的SQL语句打交道&#xff0c;只需简…

5 postgresql 并行查询

并行扫描会占用更多的cpu/IO内存资源&#xff0c;开启的时候要小心配置。 大部分场景都能提高查询效率 之前有过一个生产案例&#xff0c;开启并行之后性能反而没有普通的好&#xff0c;原因就是占有了太多资源&#xff0c;查询慢了&#xff0c;增加表锁概率&#xff0c;产生…

ISO 14001:引领企业绿色革命的环境管理体系

ISO 14001 以其预防为主、系统化管理的特点&#xff0c;在众多管理体系中脱颖而出。该标准强调通过识别和控制环境因素&#xff0c;提前预防潜在环境问题&#xff0c;从根本上减少企业对环境的负面影响。这种预防性管理模式&#xff0c;不仅能够有效保护环境&#xff0c;还能降…

.[datastore@cyberfear.com].mkp勒索病毒数据怎么处理|数据解密恢复

引言 近年来&#xff0c;网络安全威胁日益严峻&#xff0c;其中勒索病毒成为了一种极具破坏性的恶意软件。特别是[conkichinmodlconkichinmodl.com].mkp 、[datastorecyberfear.com].mkp勒索病毒&#xff0c;其通过加密用户文件并索取赎金的方式&#xff0c;给受害者带来了巨大…

15.列表框文本域和文件域

一、列表框 <!-- 下拉框&#xff0c;列表框 --><p>城市&#xff1a;<select name"城市"><option value"Guangzhou">广州</option><option value"Shenzhen" selected>深圳</option><option value&…

Zabbix 7.0 安装

在zabbix官网中有着比较完善的安装步骤&#xff0c;针对不同的系统都有。可以直接按照举例说明进行安装。本文只是针对其提供的安装步骤进行一些说明解释补充。 安装环境 操作系统版本&#xff1a;AlmaLinux 9.4&#xff08;10.10.20.200&#xff09;zabbix版本&#xff1a;7.…

A股震荡前行,3000点指日可待?

今天的A股&#xff0c;让人瞬间呆住了&#xff0c;你知道是为什么吗&#xff1f;盘面上出现2个耐人寻味的重要信号&#xff0c;一起来看看&#xff1a; 1、今天A股小幅洗盘&#xff0c;涨了一天就熄火了&#xff1f;让人瞬间呆住了。不慌&#xff01;敢于回踩&#xff0c;才能更…

两个好消息,你先听哪个?

1.第五大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024)成功申请IEEE出版&#xff0c;上线IEEE官网&#xff0c;欢迎投稿参会&#xff01;&#xff01;&#xff01; &#x1f4e3;IEEE独立出版&#xff0c;设置优秀评选 &#x1f525;院士加盟&#xff0c;中外高…

C嘎嘎浅聊string

那么这篇文章我们开始学习 c嘎嘎的string stl简介 什么是stl STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的 组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架 stl版本 原始版本、P.J.版本、RW版…

机械学习—零基础学习日志(高数18——无穷小与无穷小)

零基础为了学人工智能&#xff0c;真的开始复习高数 学习速度加快&#xff01; 无穷小定义 这里可以记住&#xff0c;无穷小有一个特殊&#xff0c;那就是零。 零是最高阶的无穷小&#xff0c;且零是唯一一个常数无穷小。 张宇老师还是使用了超实数概念来讲解无穷小。其实是…

在云服务器上自动化部署项目,jenkins和gitee

▮全文概述 在编写项目时&#xff0c;很头大的事情就是需要自己手动的上传jar包到服务器上启动。如果出现一点bug&#xff0c;就要重头上传和启动。这是一件很烦的事情&#xff0c;所以&#xff0c;可以使用jenkins和gitee实现项目的自动部署 ▮全流程 在本地提交代码到gitee …

kvm+glusterfs+pcs分布式存储构建kvm高可用群集。

kvmglusterfspcs分布式存储构建kvm高可用群集。 高可用指能在短时间内自动完成故障转移&#xff0c;kvm在实现故障自动转移的方式如果要考虑速度那么基于共享存储的迁移方法无疑是最快的。而共享存储的高可用就可以用glusterfs来实现。 glusterfs可以利用分布式复制卷兼顾了性能…

图解RocketMQ之消费者如何进行消息重试

大家好&#xff0c;我是苍何。 在上一篇[[图解RocketMQ之生产者如何进行消息重试]]中分析了当生产者发送消息失败的时候&#xff0c;RocketMQ 是如何进行重试的。 最后留了一个问题&#xff0c;生产端的消息是重试 hold 住了&#xff0c;但如果消费者出现异常&#xff0c;消费…

leetcode53. 最大子数组和(java实现)

今天分享的题目是leetcode53题 本题的解题思路&#xff1a;贪心算法。 举个例子&#xff1a; nums [-2,1,-3,4,-1,2,1,-5,4]&#xff0c;如果说我们的累加和是负数那么就将其舍弃&#xff0c;换下一个位置从新进行累加&#xff0c;因为如果目前我们的累加和如果是负数那么还不…

Zotero的探索之路

下载安装 Zotero | Downloads&#xff1a;点击链接&#xff0c;不仅要下载软件本身&#xff0c;也要下载浏览器connector&#xff0c;这样就方便从网页抓取论文到zotero本地了&#xff0c;浏览器是使用插件导入下载包即可 导入文献方法 zotero自动下载&#xff08;推荐&#…

C 语言快速排序算法

升序排序 /*快速排序算法排序规则 */ int32_t CmpCb(const void* _a, const void* _b) {uint16_t* a (uint16_t*)_a;uint16_t* b (uint16_t*)_b;int32_t val 0;if (*a > *b){val 1;}else if (*a < *b){val -1;}else {val 0;}return val; }int main() {// 创建局部…

c++----类与对象(下)

当我们简单的学习了上一篇日期类。简单的理解并且使用了我们前面学习的知识。当然这还只是我们c的九牛一毛。并且我们的类与对象的知识还没学习完。今天我们来把类与对象的知识完善一下。 初始化列表 那么今天我们就不讲废话了&#xff0c;我们直接来主题。首先我们可以看到我…

大型语言模型入门

大型语言模型 快速、全面了解大型语言模型。学习李宏毅课程笔记。 ChatGPT 目前由OpenAI公司发明的非常火的人工智能AI应用ChatGPT&#xff0c;到底是什么原理呢&#xff1f; G&#xff1a;Generative(生成) P&#xff1a;Pre-trained(预训练) T&#xff1a;Transformer(一种…

手把手教你如何在Linux上轻松安装Python,告别编程入门难题

导语&#xff1a; Python作为当下最热门的编程语言之一&#xff0c;受到了越来越多人的喜爱。对于Linux用户来说&#xff0c;掌握如何在Linux上安装Python至关重要。今天&#xff0c;就让我带领大家一步步在Linux上安装Python&#xff0c;让你轻松迈入编程世界&#xff01; 一…