浅析DDR

ops/2024/10/20 3:49:58/

一、内存条和内存颗粒

        内存颗粒指的是DDR内存芯片,其可以在电路板上单独使用,也可以通过多片内存颗粒组合成内存条进行使用。在计算机系统中,一般使用内存条。常用的内存颗粒的品牌有:镁光和三星等。镁光的某款DDR颗粒的正面和反面图片如下所示。

        内存条主要分为DIMM(Dual Inline Memory Module,双列直插内存模块)和SIMM(Single Inline Memory Module,单列直插内存模块)。从名字就可以看出,DIMM的两侧的金手指不是互通的,具备更多的传输引脚,可以独立传输信号。目前使用的大多是DIMM,此处重点看一下DIMM。DIMM的实物图片如下:

        DIMM常用的类型有以下几种:

        RDIMMs:registered DIMM。地址和控制信号在内存条上经过寄存,时钟经过PLL锁相处理。一般而言,容量更大,数据存储更稳定,但是单个数据的读写访问都要延后一个时钟周期。

        UDIMMs :unbuffered DIMM。指的是没有经过缓冲,数据和地址信号直接连接到DDR颗粒的内存模组(无缓冲器延时处理)。

        SODIMMs:Small outline DIMM,小型双列直插内存模块。SODIMMs也是无缓冲的,但是其尺寸更小,其主要用于笔记本等一些对尺寸有要求的产品中。

二、内存颗粒的结构

 1、memory cell

        DDR内存是一种随机访问的掉电丢失数据的存储器。为什么DDR中的数据掉电后会丢失数据呢? 这是内部的电路决定的。

        DDR存储数据的核心部件是电容,其存储1bit数据的最小电路memory cell如下:

        电容充满电时,保存数据为1'b1;电容放完电,保存数据为1‘b0。

        写过程中,首先使行地址有效,然后通过列地址信号,写驱动器将数据写入到电容中。

        读过程中,行地址有效,然后列地址选通,连通电容一端。此时通过采集放大器感知列地址线上的电压高低,读取到数据。

2、DDR的行列地址选通

        一个DDR颗粒,少则几百Mb的存储空间,多则几个G的存储空间,那么其内部到底是怎么的结构呢?具体如何读写呢?

        我们首先看一个简易的举例,假设有一个DDR颗粒,其只有一个BANK,行地址有8位,列地址有8位,其结构图如下:

        DDR外部接口的几个重要的引脚信号是是:行地址选中信号RAS,列地址选中信号CAS,写信号WE,地址信号,数据信号。

        读取图中黄色单元内的数据,需要执行的步骤如下:

        1、RAS信号有效,时序控制模块输出行地址至行地址解码模块,行地址解码模块将行地址6进行选通。此时位于行地址6的8个memory cells等待进行处理。

        2、由于我们的目标是黄色memory cell的内容,但是此时采样放大电路会将本行所有的memory cells读取出。

        3、。CAS有效后,时序控制模块输出列地址信号,有列地址解码器控制,选择对应列的数据进行输出。

        4、当然,这还并没有结束, 读取memory cell的过程是一个破坏性的过程,会使电容发生放电或者充电。为了保证memory cells中的数据保持不变,写驱动器需要再执行写操作,将读取的值再重新写入到每个memory cells中。

        5、关闭当前行的选通。

        6、剩下的就是预充电操作,为下一个操作进行准备。

        简单的DDR的读数据时序图如下所示。

        那么往黄色单元内写数据,需要执行的步骤如下:

        1、RAS信号有效,时序控制模块输出行地址至行地址解码模块,行地址解码模块将行地址6进行选通。此时位于行地址6的8个memory cells等待进行处理。

        2、由于我们的目标是黄色memory cell的内容,但是此时采样放大电路会将本行所有的memory cells读取出。

        3、WE信号有效,写入数据被锁存在数据缓冲器中。

        4、列地址选通信号CAS有效,此时,新输入的数据被写入到黄色memory cell中,而同时,则将采样放大器采集到的数据保持不变,写入到对应的memory cell中。

        5、关闭当前行的选通。

        6、剩下的就是预充电操作,为下一个操作进行准备。

        简单的DDR的写数据时序图如下所示。

        以上基本就是DDR颗粒的工作原理。注意的是,上述所有描述的都是1bit数据的读写,如果要实现2bits、4bits、8bits或者16bits数据的读写,只需要堆叠2个、4个、8个或者16个上述的硬件结构即可。如下图8bits的DDR颗粒结构图(一组这样的存储阵列,也称为1个BANK)。

3、DDR的BANK

        对于DDR的BANK,即将上面8bits的DDR阵列图,堆叠多个,其示意图如下:

        支持多个BANK的DDR颗粒,引脚信号是一般具有BANK_ADDR信号,用来区分访问的是哪一个BANK。同一个DDR颗粒的不同BANK不能同时访问。

        所以对于DDR颗粒而言,1个DDR颗粒多半多个BANK,1个BANK包含多个N bits存储阵列,Nbits存储阵列由N个1bits存储阵列组成,1bits存储阵列由无数个行列memory cell组成。

4、如何提高DDR数据访问速度

        a、数据突发传输

                通常DDR具备突发功能,即可以输出一行的连续列地址的数据。一般,DDR2可以突发传输4个字(DDR数据总线宽度),DDR3突发长度是8,DDR4突发长度是16。

        b、BANK交织

        最后,说一下内存的BANK交织。其目的是利用DDR的不同BANK相互独立的特性,最大限度的提高数据读写的速率:

        当读写完当前BANK的一行时,不能立刻读写此BAN的下一行,而是需要进行当前行的关闭,预充电等一系列操作,可能需要十几个或者二十几个时钟周期。为了减少时间的浪费,在当前BANK的当前行进行行关闭和预充电操作的同时,可以先行读写下一个BANK,通过这种方式实现读写速率的提高。

三,其他概念

        RANK概念:rank是为了rank是为了凑cpu的位数。例如cpu是64bit的,但是sdram一般是8bit,所以要凑8个,也就是数据位扩展,这8个就叫一个rank。

本文参考了以下视频内容,有需要的可以参考学习。DRAM基本工作原理_Memory Cells_哔哩哔哩_bilibili


http://www.ppmy.cn/ops/126881.html

相关文章

【Vue】Vue3.0 (十二)、watchEffect 和watch的区别及使用

上篇文章: 【Vue】Vue3.0 (十二)、watch对ref定义的基本类型、对象类型;reactive定义的对象类型的监视使用 🏡作者主页:点击! 🤖Vue专栏:点击! ⏰️创作时间&…

H.264视频,HEVC视频,VP9视频,AV1视频小知识

H.264、HEVC(H.265)、VP9和AV1是不同的视频编码格式,它们的主要区别在于压缩效率、支持的分辨率、编码技术以及专利和授权费用等方面。以下是这些编码格式的主要区别: H.264(AVC): 压缩效率&…

2024年度十大视频剪辑软件:新手入门到专业级别!

随着视频内容的日益丰富和多样化,视频剪辑软件也成为了许多创作者和爱好者的必备工具。在2024年,市面上涌现出了众多优秀的视频剪辑软件,它们各具特色,满足了不同用户的需求。以下是本年度十大视频剪辑软件的推荐,以及…

泛微Ecology9集成接口开发案例及代码详解

引言 在数字化转型的浪潮中,企业对于系统集成的需求日益增长。泛微Ecology9作为一款领先的协同办公软件,其强大的接口开发能力为企业信息系统的整合提供了有力支持。本文将详细介绍Ecology9的集成接口开发方法及最佳实践,帮助开发者快速上手…

【Linux】命令行下的增删查改之“查看”

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 头部内容获取(head) head命令的功能是显示文件开头的内容,默认值为前10行。 指令参数: -n 定义显示行数 -c 指定显示头部内容的字符数 -v 总是显示文件名的头信…

rabbitMQ消息重复问题怎么解决的?

RabbitMQ 消息重复的问题通常发生在消息的传递过程中,特别是在网络异常、生产者或消费者宕机等场景下,消息可能被重复消费。这种重复是由于 RabbitMQ 的 "至少一次投递" 保证机制引起的。为了解决消息重复的问题,可以采取以下几种常…

React 基础阶段学习计划

React 基础阶段学习计划 目标 能够创建和使用React组件。理解并使用State和Props。掌握事件处理和表单处理。 学习内容 环境搭建 安装Node.js和npm 访问 Node.js官网 下载并安装最新版本的Node.js。打开终端或命令行工具,输入 node -v 和 npm -v 检查是否安装…

Oracle 零宽空格问题处理

在Oracle中,去除字符串两端的零宽空格(Zero Width Space,Unicode编码为U200B)可以使用TRIM函数结合REGEXP_REPLACE函数来实现。由于标准的TRIM函数只能去除ASCII字符,对于Unicode字符如零宽空格,需要使用正…