脑子里一些乱七八糟的东西,不整理容易丢,更容易混淆。现在先整理一下有关内存(主要是DDR)的一些东西。
我认识内存是从计算机开始的(也许大多数人都是这样),那是知道主办上那个树立起来的小条叫做内存,它和系统运行的快慢有着直接的关系(尤其是到了windows时代),而且价格也不菲(当时4M的内存要几百块)。时间过去了10几年,我对这个叫内存的东西已经有了很深刻的了解。就还从外观谈起吧,直接说技术我都觉得枯燥。
内存都是一条插在上面,但是却有单排pin和双排pin的区别。最早的只有30pin每次能读写8bit或者16bit。后来有了每次读写32bit的,管脚变成了72pin(后来还有144pin)。工作电压一般为5V。这是的内存都是单排的,叫SIMM(signal inline memory module),但是却两面有金手指。其实两面的pin是联通的,实际上相当与一个。但是由于制造技术问题,这样做在当时是必要的。而且之所以叫金手指也是因为其表面为了减少接触电阻而镀了金。但是现在的金手指已经不再镀金了,取而代之的是镀锡。当然没有人叫它“锡手指”。
附72pin管脚定义:
Pin | Non-Parity | Parity | Description |
1 | VSS | VSS | Ground |
2 | DQ0 | DQ0 | Data 0 |
3 | DQ1 | DQ1 | Data 1 |
4 | DQ2 | DQ2 | Data 2 |
5 | DQ3 | DQ3 | Data 3 |
6 | DQ4 | DQ4 | Data 4 |
7 | DQ5 | DQ5 | Data 5 |
8 | DQ6 | DQ6 | Data 6 |
9 | DQ7 | DQ7 | Data 7 |
10 | VCC | VCC | +5 VDC |
11 | PD1 | PD1 | Presence Detect 1 |
12 | A0 | A0 | Address 0 |
13 | A1 | A1 | Address 1 |
14 | A2 | A2 | Address 2 |
15 | A3 | A3 | Address 3 |
16 | A4 | A4 | Address 4 |
17 | A5 | A5 | Address 5 |
18 | A6 | A6 | Address 6 |
19 | A10 | A10 | Address 10 |
20 | n/c | PQ8 | Data 8 (Parity 1) |
21 | DQ9 | DQ9 | Data 9 |
22 | DQ10 | DQ10 | Data 10 |
23 | DQ11 | DQ11 | Data 11 |
24 | DQ12 | DQ12 | Data 12 |
25 | DQ13 | DQ13 | Data 13 |
26 | DQ14 | DQ14 | Data 14 |
27 | DQ15 | DQ15 | Data 15 |
28 | A7 | A7 | Address 7 |
29 | A11 | A11 | Address 11 |
30 | VCC | VCC | +5 VDC |
31 | A8 | A8 | Address 8 |
32 | A9 | A9 | Address 9 |
33 | /RAS3 | RAS3 | Row Address Strobe 3 |
34 | /RAS2 | RAS2 | Row Address Strobe 2 |
35 | DQ16 | DQ16 | Data 16 |
36 | n/c | PQ17 | Data 17 (Parity 2) |
37 | DQ18 | DQ18 | Data 18 |
38 | DQ19 | DQ19 | Data 19 |
39 | VSS | VSS | Ground |
40 | /CAS0 | CAS0 | Column Address Strobe 0 |
41 | /CAS2 | CAS2 | Column Address Strobe 2 |
42 | /CAS3 | CAS3 | Column Address Strobe 3 |
43 | /CAS1 | CAS1 | Column Address Strobe 1 |
44 | /RAS0 | RAS0 | Row Address Strobe 0 |
45 | /RAS1 | RAS1 | Row Address Strobe 1 |
46 | A12 | A12 | Address 12 |
47 | /WE | WE | Read/Write |
48 | A13 | A13 | Address 13 |
49 | DQ20 | DQ20 | Data 20 |
50 | DQ21 | DQ21 | Data 21 |
51 | DQ22 | DQ22 | Data 22 |
52 | DQ23 | DQ23 | Data 23 |
53 | DQ24 | DQ24 | Data 24 |
54 | DQ25 | DQ25 | Data 25 |
55 | n/c | PQ26 | Data 26 (Parity 3) |
56 | DQ27 | DQ27 | Data 27 |
57 | DQ28 | DQ28 | Data 28 |
58 | DQ29 | DQ29 | Data 29 |
59 | DQ31 | DQ31 | Data 31 |
60 | DQ30 | DQ30 | Data 30 |
61 | VCC | VCC | +5 VDC |
62 | DQ32 | DQ32 | Data 32 |
63 | DQ33 | DQ33 | Data 33 |
64 | DQ34 | DQ34 | Data 34 |
65 | n/c | PQ35 | Data 35 (Parity 4) |
66 | PD2 | PD2 | Presence Detect 2 |
67 | PD3 | PD3 | Presence Detect 3 |
68 | PD4 | PD4 | Presence Detect 4 |
69 | PD5 | PD5 | Presence Detect 1 |
70 | PD6 | PD6 | Presence Detect 6 |
71 | PD7 | PD7 | Presence Detect 7 |
72 | VSS | VSS | Ground |
到了SDRAM时代,SIMM逐步被被DIMM代替。,市场上叫SDRAM内存条就是168pin的DIMM,它提供64bit数据宽度,工作电压降到了3.3v。当然现在几乎没有谁的电脑还用SDRAM(我是落后者,刚刚换掉了它)。它在外观上最显著的特点是有2个开口,防止插错方向。虽然现在在PC上少有人用,但是在很多其它系统上SDRAM还是依然存在。PC上负责CPU和内存之间联系的是北桥芯片,早期SIMM时,由于奔腾的CPU是64bit,而内存的数据线是32bit,导致至少要插2条内存才能工作。这其实不是容量问题,而是位宽问题。当然当DIMM出现后,位宽提高了,这个问题也就不存在了。但是当我们从内存颗粒来看这64bit数据宽度时,我们发现不是每个颗粒都能达到64bit,所以外在的64bit其实是多个颗粒拼接出来的。那么如果要更多的内存怎么办呢?就是要组成多组这样的64bti,这就是rank,做硬件的喜欢叫作片选信号。
下面说点稍微复杂的,毕竟我们不是简单的装电脑的,而是做硬件设计的。
在SDRAM中,有行、列两个方向的寻址译码来让你准确的找到要访问的地址。但是过大的行、列译码却容易产生错误和降低速度。所以在SDRAM内部有了bank的概念。说的通俗一点就是一定的行×列定义成一个bank,然后将都个bank做到一片RAM里,以提高RAM容量。说的技术一点就是多了一维寻址空间。
在做内存条的时候,通常将若干内存颗粒(8位/16位数据宽度)拼成64位数据宽度的接口,这是因为CPU是64位的。但是存储深度此时就等于内存颗粒的深度。如果想在一条内存上继续增加容量,就只能将上述的颗粒编为一组,然后增加这样的组数,这就是rank。还是可以技术一点的说:又多了一维寻址空间。
对于 SDRAM来说,初始话是必不可少的。
不过SDRAM的初始话并不复杂,只有这一个配置寄存器。具体过程如下:
1.200us的上电延时,只是为了保证电平的稳定。
2.所有bank预充电。
3。8个周期的等待,等待预充电的完成
4.配置上面那个寄存器,然后就可以用了。
和普通的RAM相比,SDRAM的操作稍有一点复杂,除了读写操作之外,还有一些其它的辅助性操作。只所以说是辅助性的,就是因为RAM的本质功能是读写,做其它的事情那是情非得以。
但是这里面有一件事情是确定的,如果从所用时钟的排数上看,SDRAM的读写要比普通RAM慢,而且使用起来还有很多复杂的额外操作(比如刷新)。这就导致如果你象用普通RAM一样用SDRAM,很可能得不到更高的速度。这就涉及到用法问题了,这是应用者最该考虑的。
SDRAM说了很多,现在该看看DDR SDRAM了。DDRI的内存条,用的就是DDR SDRAM颗粒,184针的DIMM接口。从这个表述上可以看到,DDR SDRAM 的本质仍然是SDRAM,只不过前面加了一个修饰--DDR。什么是DDR,就是在一次时钟的上下双沿都工作。而这其实仅仅是接口上的革新,本质的存储单元仍然是SDRAM。这种接口的革新被叫做“预取”或者“2n预取”,其本质其实就是传-并转换。当然这对时钟的要求严格了许多,因此时钟变成的差分信号,和原来相比,时钟沿,尤其是下降沿的精度要求提高了。DLL就是应这个要求引进的。而为什么要费这么多周折来做DDR,其实就是上面将到的,SDRAM的读写速度并不尽如人意。
DDR的出现给硬件使用者带来了更多的麻烦事,也同时给firmwire的编写者提出了更大的挑战。如果操作不得当,其效率是会让人失望的。
由于DDR的内部结构和SDRAM基本一致,所以其初始化过程就大同小异了,只是多了DLL的初始化过程,并且多了一些配置寄存器。
DDRII在原有的DDR基础上进一步做了速度上的提高,电压为1.8V, pin脚也增加到200多个,但是其逻辑本质没有什么改变。如果说DDRII的创新,那就是OCD 和ODT的概念了,这为提高速度做了最基本的保证。当然从速度上看,DDRII在内部又增加了预取,使得内部的时钟实际下降为外部时钟的一半,这样,提高外部时钟似乎就成了和RAM关系(和以往相比)不太大的事情了。