内存容量自动识别

来自Jack's Lab
跳转到: 导航, 搜索

目录

1 概述

现在内存条上皆有一个 8 针的 EEPROM 芯片(大约为 3mm x 2mm x 1.5mm)记录该内存条的一些参数信息,如工作频率,工作电压,行地址位宽,列地址位宽等等。一般称该芯片为 SPD (Serial Presence Detect) 芯片。


内存条上的 SPD 容量一般为 256 字节,使用 I2C 接口,因此要读取其中的信息,得先初始化好 I2C 总线控制器,欣慰的是 I2C 是一个很简单的总线。



2 SPD Table

一般称 256 字节的 SPD 数据位 SPD Table,其每一字节是为一个数据单位。择其要着,简述如下:

Byte 1:
SPD 容量,常见的为 256B (0x08, 2^8),也有 128B (0x07, 2^7)

Byte 3:
行地址位宽,0x0E (14 bits),0x0C (12 bits) 

Byte 4:
列地址位宽,0x0A (10 bits) 

Byte 5:
Number of physical banks on DIMM,物理 bank 数,Module Bank 数,又称 rank 数。rank 的集合一般称为一个 module(相当于一个内存条)

Byte 6:
Module Width of this assembly,数据总线接口位宽,现在一般为 64 bit,ECC 的为 72 位。指的是一个 rank 的总线位宽,多个 rank 通过片
选来切换,对外而言实际上就是 Module (rank 的集合)的数据位宽

Byte 7:
Module Width of this assembly (high bits),数据总线接口位宽的扩展字节,用于 Byte 6 不够用的情形

Byte 11:
DIMM Configuration Type,数据校验类型,有:
ECC: 0x00,则 64 bit 之数据宽度还要加一个 8 bit,一共 72 bit。计算容量时要剔除这 8 bit
Non ECC: 0x02

Byte 13:
Primary SDRAM Width,芯片的位宽,一般为 8 bits 或 16 bits,此为单个内存颗粒 (chip) 内部 bank 的位宽,多个 bank 通过片选切换,因
此亦可称其为单个 chip 的位宽。

Byte 17:
Number of Banks on SDRAM Device,内存颗粒 (chip) 内部 bank 数,一般为 4



3 内存结构

多个 bank 是为一个 chip,数据位宽为 sdram_width

多个 chip 组成一个 rank,数据位宽为 data_width

多个 rank 合为一个 Module (内存条),数据位宽仍为 data_width



4 容量计算

每个 rank 所含 chip 的数为:

 n_chips_per_rank = data_width / sdram_width


总 chips 数为:

 n_chips = n_chips_per_rank * n_ranks_per_module 


每个 chips 的容量则为:

 chip_size = 2 ^ (n_cols + n_rows) * sdram_width * n_banks_per_chip 


列地址位宽和行地址位宽是 chip 内之 bank 的参数


故内存总容量为:

memery_size = 2 ^ (n_cols + n_rows) * data_width * n_banks_per_chip * n_ranks_per_module


还有一个简化的计算方法:

Byte 31: 
Module Bank Density,每个 rank 的容量。其值含义为:
0x08 32 MB 
0x10 64M 
0x20 128MB 
0x40 256MB 
0x80 512MB 

可以简化为 rank_density * 4MB

则另一个计算方法为:

 memory_size = rank_density * 4MB * n_ranks_per_module











个人工具
名字空间

变换
操作
导航
工具箱