DDR
DDR有几代了,目前应该最牛的是 DDR5,一般用在显存中,它的存储量大,存储的通信速率也非常高,接下来我就会在SDRAM的基础上来对DDR做一个介绍。 DDR的全称Double Data Rate SDRAM,即双倍速率数据流SDRAM。
DDR原理
要想搞清楚DDR的原理,首先必须搞清楚DDR的时序,下面这个图给出其时序: 和SDRAM相比,它多了两个信号CLK#与 DQS(数据选取脉冲)。CLK#与正常 CLK 时钟相位相反,形成差分时钟信号。而数据的传输在 CLK 与 CLK#的交叉点进行,可见在 CLK 的上升与下降沿(此时正好是 CLK#的上升沿)都有数据被触发,从而实现 DDR。 在上面这个图里面,白色部分实际就是SDRAM中的部分,灰色部分则是DDR另外加的部分,以此图为例可以看到数据在锁存器读取之后变成两路,分成两路 4bit 数据传给复用器,由后者将它们合并为一路 4bit 数据流,然后由发送器在 DQS 的控制下在外部时钟上升与下降沿分两次传输 4bit 的数据给北桥。(注意发送部分这个DLL)这样传输频率就翻倍了(不上时钟频率)。这种内部存储单元容量(也可以称为芯片内部总线位宽) =2×芯片位宽(也可称为芯片 I/O 总线位宽)的设计,称为两位预取。因此在不扩展io总线位宽的基础上,内部的存储容量就翻倍了。 更多的不同: DDR在模式寄存器设置之前还有个额外的扩展模式寄存器设置。
接下来重点介绍一下DDR的知识: 差分时钟:怎么理解clk#,起到触发时钟校准的作用。由于数据是在 CK 的上下沿触发,造成传输周期缩短了一半,因此必须要保证传输周期的稳定以确保数据的正确传输,这就要求 CK 的上下沿间距要有精确的控制。但因为温度、 电阻性能的改变等原因, CK 上下沿间距可能发生变化,此时与其反相的 CK#就起到纠正的作用( CK 上升快下降慢, CK# 则是上升慢下降快)。而由于上下沿触发的原因,也使 CL=1.5 和 2.5 成为可能,并容易实现。与 CK 反相的 CK#保证了触发时机的准确性。 数据选取脉冲:它是双向信号,在由北桥(fpga侧的DDR控制器?)发送给ddr芯片时(写),由北桥产生,DQS的中间要对应数据的沿。在读ddr时,由ddr侧产生,DQS和数据的沿对齐。它的功能主要用来在一个时钟周期内准确的区分出每个传输周期,并便于接收方准确接收数据。 在读的时候,CL是从 CAS (列选)发出到 DQS 生成的间隔。而数据真正出现在数据 I/O 总线上相对于 DQS 触发的时间间隔被称为 tAC。tAC 是指上文结构图中灰色部分的数据输出时间。DQS生成时实际芯片内部的预取已经实现了。实际的数据传出可能会提前于 DQS 发生(数据提前于 DQS 传出)。正是因为由于芯片有预取的操作,所以DDR数据输出时的同步很难控制,所以读取的时候一致,但写的时候不是,容易读到旁边的数据?芯片有预取的操作,所以输出过去也难以完全同步,放在中间可能是最好的,前后偏差一些,读的数据也是这个真实的数据。这个地方可能比较难理解,**按我的理解就是在给DDR写数据时,由于它由预取的操作,可能会在DQS产生前把数据取过来,而这个时候数据和DQS就不能按理想的情况实现同步,而上下沿的时间很短,如果按这个来实现读取就很麻烦,因此规定了tAC使数据中点来对应DQS上下沿,这样即使有细微偏差,也是大致会在数据的中心稳定端来完成数据的传输,并且数据也是在DQS上下沿完成分割的。 **
写入延迟:,在发出写入命令后, DQS 与写入数据要等一段时间才会送达。这个周期被称为 DQS 相对于写入命令的延迟时间。毕竟一个时钟周期两次传送,需要很高的 控制精度,它必须要等接收方做好充分的准备才行。也就是下图中的tDQSS
突发长度和写入掩码:由于突发长度为1的话,一个存期单元的数据都读不完,因此DDR的突发长度从2开始,并且DDR2为4,DDR3为8,(它们的预取长度也是)以此类推。同样DM可以实现屏蔽。
延迟锁定回路:这个玩意跟DDR的输出有关(也就是fpga侧的读取)。DDR SDRAM 对时钟的精确性有着很高的要求,而 DDR SDRAM 有两个时钟,一个是外部的总 线时钟,一个是内部的工作时钟,在理论上 DDR SDRAM 这两个时钟应该是同步的,但由于种种原因,如温度、电压波动而产生延迟使两者很难同步,更何况时钟频率本身也有不稳定的情况( SDRAM 也内部时钟,不过因为它的工作/传输频率较低,所以内外同步问题并不突出)。 DDR SDRAM 的 tAC 就是因为内部时钟与外部时钟有偏差而引起的,它很可能造成因数据不同步而产生错误的恶果。实际上,不同步就是一种正/负延迟,如果延迟不可避免,那么若是设定一个延迟值,如一个时钟周期,那么内外时钟的上升与下降沿还是同步的。鉴于外部时钟周期也不会绝对统一,所以需要根据外部时钟动态修正内部时钟的延迟来实现与外部时钟的同步,这就是 DLL 的任务。 DLL 不同于主板上的 PLL,它不涉及频率与电压转换,而是生成一个延迟量给内部时钟,
|