DDR地址和容量計算、Bank理解

cajeptw發表於2018-07-25

DDR3 地址線

DDR3為減少地址線,把地址線分為行地址線和列地址線,在硬體上是同一組地址線
地址線和列地址線是分時複用的,即地址要分兩次送出,先送出行地址,再送出列地址。

   一般來說列地址線是10位,及A0...A9;行地址線數量根據記憶體大小,BANK數目,資料線位寬等決定(感覺也應該是行地址決定其他) ;

BANK

   bank是儲存庫的意思,也就是說,一塊記憶體內部劃分出了多個儲存庫,訪問的時候指定儲存庫編號,就可以訪問指定的儲存庫,記憶體中劃分了多少個bank,要看地址線中有幾位BA地址,如果有兩位,說明有4個bank,如果有3位,說明有8個bank

DDR3 容量計算

   下面這張圖是晶片k4t1g164qf資料中擷取的;以1Gb容量的DDR2顆粒為例(其他的類似);假設資料線位寬為16位,則看64Mb x 16這一列:

bank地址線位寬為3,及bank數目為 2^3=8;

行地址線位寬位13,及A0…A12;

列地址線位寬為10,及A0…A9;

有 2^3 * 2^13 * 2^10 = 2^26 =2^6Mb = 64Mb

再加上資料線,則容量為 64Mb x 16 = 128M Byte = =1G bit

這裡寫圖片描述

對於4Gb的16bit DDR3,

bank address有三個bit,所以單個16bit DDR3內部有8個bank.
表示行的有A0~A14,共15個bit,說明一個bank中有2^15個行。
表示列的有A0~A9,共10個bit,說明一個bank中有2^10個行。
來看看單塊16bit DDR3容量:
2^3*2^15*2^10=2^28=256M
我們的記憶體是512M,到這兒怎麼變成256M了?被騙了?
呵呵,當然沒有。
忘了我們前面一直提到的16bit。
16bit是2個byte對吧。
訪問一個地址,記憶體認為是訪問16bit的資料,也就是兩個位元組的資料。
256M個地址,也就是對應512M的資料了。

再來看看兩個16bit是如何組成一個32bit的。
有一個概念一定要清楚,這兒所說的兩個16bit組成一個32bit,指的是資料,與地址沒有關係
我開始這一塊沒搞清楚,一直認為是兩個16bit的地址組成了一個32bit的地址。然後高位地址,地位地址,七七八八。。。
之後沒一點頭緒。
將16bit/32bit指的是資料寬度之後,就非常明瞭了。
每一塊16bit DDR3中有8個bank,2^15個row,2^10個column。也就是有256M個地址
看前面的連線可知,兩塊16bit DDR3的BA0~BA2和D0~D14其實是並行連線到CPU。
也就是說,CPU其實認為只有一塊記憶體,訪問的時候按照BA0~BA2和D0~D14給出地址。
兩塊16bit DDR3都收到了該地址。
它們是怎麼響應的呢?
兩塊記憶體都是16bit,它們收到地址之後,給出的反應是要麼將給定地址上2個位元組送到資料線上,要麼是將資料線上的兩個位元組寫入到指定的地址。
再看資料線的連線,第一片的D0~D15連線到了CPU的D0~D15,第二片的D0~D15連線到了CPU的D16~D31。
CPU認為自己訪問的是一塊32bit的記憶體,所以CPU每給出一個地址,將訪問4個位元組的資料,讀取/寫入
這4位元組資料對應到CPU的D0~D31,又分別被連線到兩片記憶體的D0~D15,這樣一個32bit就被拆成了兩個16bit.
反過來,也就是兩個16bit組成了一個32bit.
CPU訪問的記憶體地址有256M個,每訪問一個地址,將訪問4個位元組,這樣CPU能訪問的記憶體即為1GB。

DDR3的內部是一個儲存陣列,將資料“填”進去,你可以它想象成一張表格。和表格的檢索原理一樣,先指定一個行(Row),再指定一個列(Column),我們就可以準確地找到所需要的單元格,這就是記憶體晶片定址的基本原理。對於記憶體,這個單元格可稱為儲存單元,那麼這個表格(儲存陣列)就是邏輯 Bank(Logical Bank,下面簡稱Bank)。

這裡寫圖片描述
DDR3內部Bank示意圖,這是一個NXN的陣列,B代表Bank地址編號,C代表列地址編號,R代表行地址編號。
如果定址命令是B1、R2、C6,就能確定地址是圖中紅格的位置
目前DDR3記憶體晶片基本上都是8個Bank設計,也就是說一共有8個這樣的“表格”。

定址的流程也就是先指定Bank地址,再指定行地址,然後指列地址最終的確定址單元。

目前DDR3系統而言,還存在物理Bank的概念,這是對記憶體子系統的一個相關術語,並不針對記憶體晶片。記憶體為了保證CPU正常工作,必須一次傳輸完CPU 在一個傳輸週期內所需要的資料。
而CPU在一個傳輸週期能接受的資料容量就是CPU資料匯流排的位寬,單位是bit(位)。
控制記憶體與CPU之間資料交換的北橋晶片也因此將記憶體匯流排的資料位寬等同於CPU資料匯流排的位寬,這個位寬就稱為物理Bank(Physical Bank,有的資料稱之為Rank)的位寬。目前這個位寬基本為64bit。

在實際工作中,Bank地址與相應的行地址是同時發出的,此時這個命令稱之為“行啟用”(Row Active)。在此之後,將傳送列地址定址命令與具體的操作命令(是讀還是寫),這兩個命令也是同時發出的,所以一般都會以“讀/寫命令”來表示列定址。根據相關的標準,從行有效到讀/寫命令發出之間的間隔被定義為tRCD,即RAS to CAS Delay(RAS至CAS延遲,RAS就是行地址選通脈衝,CAS就是列地址選通脈衝),我們可以理解為行選通週期。tRCD是DDR的一個重要時序引數,廣義的tRCD以時鐘週期(tCK,Clock Time)數為單位,比如tRCD=3,就代表延遲週期為兩個時鐘週期,具體到確切的時間,則要根據時脈頻率而定,DDR3-800,tRCD=3,代表30ns的延遲。

這裡寫圖片描述

接下來,相關的列地址被選中之後,將會觸發資料傳輸,但從儲存單元中輸出到真正出現在記憶體晶片的 I/O 介面之間還需要一定的時間(資料觸發本身就有延遲,而且還需要進行訊號放大),這段時間就是非常著名的 CL(CAS Latency,列地址脈衝選通潛伏期)。CL 的數值與 tRCD 一樣,以時鐘週期數表示**。
如 DDR3-800,時脈頻率為 100MHz,時鐘週期為 10ns,如果 CL=2 就意味著 20ns 的潛伏期。
不過CL只是針對讀取操作

由於晶片體積的原因,儲存單元中的電容容量很小,所以訊號要經過放大來保證其有效的識別性,這個放大/驅動工作由S-AMP負責,一個儲存體對應一個S- AMP通道。但它要有一個準備時間才能保證訊號的傳送強度(事前還要進行電壓比較以進行邏輯電平的判斷),因此從資料I/O匯流排上有資料輸出之前的一個時鐘上升沿開始,資料即已傳向S-AMP,也就是說此時資料已經被觸發,經過一定的驅動時間最終傳向資料I/O匯流排進行輸出,這段時間我們稱之為 tAC(Access Time from CLK,時鐘觸發後的訪問時間)。

這裡寫圖片描述

目前記憶體的讀寫基本都是連續的,因為與CPU交換的資料量以一個Cache Line(即CPU內Cache的儲存單位)的容量為準,一般為64位元組。而現有的Rank位寬為8位元組(64bit),那麼就要一次連續傳輸8次,這就涉及到我們也經常能遇到的突發傳輸的概念。突發(Burst)是指在同一行中相鄰的儲存單元連續進行資料傳輸的方式,連續傳輸的週期數就是突發長度(Burst Lengths,簡稱BL)。

在進行突發傳輸時,只要指定起始列地址與突發長度,記憶體就會依次地自動對後面相應數量的儲存單元進行讀/寫操作而不再需要控制器連續地提供列地址。這樣,除了第一筆資料的傳輸需要若干個週期(主要是之前的延遲,一般的是tRCD+CL)外,其後每個資料只需一個週期的即可獲得。

這裡寫圖片描述

突發連續讀取模式:只要指定起始列地址與突發長度,後續的定址與資料的讀取自動進行,而只要控制好兩段突發讀取命令的間隔週期(與BL相同)即可做到連續的突發傳輸。

談到了突發長度時。如果BL=4,那麼也就是說一次就傳送4×64bit的資料。但是,如果其中的第二筆資料是不需要的,怎麼辦?還都傳輸嗎?
為了遮蔽不需要的資料,人們採用了資料掩碼(Data I/O Mask,簡稱DQM)技術。通過DQM,記憶體可以控制I/O埠取消哪些輸出或輸入的資料。
這裡需要強調的是,在讀取時,被遮蔽的資料仍然會從儲存體傳出,只是在“掩碼邏輯單元”處被遮蔽。
DQM由北橋控制,為了精確遮蔽一個P-Bank位寬中的每個位元組,每個DIMM有8個DQM 訊號線,每個訊號針對一個位元組。這樣,對於4bit位寬晶片,兩個晶片共用一個DQM訊號線,對於8bit位寬晶片,一個晶片佔用一個DQM訊號,而對於 16bit位寬晶片,則需要兩個DQM引腳。

在資料讀取完之後,為了騰出讀出放大器以供同一Bank內其他行的定址並傳輸資料,記憶體晶片將進行預充電的操作來關閉當前工作行。還是以上面那個Bank示意圖為例。當前定址的儲存單元是B1、R2、C6。如果接下來的定址命令是B1、R2、C4,則不用預充電,因為讀出放大器正在為這一行服務。但如果地址命令是B1、R4、C4,由於是同一Bank的不同行,那麼就必須要先把R2關閉,才能對R4定址。從開始關閉現有的工作行,到可以開啟新的工作行之間的間隔就是tRP(Row Precharge command Period,行預充電有效週期),單位也是時鐘週期數。

這裡寫圖片描述

在不同Bank間讀寫也是這樣,先把原來資料寫回,再啟用新的Bank/Row。

DQS 是DDR中的重要功能,它的功能主要用來在一個時鐘週期內準確的區分出每個傳輸週期,並便於接收方準確接收資料。每一顆晶片都有一個DQS訊號線,它是雙向的,在寫入時它用來傳送由北橋發來的DQS訊號,讀取時,則由晶片生成DQS向北橋傳送。完全可以說,它就是資料的同步訊號。
在讀取時,DQS與資料訊號同時生成(也是在CK與CK#的交叉點)。而DDR記憶體中的CL也就是從CAS發出到DQS生成的間隔,DQS生成時,晶片內部的預取已經完畢了,由於預取的原因,實際的資料傳出可能會提前於DQS發生(資料提前於DQS傳出)。由於是並行傳輸,DDR記憶體對tAC也有一定的要求,對於DDR266,tAC的允許範圍是±0.75ns,對於DDR333,則是±0.7ns,有關它們的時序圖示見前文,其中CL裡包含了一段DQS 的匯入期。
DQS 在讀取時與資料同步傳輸,那麼接收時也是以DQS的上下沿為準嗎?不,如果以DQS的上下沿區分資料週期的危險很大。由於晶片有預取的操作,所以輸出時的同步很難控制,只能限制在一定的時間範圍內,資料在各I/O埠的出現時間可能有快有慢,會與DQS有一定的間隔,這也就是為什麼要有一個tAC規定的原因。而在接收方,一切必須保證同步接收,不能有tAC之類的偏差。這樣在寫入時,晶片不再自己生成DQS,而以傳送方傳來的DQS為基準,並相應延後一定的時間,在DQS的中部為資料週期的選取分割點(在讀取時分割點就是上下沿),從這裡分隔開兩個傳輸週期。這樣做的好處是,由於各資料訊號都會有一個邏輯電平保持週期,即使傳送時不同步,在DQS上下沿時都處於保持週期中,此時資料接收觸發的準確性無疑是最高的。

這裡寫圖片描述

在寫入時,以DQS的高/低電平期中部為資料週期分割點,而不是上/下沿,但資料的接收觸發仍為DQS的上/下沿

相關文章