[轉]DDR3基礎知識介紹


本文轉自:(4條消息) xilinx ddr3 MIG ip核使用詳解_admiraion123的博客-CSDN博客

 

1,DDR3基本內容介紹
1.1,DDR3簡介
DDR3全稱double-data-rate 3 synchronous dynamic RAM,即第三代雙倍速率同步動態隨機存儲器。所謂同步,是指DDR3數據的讀取寫入是按時鍾同步的;所謂動態,是指DDR3中的數據掉電無法保存,且需要周期性的刷新,才能保持數據;所謂隨機存取,即可以隨機操作任一地址的數據;所謂double-data-rate,即時鍾的上升沿和下降沿都發生數據傳輸。

DDR3讀取速度是SDRAM的8倍,為什么呢?這里不是太懂,也一直沒懂,因為感覺網上的資料都有問題,官方的DDR3手冊也沒有介紹這點。不過官方手冊講到DDR3采用8n prefetch技術,數據在存儲矩陣和IO口之間有一個類似於FIFO的緩存結構。以16bit位寬的ddr3來說,存儲矩陣與這個fifo的接口就為8*16bit = 124bit。那么問題來了,要實現最終的8倍傳輸,由於上下沿都采樣,時鍾可以擴展為原來的2倍;那么剩下的4倍就需要IO口頻率來提高了;那么對於存儲矩陣與fifo的接口的時鍾是多少呢?這就不知道了,按照網上說的核心頻率(為IO頻率的1/4)的說法,那就需要數據線128根,這可能嗎?不過這會不會也是單片ddr3位寬不能太高的原因?問題先留在這里,以后懂了在來解答。

以micron的MT41K256M16TW-107為例,MT41K為型號,256M16表示大小為256M*16 = 4Gb,TW為96pin BGA封裝,-107為速度等級(時鍾1.07ns,933Mhz,速度1866MT/s),平常說的DDR3 1333也就是指1s內傳輸1333次數據。該DDR3是8Bank配置,即BA[2:0];數據位寬配置為16bit;行地址A[14:0],列地址A[9:0],那么算下來正好4Gb。不過需要注意,由於8n prefetch,列地址A[2:0]實際上並不使用,因為存儲矩陣中一個單元(CELL)為128bit,即一個Bank內是按32768*128*128划分的,如下圖所示。

 

 

 

 

順便講一下邏輯Bank和物理Bank的區別,邏輯Bank即一片DDR3顆粒的Bank;物理Bank是在存儲系統中才有的概念,計算機CPU為64bit,故向存儲設備取數據也為64bit,那么就需要4片DDR3顆粒並聯,那么總共的容量就位4Gb;那么問題來了,如果需要32Gb的容量呢?那么就需要32片DDR3顆粒,該DDR3最小位寬可配置為4bit,那么按照直接並聯的方式就變成128bit位寬了,這時候就需要做成2個物理Bank。

DDR3的數據寫入與讀取都是按burst方式進行的,BC4一次burst進行4長度數據位寬傳輸,BL8一次burst進行8長度數據位寬傳輸,on-the-fly由用戶控制8還是4。Burst模式有兩種,sequential和interleaved,具體如圖所示。

 

 

 

 DDR3的運行流程大體為:上電復位;然后進入初始化流程,進行write leveling、ZQ校准后進入空閑狀態,此后用戶可對其進行讀寫操作;we#,ras#,cas#為控制信號;操作時,先激活某一bank某一行,然后再給列地址,寫完后換另一行需要進行precharge操作;為了保持數據,DDR3需要refresh操作,一般規定行刷新周期為64ms,這里的行是針對所有bank的同一行,與precharge需要區分。具體如下圖所示。

 

 

 

 

1.2,DDR3中一些關鍵信號及時間參數
1.2.1 關鍵信號

    a,RAS#,行地址選通信號。

    b,CAS#,列地址選通信號。

    c,WE#,讀寫信號。

   d,DQS差分信號,數據選通信號,與讀數據邊沿對齊,與寫數據中心對齊。

   e,CK差分信號,ddr3輸入時鍾,所有的控制、地址信號都以CK交叉點為采樣點,DQS信號也是基於此信號得到。

2.2 時間參數

    a,tRCD,行選通指令到列選通指令的延遲,以CK為計量單位,指行激活指令到讀寫指令的最小間隔。

    b,CL,列選通指令潛伏期延遲,以CK為計量單位,指讀指令到數據讀出的最小間隔。

    c,tRP,行預充電時間,以CK為計量單位,指預充電指令到行激活指令的延遲。

1.3,DDR3中常用指令
       1. 3.1  precharge

            預充電指令,ddr3換行操作時,需要先執行預充電指令,關閉當前工作行,然后再進行激活指令。地址線中的A10為1,則對所有bank進行預充電;如果A10位0,則選擇ba[2:0]對應的bank進行預充電。

        1.3.2 refresh

            刷新指令,ddr3需要周期性刷新來維持存儲單元中的數據,刷新指令針對所有bank,刷新中的行指所有bank中地址相同的行。具體如下圖。

       1.3.3 active

            激活指令,用於激活某一bank的某一行。

      1.3.4 read/write

            讀寫指令,用於對某一起始地址進行操作。

      1. 3.5 指令表

            ddr3的指令表如下圖所示。主要由RAS#、CAS#、WE#控制。比如刷新就是001,寫就是100,讀就是101。表中,V表示高電平或低電平,需要是一個確定的電平;CA表示列地址;H表示高電平;L表示低電平;BA表示bank地址;RFU我也不知道是什么意思。

 

 

2,DDR3仿真
2.1,MIG核介紹
           xilinx的ddr3控制IP核叫memory interface generator,下面介紹一下該IP核中的一些設置。MIG核的整體框圖如下圖所示,分為用戶接口模塊,存儲控制模塊、物理層模塊,存儲控制模塊和phy模塊完成ddr3相關時序控制,我們關注用戶接口即可。用戶接口大體分為指令路徑和數據路徑,都是基於握手協議的。如指令中必須app_en和app_rdy同時為高,app_cmd才被有效接收;又例如寫數據通道中app_wdf_wren和app_wdf_rdy同時為高,app_wdf_data才會寫入fifo。

           MIG核配置需要注意的幾點:

           a,時鍾頻率,需要配置phy接口時鍾,也就是ddr3的ck信號,如對於ddr3 1333,我們就需要配置為667Mhz,當然低於這個也是可以的(xilinx 7系列芯片ddr引腳支持的最大速率可查看ds181);還需要配置用戶時鍾,也就是fpga用戶側時鍾,該時鍾可按2:1和4:1配置,如果前面配置的phy時鍾為667Mhz,那么2:1配置就為333Mhz,4:1配置就為167Mhz;還需要配置一個系統時鍾,這個時鍾主要為MIG各個時鍾提供源,通過倍頻得到用戶時鍾和phy時鍾;最后還有一個參考時鍾,該時鍾用於Idelayctrl模塊,控制fpga dq等引腳的延遲,一般為200Mhz。

          b,系統時鍾引腳,當使用內部mmcm產生時鍾時,需設置no buffer;當使用引腳引入時鍾時,那么外部差分時鍾需要IBUFDS或者IBUG接入mig系統時鍾引腳。同時,系統時鍾所在的CC(clock capable)引腳必須和memory接口在同一column,且推薦放在和控制引腳一個bank,7系列fpga具體查詢ug475 中的die level bank numbering。

          c,phy時鍾引腳,推薦放在一個字節組的dqs引腳。

          d,當DDR3速率低於800Mhz時,可以設置internal Vref,釋放Vref引腳作為普通io口使用。

          e,其余管腳分配,7系列fpga需要查看UG475來看哪些bank可以用作memory接口,一般一個bank放數據組(對於32位ddr3,有4個字節組,一個字節組為8+2+1),一個bank放地址和控制引腳。需要注意的一點是有的bank雖然帶有memory接口屬性,但是不要使用,例如bank14,因為ddr3電平為1.5v或者1.35v,而bank14又是系統bank,flash引腳在這一bank,一般為3.3v,就沖突了。

 

 

 

2,MIG用戶接口
          下圖為一個寫時序圖,MIG核規定,寫數據可以先與寫指令,也可以和寫指令同時發出,也可以在寫指令之后,但是最多延遲2個周期,同時發出了寫指令就一定要有寫數據。寫流程需要注意兩點:

           a,以32位ddr3為例,對於BL8模式,如果設置時鍾比率為2:1,那么用戶數據app_wdf_data位寬為128,那么一次burst需要兩個app_wdf_data,那么app_wdf_end就應該在第二個app_wdf_data拉高;如果設置比率為4:1,那么用戶數據app_wdf_data位寬為256,那么一次burst就需要一個app_wdf_data,同時app_wdf_end在每一個app_wdf_data拉高。

           b,app_addr在BL8模式中按8增加。

           c,內存數據的寫入都是按intel模式,即小端模式,低地址放低字節,高地址放高字節,比如一個64‘h0001_0002_0003_0004’,那么寫入dram的數據就為04 00 03 00 02 00 01 00。

 

         下圖為讀時序,沒什么好說的。

 

 

 

2.2 仿真結果
        沒啥好看的,前面說的差不多了。

3,實際應用
        實際應用中,視頻處理器就會用ddr3來作為視頻幀緩存介質。

        視頻處理器一般的結構為:1,視頻源接口(hdmi、dvi、dp、sdi等)經過視頻解碼芯片(sil9233、ep91a2e等),信號由模擬轉為數字,供fpga使用(v_clk、vsync、hsync、de、dq)。2,fpga根據場同步信號vsync做幀同步,根據數據有效信號de或者行同步信號hsync做行同步。對於8位rgb圖像,圖像信號dq為24位。3,按流水線進行圖像處理的相關操作(色域校正、色溫校正、gama等),然后存入ddr3。4,網口根據面積區域參數,從ddr3中讀出相應的數據並發出。

        這其中有一些關鍵點:

       1,時鍾域的轉換,最開始數據是在解碼芯片出來的像素時鍾域,一般做處理時需要轉換到系統時鍾域,存儲時又需要轉換到ddr3時鍾域,最后網口發送又需要轉換到網口時鍾域,如果用到光纖,那么會用到serdes ip,那么這里還有一個網口時鍾到serdes tx時鍾的轉換 ,我們使用serdes時,一般接收、發送都采用內部時鍾,最終收數據或者發數據都采用serdes ip發出來的時鍾 。功能實現當然是通過異步fifo實現的。

       2,數據處理,這里主要包含兩個部分:一是數據位寬的處理,一個像素點是24bit(按8bit圖像計算),而最終存儲的ddr3用戶接口為256bit(按4:1時鍾,32位位寬),那么就有一個24bit到256bit的轉換。 二是圖像處理,即將像素點並行處理,做乘法運算,具體一個處理幾個點,根據速度定,點數越多,需要的並行模塊越多,消耗的資源越多。

      實際應用中,我是先將24bit數據轉換為48bit數據,圖像一行一行來,可能是奇數個點,也可能是偶數個點,如果一行圖像為奇數個點,那么最后一個48bit的高24bit就是無效數據,為了后面處理方便,我將每個點加上兩個標志位,一個數據有效信號de,一個最后一個像素點信號de_last,每個像素點變為26bit,然后通過fifo進行跨時鍾域處理(這里fifo非空就讀)。在系統時鍾域中,我們做圖像校正處理,一次處理兩個點,那么就需要並行6個乘法器;如果還需要做其他處理,就繼續以流水線的方式處理,注意最后要把兩個標志位時序對齊。接下來就是48bit到256bit的轉化,我先找出兩者的最小公倍數即768,那么48bit就需要16個單元,設計時按0~15計數,向256x2的兩個ram中寫數據(這里有pingpong操作的思想),在計數為5、10、15以及最后de_last信號處,置高fifo寫使能信號即可,同樣,由於圖像點不一定能組成256的倍數,因此最后還需要強制寫一次。至於什么時候讀,看自己考慮,可以等fifo計數為128時開始讀fifo,正好寫一行ddr3,但是需要注意最后要強制讀一次。最后就是從ddr3讀數據通過網口發出去,一般情況下各個網口通過輪詢的方式將上位機設置的面積發送出去,這里生每個網口發送模塊需要用到fifo,而且此fifo的讀時機和深度選擇是需要慎重考慮的,既要保證數據無溢出,又要保證fifo不被讀空。同時,上位機的面積參數轉換到ddr3的地址,也是需要計算的。

    總的來說,ddr3的使用難點並不在於本身的控制,而在於帶寬的分配。一般對ddr3的操作都采用pingpong操作,提高速度。另外,數據流的處理應該慎重考慮什么地方分開,什么地方聚合;數據怎么寫入,就應該怎么讀出,提前設計好ddr3的存儲模型。

4,后話
    由於sdram的控制和ddr3差不多,這里也提幾句吧。sdram不能像ddr3那樣緩存多個指令,因此控制起來較為簡單,可以自己寫驅動,具體思路就是先初始化,然后等待相應的操作跳轉到對應狀態機,修改we、ras、cas、地址、數據等信號,沒有操作就跳轉到刷新。實際應用中,我的sdram操作主要包含4個狀態兩兩互為pingpong,一是圖像的存儲,一行一行的存儲,數據沒有緊密排列,而是一個點24bit占一個存儲單元32bit;二是從一中讀取存儲的圖像,做圖像處理,如gamma校正、亮度色度校正、修縫、切片交織等,這兩個互為pingpong。三是將處理的數據重新寫入sdram,四是從三寫入的數據中讀出供顯示驅動使用,這兩個互為pingpong。當然還有一些其他占用sdram帶寬的地方,比如上電校正系數的加載、快速升級等。
————————————————
版權聲明:本文為CSDN博主「admiraion123」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/admiraion123/article/details/107891017


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM