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

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

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

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

    BANK

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

      DDR3 容量計算

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

        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的上/下沿。

                                        </div>
        
        發表評論
        所有評論
        還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
        相關文章