一、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ì)算
假設(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ù)母拍?/span>
目前內(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ā)長度(Burst Lengths,簡(jiǎn)稱BL)。
在進(jìn)行突發(fā)傳輸時(shí),只要指定起始列地址與突發(fā)長度,內(nèi)存就會(huì)依次地自動(dòng)對(duì)后面相應(yīng)數(shù)量的存儲(chǔ)單元進(jìn)行讀/寫操作而不再需要控制器連續(xù)地提供列地址。這樣,除了第一筆數(shù)據(jù)的傳輸需要若干個(gè)周期(主要是之前的延遲,一般的是tRCD+CL)外,其后每個(gè)數(shù)據(jù)只需一個(gè)周期的即可獲得。
連續(xù)讀取模式:只要指定起始列地址與突發(fā)長度,后續(xù)的尋址與數(shù)據(jù)的讀取自動(dòng)進(jìn)行,而只要控制好兩段突發(fā)讀取命令的間隔周期(與BL相同)即可做到連續(xù)的突發(fā)傳輸。
在 DDR SDRAM 中,突發(fā)長度只有 2、4、8 三種選擇,沒有了隨機(jī)存取的操作(突發(fā)長度為 1)和全頁式突發(fā)。這是為什么呢?因?yàn)?L-Bank一次就存取兩倍于芯片 位寬的數(shù)據(jù),所以芯片至少也要進(jìn)行兩次傳輸才可以,否則內(nèi)部多出來的數(shù)據(jù)怎么處理?但是,突發(fā)長度的定義也與 SDRAM 的不一樣了,它不再指所連續(xù)尋址的存儲(chǔ)單元數(shù)量,而是指連續(xù)的傳輸周期數(shù),每次是一個(gè)芯片位寬的數(shù)據(jù)。
上面是別人的解釋,筆者結(jié)合自己的理解和代碼實(shí)現(xiàn)中再解釋一下:
突發(fā)傳輸是為了提高傳輸效率,這涉及到預(yù)取的概念;DDR3突發(fā)長度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的上/下沿。
如何確定DDR3芯片的帶寬、位寬和最大IO時(shí)鐘頻率
這里以芯片Part Number :MT41J256M16RH-125:E為例,打開芯片的數(shù)據(jù)手冊(cè),會(huì)找到如下所示的介紹:
IO時(shí)鐘頻率:
根據(jù)Part Number 中的“-125”我們就可以找到圖中的“1”,根據(jù)這里tCK = 1.25ns,就可以算出芯片支持的最大IO時(shí)鐘頻率:1/1.25ns = 800Mhz;此處的IO時(shí)鐘頻率也就是DDR3的頻率;
位寬:
根據(jù)Part Number 中的“256M16”我們可以找到圖中2所指出的地方,這里的16是代表芯片的數(shù)據(jù)位寬是16位(也就是16根數(shù)據(jù)線)。
注意:
當(dāng)一個(gè)FPGA上掛多個(gè)DDR,如4片ddr3,位寬則會(huì)相應(yīng)增大;16*4 = 64bit,再乘以DDR3的突發(fā)長度BL=8;那么程序設(shè)計(jì)里DDR3的讀寫位寬就變成了16*4*8=512bit;(這里留個(gè)印象,再后文IP例化及程序設(shè)計(jì)部分還會(huì)講到,到時(shí)候?qū)?yīng)起來看更容易理解)
明明是512M的DDR,為什么又寫成256M呢?因?yàn)?56M16是16根數(shù)據(jù)線16bit,對(duì)應(yīng)過來就是2個(gè)byte;256M *16bit = 512MByte;一般大B 指的是Byte,小b指的是bit;
帶寬:
由于是DDR方式傳輸數(shù)據(jù)(上升和下降沿都傳輸),所以芯片的一根數(shù)據(jù)線上的傳輸速率 = 2*800Mhz = 1600MT/s。其實(shí)就是1600Mbit/s;
帶寬就是16根數(shù)據(jù)線同時(shí)傳輸?shù)臄?shù)據(jù)速率 = 1600Mbit/s x 16 = 25600Mbit/s = 3200Mbyte/s = 3.125GByte/s
、FPGA所支持的最大頻率
翻看k7數(shù)據(jù)手冊(cè)ds182可以看到:
從上圖中紅線標(biāo)出的地方可以看出,此FPAG芯片的MIG支持最大PHY速率是800Mb/s(注意,這是數(shù)據(jù)傳輸速率)。因?yàn)槭鞘褂肈DR模式傳輸數(shù)據(jù),所以最大時(shí)鐘頻率= 800/2 = 400Mhz。(還記得剛剛DDR3 芯片支持的最大IO時(shí)鐘頻率嗎?800Mhz,在下面的MIG參數(shù)設(shè)置中,就會(huì)用到這兩個(gè)參數(shù))。
時(shí)鐘結(jié)構(gòu)
在說具體的時(shí)鐘參數(shù)設(shè)置之前,我們先來看一張圖 MIG 的 Clocking Architecture
根據(jù)本圖很明顯的告訴了我們,需要給MIG提供兩個(gè)時(shí)鐘,一個(gè)叫system clock(主時(shí)鐘),一個(gè)叫reference clock(參考時(shí)鐘)。
但是在MIG中,如何對(duì)這些時(shí)鐘參數(shù)進(jìn)行設(shè)置(描述)呢?看好了,接下來開始畫重點(diǎn)了!!!!!
在MIG中,涉及到對(duì)時(shí)鐘參數(shù)進(jìn)行設(shè)置(描述)的地方有四處,接下來我們一個(gè)一個(gè)的看:
第一處,如下圖所示
這里設(shè)置的參數(shù)就是 MIG 的PHY 接口對(duì)DDR3的時(shí)鐘,也就是DDR3芯片實(shí)際跑的IO時(shí)鐘頻率,它由system clock(主時(shí)鐘)倍頻而來,最大頻率不能超過DDR3 和MIG支持的最大頻率中的最小值,如:雖然我們的DDR3芯片最高支持800Mhz的IO時(shí)鐘,但是由于我們使用的FPGA芯片的MIG最高只支持400Mhz的時(shí)鐘,所以這里我們選擇400Mhz(當(dāng)然也可以選擇比這個(gè)小)。下面有個(gè)4:1,說明MIG 輸出到app接口上的時(shí)鐘ui_clk 是 400M/4=100M ,即到時(shí)我們?cè)趯慠TL邏輯代碼時(shí)操作MIG核時(shí),用的就是這個(gè)100M時(shí)鐘。
第二處、還是如圖所示
這里就是設(shè)置system clock(主時(shí)鐘)的輸入頻率,實(shí)際是多少就寫多少。
第三、四處,繼續(xù)如下圖所示
圖中的“3”是設(shè)置(描述)system clock (主時(shí)鐘)是差分輸入還是單端等其他形式的輸入,這里我們選擇差分輸入
同理,圖中的“4”是對(duì)reference clock(參考時(shí)鐘)進(jìn)行描述。主意:如果system clock 頻率設(shè)置為200Mhz(看第二處),這里就可以直接選“Use System Clock”,否則就沒有“Use System Clock”這個(gè)選項(xiàng),要是選其他選項(xiàng),后面還需要對(duì)reference clock進(jìn)行設(shè)置,如下圖所示
行業(yè)術(shù)語
核心頻率:核心頻率就是DDR物理層(PHY)IO時(shí)鐘頻率,對(duì)應(yīng)到MIG就是第一個(gè)配置的“CLOCK PERIOD”,上文我們選擇的是800Mhz
工作頻率:核心頻率* 2 (上下沿)= 1600M核心頻率* 2 = 1600M
傳輸速率:核心頻率* 2 = 1600MT/s
帶寬:傳輸速率*位寬 = 1600M * 16 = 25600Mbit/s = 3200Mbyte/s = 3.125GByte/s
精彩推薦 至芯科技12年不忘初心、再度起航12月17日北京中心FPGA工程師就業(yè)班開課、線上線下多維教學(xué)、歡迎咨詢! FPGA 結(jié)構(gòu)分析 -IO 資源 FPGA靜態(tài)時(shí)序分析模型——寄存器到寄存器掃碼加微信邀請(qǐng)您加入FPGA學(xué)習(xí)交流群
歡迎加入至芯科技FPGA微信學(xué)習(xí)交流群,這里有一群優(yōu)秀的FPGA工程師、學(xué)生、老師、這里FPGA技術(shù)交流學(xué)習(xí)氛圍濃厚、相互分享、相互幫助、叫上小伙伴一起加入吧!
點(diǎn)個(gè)在看你最好看
原文標(biāo)題:FPGA學(xué)習(xí)-DDR3
文章出處:【微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
FPGA
+關(guān)注
關(guān)注
1629文章
21736瀏覽量
603387
原文標(biāo)題:FPGA學(xué)習(xí)-DDR3
文章出處:【微信號(hào):gh_9d70b445f494,微信公眾號(hào):FPGA設(shè)計(jì)論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論