一、DDR3簡(jiǎn)介
DDR3全稱double-data-rate 3 synchronous dynamic RAM,即第三代雙倍速率同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器。所謂同步,是指DDR3數(shù)據(jù)的讀取寫入是按時(shí)鐘同步的;所謂動(dòng)態(tài),是指DDR3中的數(shù)據(jù)掉電無法保存,且需要周期性的刷新,才能保持?jǐn)?shù)據(jù);所謂隨機(jī)存取,即可以隨機(jī)操作任一地址的數(shù)據(jù);所謂double-data-rate,即時(shí)鐘的上升沿和下降沿都發(fā)生數(shù)據(jù)傳輸。
圖1. DDR3結(jié)構(gòu)
二、地址的概念及容量計(jì)算
2.1地址的概念
DDR3的內(nèi)部是一個(gè)存儲(chǔ)陣列,將數(shù)據(jù)“填”進(jìn)去,你可以它想象成一張表格。和表格的檢索原理一樣,先指定一個(gè)行(Row),再指定一個(gè)列(Column),我們就可以準(zhǔn)確地找到所需要的單元格,這就是內(nèi)存芯片尋址的基本原理。對(duì)于內(nèi)存,這個(gè)單元格可稱為存儲(chǔ)單元,那么這個(gè)表格(存儲(chǔ)陣列)就是邏輯 Bank(Logical Bank,下面簡(jiǎn)稱Bank)。
DDR3內(nèi)部Bank示意圖,這是一個(gè)MXN的陣列,B代表Bank地址編號(hào),C代表列地址編號(hào),R代表行地址編號(hào)。如果尋址命令是B1、R3、C4,就能確定地址是圖中紅格的位置目前DDR3內(nèi)存芯片基本上都是8個(gè)Bank設(shè)計(jì),也就是說一共有8個(gè)這樣的“表格”。尋址的流程也就是先指定Bank地址,再指定行地址,然后指列地址最終的確尋址單元。
圖2. DDR3地址
目前DDR3系統(tǒng)而言,還存在物理Bank的概念,這是對(duì)內(nèi)存子系統(tǒng)的一個(gè)相關(guān)術(shù)語,并不針對(duì)內(nèi)存芯片。內(nèi)存為了保證CPU正常工作,必須一次傳輸完CPU 在一個(gè)傳輸周期內(nèi)所需要的數(shù)據(jù)。而CPU在一個(gè)傳輸周期能接受的數(shù)據(jù)容量就是CPU數(shù)據(jù)總線的位寬,單位是bit(位)。控制內(nèi)存與CPU之間數(shù)據(jù)交換的北橋芯片也因此將內(nèi)存總線的數(shù)據(jù)位寬等同于CPU數(shù)據(jù)總線的位寬,這個(gè)位寬就稱為物理Bank(Physical Bank,有的資料稱之為Rank)的位寬。目前這個(gè)位寬基本為64bit。
2.2 DDR3容量計(jì)算
上一節(jié)我們已經(jīng)說過bank、row、column的概念,容量就要據(jù)此來計(jì)算:
假設(shè):
bank地址線位寬為3,及bank數(shù)目為 2^3=8;
行地址線位寬位13,及A0…A12;
列地址線位寬為10,及A0…A9;
有 2^3 * 2^13 * 2^10 = 2^26 =67108864b= 64Mb
再加上數(shù)據(jù)線,則容量為 64Mb x 16 = 128M Byte = =1G bit
三、重要給概念理解
3.1 行選通周期
在實(shí)際工作中,Bank地址與相應(yīng)的行地址是同時(shí)發(fā)出的,此時(shí)這個(gè)命令稱之為“行激活”(Row Active)。在此之后,將發(fā)送列地址尋址命令與具體的操作命令(是讀還是寫),這兩個(gè)命令也是同時(shí)發(fā)出的,所以一般都會(huì)以“讀/寫命令”來表示列尋址。根據(jù)相關(guān)的標(biāo)準(zhǔn),從行有效到讀/寫命令發(fā)出之間的間隔被定義為tRCD,即RAS to CAS Delay(RAS至CAS延遲,RAS就是行地址選通脈沖,CAS就是列地址選通脈沖),我們可以理解為行選通周期。tRCD是DDR的一個(gè)重要時(shí)序參數(shù),廣義的tRCD以時(shí)鐘周期(tCK,Clock Time)數(shù)為單位,比如tRCD=3,就代表延遲周期為兩個(gè)時(shí)鐘周期,具體到確切的時(shí)間,則要根據(jù)時(shí)鐘頻率而定,時(shí)鐘頻率100M,tRCD=3,代表30ns的延遲。
圖3. 行選通周期tRCD
3.2 列地址脈沖選通潛伏期
相關(guān)的列地址被選中之后,將會(huì)觸發(fā)數(shù)據(jù)傳輸,但從存儲(chǔ)單元中輸出到真正出現(xiàn)在內(nèi)存芯片的 I/O 接口之間還需要一定的時(shí)間(數(shù)據(jù)觸發(fā)本身就有延遲,而且還需要進(jìn)行信號(hào)放大),這段時(shí)間就是非常著名的 CL(CAS Latency,列地址脈沖選通潛伏期)。CL 的數(shù)值與 tRCD 一樣,以時(shí)鐘周期數(shù)表示。如 DDR3-800,時(shí)鐘頻率為 100MHz,時(shí)鐘周期為 10ns,如果 CL=2 就意味著 20ns 的潛伏期。
注:CL只是針對(duì)讀取操作。
圖4. CL的概念(CL=2,tAC=1)
注意:delay與Latency雖然都有“延遲”的意思,但本質(zhì)上是不同的
Delay :事情要在這個(gè)時(shí)間之后開始
Latency:事情已經(jīng)發(fā)生,但是還不夠穩(wěn)定需要一個(gè)穩(wěn)定時(shí)間
3.3 突發(fā)傳輸?shù)母拍?/p>
目前內(nèi)存的讀寫基本都是連續(xù)的,因?yàn)榕cCPU交換的數(shù)據(jù)量以一個(gè)Cache Line(即CPU內(nèi)Cache的存儲(chǔ)單位)的容量為準(zhǔn),一般為64字節(jié)。而現(xiàn)有的Rank位寬為8字節(jié)(64bit),那么就要一次連續(xù)傳輸8次,這就涉及到我們也經(jīng)常能遇到的突發(fā)傳輸?shù)母拍睢M话l(fā)(Burst)是指在同一行中相鄰的存儲(chǔ)單元連續(xù)進(jìn)行數(shù)據(jù)傳輸?shù)姆绞剑B續(xù)傳輸?shù)闹芷跀?shù)就是突發(fā)長(zhǎng)度(Burst Lengths,簡(jiǎn)稱BL)。
在進(jìn)行突發(fā)傳輸時(shí),只要指定起始列地址與突發(fā)長(zhǎng)度,內(nèi)存就會(huì)依次地自動(dòng)對(duì)后面相應(yīng)數(shù)量的存儲(chǔ)單元進(jìn)行讀/寫操作而不再需要控制器連續(xù)地提供列地址。這樣,除了第一筆數(shù)據(jù)的傳輸需要若干個(gè)周期(主要是之前的延遲,一般的是tRCD+CL)外,其后每個(gè)數(shù)據(jù)只需一個(gè)周期的即可獲得。
連續(xù)讀取模式:只要指定起始列地址與突發(fā)長(zhǎng)度,后續(xù)的尋址與數(shù)據(jù)的讀取自動(dòng)進(jìn)行,而只要控制好兩段突發(fā)讀取命令的間隔周期(與BL相同)即可做到連續(xù)的突發(fā)傳輸。
在 DDR SDRAM 中,突發(fā)長(zhǎng)度只有 2、4、8 三種選擇,沒有了隨機(jī)存取的操作(突發(fā)長(zhǎng)度為 1)和全頁(yè)式突發(fā)。這是為什么呢?因?yàn)?L-Bank一次就存取兩倍于芯片 位寬的數(shù)據(jù),所以芯片至少也要進(jìn)行兩次傳輸才可以,否則內(nèi)部多出來的數(shù)據(jù)怎么處理?但是,突發(fā)長(zhǎng)度的定義也與 SDRAM 的不一樣了,它不再指所連續(xù)尋址的存儲(chǔ)單元數(shù)量,而是指連續(xù)的傳輸周期數(shù),每次是一個(gè)芯片位寬的數(shù)據(jù)。
上面是別人的解釋,筆者結(jié)合自己的理解和代碼實(shí)現(xiàn)中再解釋一下:
突發(fā)傳輸是為了提高傳輸效率,這涉及到預(yù)取的概念;DDR3突發(fā)長(zhǎng)度BL=8,在t1時(shí)刻我們發(fā)起讀命令,給出地址addr1,那么因?yàn)槭峭话l(fā)傳輸,所以實(shí)際我們將讀出addr1以及它之后地址,總共8個(gè)地址,也就讀出了8個(gè)數(shù)據(jù);那么t2時(shí)刻,我們繼續(xù)讀數(shù),給出的地址addr=addr1+8;結(jié)合下圖更容易理解:
圖5. 突發(fā)傳輸
注:
t1 ,t2 / t3,t4時(shí)刻不一定連續(xù);要看ddr是否準(zhǔn)備好,具體到代碼就是app_rdy 并不是一直為高;
3.4 掩碼
掩碼簡(jiǎn)單解釋下,就是屏蔽掉我們傳輸不需要的數(shù)據(jù);掩碼每一位bit對(duì)應(yīng)ddr數(shù)據(jù)的1個(gè)字節(jié);當(dāng)掩碼為0,數(shù)據(jù)有效;當(dāng)掩碼為1,數(shù)據(jù)屏蔽;
一般不使用,傳輸數(shù)據(jù)全部有效,掩碼直接置0:(掩碼位寬根據(jù)數(shù)據(jù)位寬而定)
assign app_wdf_mask = 64'b0;
3.5 數(shù)據(jù)選取脈沖(DQS)
DQS 是DDR中的重要功能,它的功能主要用來在一個(gè)時(shí)鐘周期內(nèi)準(zhǔn)確的區(qū)分出每個(gè)傳輸周期,并便于接收方準(zhǔn)確接收數(shù)據(jù)。每一顆芯片都有一個(gè)DQS信號(hào)線,它是雙向的,在寫入時(shí)它用來傳送由北橋發(fā)來的DQS信號(hào),讀取時(shí),則由芯片生成DQS向北橋發(fā)送。完全可以說,它就是數(shù)據(jù)的同步信號(hào)。
在讀取時(shí),DQS與數(shù)據(jù)信號(hào)同時(shí)生成(也是在CK與CK#的交叉點(diǎn))。而DDR內(nèi)存中的CL也就是從CAS發(fā)出到DQS生成的間隔,DQS生成時(shí),芯片內(nèi)部的預(yù)取已經(jīng)完畢了,由于預(yù)取的原因,實(shí)際的數(shù)據(jù)傳出可能會(huì)提前于DQS發(fā)生(數(shù)據(jù)提前于DQS傳出)。由于是并行傳輸,DDR內(nèi)存對(duì)tAC也有一定的要求,對(duì)于DDR266,tAC的允許范圍是±0.75ns,對(duì)于DDR333,則是±0.7ns,有關(guān)它們的時(shí)序圖示見前文,其中CL里包含了一段DQS 的導(dǎo)入期。
DQS 在讀取時(shí)與數(shù)據(jù)同步傳輸,那么接收時(shí)也是以DQS的上下沿為準(zhǔn)嗎?不,如果以DQS的上下沿區(qū)分?jǐn)?shù)據(jù)周期的危險(xiǎn)很大。由于芯片有預(yù)取的操作,所以輸出時(shí)的同步很難控制,只能限制在一定的時(shí)間范圍內(nèi),數(shù)據(jù)在各I/O端口的出現(xiàn)時(shí)間可能有快有慢,會(huì)與DQS有一定的間隔,這也就是為什么要有一個(gè)tAC規(guī)定的原因。而在接收方,一切必須保證同步接收,不能有tAC之類的偏差。這樣在寫入時(shí),芯片不再自己生成DQS,而以發(fā)送方傳來的DQS為基準(zhǔn),并相應(yīng)延后一定的時(shí)間,在DQS的中部為數(shù)據(jù)周期的選取分割點(diǎn)(在讀取時(shí)分割點(diǎn)就是上下沿),從這里分隔開兩個(gè)傳輸周期。這樣做的好處是,由于各數(shù)據(jù)信號(hào)都會(huì)有一個(gè)邏輯電平保持周期,即使發(fā)送時(shí)不同步,在DQS上下沿時(shí)都處于保持周期中,此時(shí)數(shù)據(jù)接收觸發(fā)的準(zhǔn)確性無疑是最高的。
在寫入時(shí),以DQS的高/低電平期中部為數(shù)據(jù)周期分割點(diǎn),而不是上/下沿,但數(shù)據(jù)的接收觸發(fā)仍為DQS的上/下沿。
四、參考資料
如果我們只是拿來用ddr搬磚,那么它就簡(jiǎn)單,知道IP怎么使用就好,但是要想知其所以然,理論知識(shí)是必備的,這也是我們初學(xué)者所欠缺的東西,慢慢修煉吧!
參考資料①,里面所有信號(hào)都有解釋,感興趣的和想提升的可以仔細(xì)研究:
DDR基礎(chǔ)詳解
參考資料②,超詳細(xì)DDR3底層原理介紹,大佬首選
深入淺出DDR系列(一)--DDR原理篇
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1630文章
21776瀏覽量
604678 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7521瀏覽量
164089 -
Xilinx
+關(guān)注
關(guān)注
71文章
2169瀏覽量
121789
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論