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