一、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地址線位寬為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的上/下沿。
如何確定DDR3芯片的帶寬、位寬和最大IO時鐘頻率
這里以芯片Part Number :MT41J256M16RH-125:E為例,打開芯片的數據手冊,會找到如下所示的介紹:
IO時鐘頻率:
根據Part Number 中的“-125”我們就可以找到圖中的“1”,根據這里tCK = 1.25ns,就可以算出芯片支持的最大IO時鐘頻率:1/1.25ns = 800Mhz;此處的IO時鐘頻率也就是DDR3的頻率;
位寬:
根據Part Number 中的“256M16”我們可以找到圖中2所指出的地方,這里的16是代表芯片的數據位寬是16位(也就是16根數據線)。
注意:
當一個FPGA上掛多個DDR,如4片ddr3,位寬則會相應增大;16*4 = 64bit,再乘以DDR3的突發長度BL=8;那么程序設計里DDR3的讀寫位寬就變成了16*4*8=512bit;(這里留個印象,再后文IP例化及程序設計部分還會講到,到時候對應起來看更容易理解)
明明是512M的DDR,為什么又寫成256M呢?因為256M16是16根數據線16bit,對應過來就是2個byte;256M *16bit = 512MByte;一般大B 指的是Byte,小b指的是bit;
帶寬:
由于是DDR方式傳輸數據(上升和下降沿都傳輸),所以芯片的一根數據線上的傳輸速率 = 2*800Mhz = 1600MT/s。其實就是1600Mbit/s;
帶寬就是16根數據線同時傳輸的數據速率 = 1600Mbit/s x 16 = 25600Mbit/s = 3200Mbyte/s = 3.125GByte/s
、FPGA所支持的最大頻率
翻看k7數據手冊ds182可以看到:
從上圖中紅線標出的地方可以看出,此FPAG芯片的MIG支持最大PHY速率是800Mb/s(注意,這是數據傳輸速率)。因為是使用DDR模式傳輸數據,所以最大時鐘頻率= 800/2 = 400Mhz。(還記得剛剛DDR3 芯片支持的最大IO時鐘頻率嗎?800Mhz,在下面的MIG參數設置中,就會用到這兩個參數)。
時鐘結構
在說具體的時鐘參數設置之前,我們先來看一張圖 MIG 的 Clocking Architecture
根據本圖很明顯的告訴了我們,需要給MIG提供兩個時鐘,一個叫system clock(主時鐘),一個叫reference clock(參考時鐘)。
但是在MIG中,如何對這些時鐘參數進行設置(描述)呢?看好了,接下來開始畫重點了!!!!!
在MIG中,涉及到對時鐘參數進行設置(描述)的地方有四處,接下來我們一個一個的看:
第一處,如下圖所示
這里設置的參數就是 MIG 的PHY 接口對DDR3的時鐘,也就是DDR3芯片實際跑的IO時鐘頻率,它由system clock(主時鐘)倍頻而來,最大頻率不能超過DDR3 和MIG支持的最大頻率中的最小值,如:雖然我們的DDR3芯片最高支持800Mhz的IO時鐘,但是由于我們使用的FPGA芯片的MIG最高只支持400Mhz的時鐘,所以這里我們選擇400Mhz(當然也可以選擇比這個小)。下面有個4:1,說明MIG 輸出到app接口上的時鐘ui_clk 是 400M/4=100M ,即到時我們在寫RTL邏輯代碼時操作MIG核時,用的就是這個100M時鐘。
第二處、還是如圖所示
這里就是設置system clock(主時鐘)的輸入頻率,實際是多少就寫多少。
第三、四處,繼續如下圖所示
圖中的“3”是設置(描述)system clock (主時鐘)是差分輸入還是單端等其他形式的輸入,這里我們選擇差分輸入
同理,圖中的“4”是對reference clock(參考時鐘)進行描述。主意:如果system clock 頻率設置為200Mhz(看第二處),這里就可以直接選“Use System Clock”,否則就沒有“Use System Clock”這個選項,要是選其他選項,后面還需要對reference clock進行設置,如下圖所示
行業術語
核心頻率:核心頻率就是DDR物理層(PHY)IO時鐘頻率,對應到MIG就是第一個配置的“CLOCK PERIOD”,上文我們選擇的是800Mhz
工作頻率:核心頻率* 2 (上下沿)= 1600M核心頻率* 2 = 1600M
傳輸速率:核心頻率* 2 = 1600MT/s
帶寬:傳輸速率*位寬 = 1600M * 16 = 25600Mbit/s = 3200Mbyte/s = 3.125GByte/s
精彩推薦 至芯科技12年不忘初心、再度起航12月17日北京中心FPGA工程師就業班開課、線上線下多維教學、歡迎咨詢! FPGA 結構分析 -IO 資源 FPGA靜態時序分析模型——寄存器到寄存器掃碼加微信邀請您加入FPGA學習交流群
歡迎加入至芯科技FPGA微信學習交流群,這里有一群優秀的FPGA工程師、學生、老師、這里FPGA技術交流學習氛圍濃厚、相互分享、相互幫助、叫上小伙伴一起加入吧!
點個在看你最好看
原文標題:FPGA學習-DDR3
文章出處:【微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
-
FPGA
+關注
關注
1630文章
21796瀏覽量
605999
原文標題:FPGA學習-DDR3
文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設計論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論