1. 程式人生 > >Quartusii 中ddr2 IP核例化 除錯

Quartusii 中ddr2 IP核例化 除錯

quartsuii 版本:15.0
fpga器件:Cyclone iv
ddr2器件:MT47H64M16HR-3E

本文介紹Cyclone iv晶片外接2片位寬為16,容量1G的ddr2 ,利用例化ddr2 ip核進行除錯的過程。
2片位寬為16的ddr2並聯使用,相當於1片位寬為32位,容量為2G的ddr2。
一、新建工程
新建一個名為ddr2_test的工程。下圖是頂層檔案的埠,mem開始的都是與外部ddr2相連的管腳,還有一個CLK25M的系統輸入時鐘。同時新建一個reset_manage檔案用來產生復位訊號。
這裡寫圖片描述
二、新增ddr2 ip核
1.左鍵Tools->左鍵Megawizard Plug-in Manager
這裡寫圖片描述


2. 選擇第一個 新建IP核 ,然後點Next
這裡寫圖片描述
3 .選擇ddr2 ip核
在紅框1處選擇 DDR2 SDRAM Controller
在紅框2處設定你要儲存IP核的路徑
在紅框3處點選Next 進入IP核 引數設定介面
這裡寫圖片描述
下圖就是ddr2 IP核的引數設定視窗。
這裡寫圖片描述
4. Parmameter Settings
4.1Memmory Settings
4.1.1General Settings
(1)Device family:器件系列 我用的cyclone iv 所以此處選擇 Cyclone IV E
(2) Speed grade:FPGA速度等級 根據所選fpga晶片選擇,此外我用的C8等級,所以 選8
(3)PLL reference clock frequency:PLL鎖相環 輸入參考時鐘,我給ddr2 ip核輸入的時鐘是25Mhz
(4)Memory clock frequency:ddr2器件的時鐘頻率,即你想讓ddr以多大的時鐘執行,此處我設定150M
4.1.2Show in”Memory Preset” list
下圖的三個設定,可以不用設定,設定這三個引數 可以幫你進行ddr2型號的篩選。
這裡寫圖片描述

(1)Memory Vendor:儲存器廠家,我用的是micron鎂光的。
(2)Memory format:儲存器型別,該工程用的是分離器件,選Discrete Device
Discrete Device:分離器件,即單片的memory
DIMM:Dual-Inline-Memory-Modules,即雙列直插式儲存模組。
Unbuffered DIMM: 不帶快取的記憶體,也就是說在記憶體條PCB上沒有快取(buffer)或暫存器(register)的記憶體條。這類記憶體條主要定位於桌面PC市場,是我們常見的低價記憶體模組。它的主要工作原理是所有的訊號都是從記憶體控制器直通到DRAM晶片顆粒上,訊號傳輸延遲小效能較高。但也正是這個原因Unbuffered DIMM並不如帶暫存器的記憶體模組工作穩定,因而Unbuffered DIMM一般不在伺服器上應用,可以應用在要求不高的桌面PC上。
Registered DIMM: 最常見的記憶體模組型別。RDIMM使用暫存器,從電力上將記憶體模組從剩餘主機板中隔離出來。積極的一方面是,只需更少的電力負載支援,系統能夠填充更多RDIMM,支撐記憶體容量。不好的是緩衝元件增加了對記憶體轉換的延遲,稍微降低了效能並增加了能耗需求。
Maximum memory frequency:儲存器最大工作頻率,根據ddr2器件的datasheet選定,此處沒設定
4.1.3 Selected memory preset
選擇儲存器引數預設,即根據你選定的ddr2來設定其對應的引數。
首先你可以從Memory Presets 下拉列表框中查詢是否有你使用的ddr器件型號,要是有直接單擊選中,其對應型號就會出現在Selected memory preset 後面的框中,此時就不用再去修改ddr2的引數了。直接Next進入 PHY Settings項;要是沒有找到你使用的ddr器件型號則找一個相近的通過 Modify parameters 去修改對應的引數。該工程中由於沒有找到我使用的MT47H64M16HR器件型號,所以我首先選擇相近的型號Micron MT47H64M8CB-3,接著點紅框2處的Modify parameters..按鈕去修改引數。
這裡寫圖片描述

左鍵Modify parameters..後會出現下面紅色框中的視窗
這裡寫圖片描述
這裡面有很多的引數,我簡單介紹下每個引數的含義吧
(1)Output clock pairs from FPGA:從fpga輸出給外部儲存器的差分時鐘對數,工程中為1對差分對時鐘,選1,被兩片ddr2公用。
(2)Total Memory chip selects:外接儲存器的片選訊號個數,此處為1 ,被兩片ddr2公用。
(3)Total Memory interface DQ width:外接儲存器的DQ位寬,即資料線位寬。工程中用了2片ddr2器件,所以總的DQ是16*2=32bits
(4)Memory burst length:儲存器 資料突發長度,即memory一次可以讀寫的資料(DQ)個數。此處選擇4
(5)Memory burst ordering:儲存器突發讀寫資料的順序,選Sequential 順序讀寫。
Interleaved:交叉突發讀寫順序,具體方式可以檢視ddr2的datasheet裡有講,不常用。
(6)Enable the DLL in the memory devices :是否使能外部儲存器裡的延遲鎖相環DLL。預設,選Yes
(7)Memory drive strength setting:驅動外部儲存器強度選擇,預設,選Normal
(8)ODT setting:片內終結器,即設定儲存器裡的ODT阻值大小,下面的連結是介紹ODT的作用的,此處選擇50歐 預設。通過mmem_odt訊號線控制odt enable/disenable.
http://www.baike.com/wiki/ODT
(9)Memory CAS latency setting:儲存器CAS 延遲設定,ddr2器件手冊裡給的是4,所示設定為4。
(10)Memory additive CAS latency setting:儲存器 附加的CAS 延遲設定,選擇預設 disabled
(11)Memory Vendor:儲存器廠家 選Micron
(12)Memory format:儲存器型別,該工程用的是分離器件,選Discrete Device
(13)Maximum memory frequency :儲存器最大工作頻率,檢視ddr2datasheet得到 為333.333Mhz
(14)Column address width:儲存器列地址寬度 檢視ddr2器件datasheet 為10。
(15)Row address width:儲存器行地址寬度 檢視ddr2 器件datasheet 為13。
(16)Bank address width:bank 地址寬度,檢視ddr2 器件datasheet 為3。
(17)Chip selects per DIMM:DIMM 片選訊號位寬 預設為1。
(18) DQ bits per DQS bit:指每一組DQS對應的DQ資料位寬。設為8,即一個DQS 資料選通訊號對應8位寬的DQ 資料訊號。
(19)Precharge address bit:預充電 地址位寬,在對某一bank 或所有bank進行precharge時,需要選擇預充電的地址,當A10位1時,表示對所有bank進行預充電,當A10位0時,對某一bank進行預充電,bank由bank0/1訊號線確定,而具體地址就由A0-A9位row地址來選擇,所有,此處設為10。
(20)Drive DM pins from FPGA:是否使能從FPGA輸出資料掩碼訊號(DM),選擇Yes
(21)tINT:從該引數開始到最後一項 都是設定ddr2讀寫時的時序引數的,具體值可以從ddr2 器件的datasheet 裡找到。具體就不再解釋了。
下圖就是設定好的引數了。點選OK退出該設定視窗。
這裡寫圖片描述
這裡寫圖片描述
4.2 PHY Settings
該頁 保持預設即可,不需要修改。直接點選Next進入下一項設定
這裡寫圖片描述
4.3 Board Settings
板級引數設定,一般不需要修改。這裡保持預設值,點選Next進入下一項設定。
這裡寫圖片描述
4.4 Controller Settings
控制器設定,即例化的ddr2 ip裡的控制器相關引數設定。
這裡寫圖片描述
(1)Controller Architecture:控制器結構選擇,選擇 High Performance Controller II,這個比後面的更優化一些,altera 建議能使用 High Performance Controller II就最好使用該結構。High Performance Controller是比較早的控制器了,針對一些老版本使用。
(2)Local-to-Memory Address Mapping:本地到儲存器側 地址對映關係選擇。設為 CHIP-BANK-ROW-COL。本工程使用的memory晶片個數是1個(雖然是外接了2片ddr2 ,但是都是接在同一個片選訊號上的,2片16位寬的ddr2相當於一片32位寬的ddr2使用 ),所以CHIP的地址沒有用到,BANK是3位寬,memory的行ROW是13位寬,列寬Column是10位。這樣在儲存器側的地址位寬是3+13+10,資料位寬是32位,而在控制器側資料位寬是64位,所以地址位寬就為25位。對映關係為[24:22]對應bank地址,[21:9]對於ROW行地址,[8:0]對應Column列地址。這樣 ,比如控制器側寫一個64位的資料,地址是25’d0,則在儲存器側,由於一個位置只能儲存32位寬資料,則需要把這個64位的資料分別存放在26’d0 和26’d1兩個位置。
(3)Local Maximum Burst Count:本地控制器最大讀寫突發長度設定,設為64,這樣一次就能最多連續讀寫64個 64位寬的資料了。
5.EDA
紅框1處:是否生成模擬模型。如果對ddr2 ip核進行模擬,需勾選此項用於生成ddr模擬模型。
紅框1處:是否生成網表。用於第三方EDA綜合工具使用。
預設兩處都不用勾選,點選Next
這裡寫圖片描述
6.Summary
選擇需要生成的檔案,保持預設選擇就行。點選Finish 完成ddr2 IP核的例化。
這裡寫圖片描述
三、例化ddr2 IP核
新建ddr2_rcvsend檔案,用於進行ddr2的讀寫操作,同時在該檔案中例化ddr2 ip核,例化出的模組如下圖所示。在控制器側讀寫資料的時鐘就是phy_clk輸出的150Mhz時鐘訊號。
這裡寫圖片描述
四、設定memory管腳約束
將所有檔案都編寫好後,進行綜合,綜合後設置memory 管腳電平。有兩種方法:
(1)開啟Pin planner,手動設定與memory 相連管腳的電平。

(2)左鍵Tools ->左鍵Tcl scripts 彈出下面的視窗
左鍵選擇 紅框1 ,然後點選紅框2處的Run,執行ddr的管腳分配指令碼,自動完成與memory相連管腳的電平設定。
這裡寫圖片描述
下圖是設定好的ddr2 管腳
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
五、新增ddr2時序約束
例化ddr2 IP核成功後,會生成ddr2 ip核的時序約束,需要把其新增到工程中,
左鍵Assingments->左鍵Settings->左鍵TimeQuest Timing Analyzer,進入下面的介面
這裡寫圖片描述
點選… 新增_phy_ddr_timing.sdc 約束檔案,找到後點擊add按鈕 進行新增。
這裡寫圖片描述
新增後,點選Apply,OK按鈕退出。
這裡寫圖片描述
六、全編譯及波形抓取
全編譯通過後,下載到FPGA板子上,用signaltapII 抓取讀寫時序並顯示讀寫資料速率(單位bps)。
讀寫速率大概在3.8Gbps
這裡是連續寫24個64位寬資料,然後讀出,比較第一個64位是否相同。不相同則false_cnt加1 ,表示讀寫資料不一樣,有錯誤。
這裡寫圖片描述
注意 看下圖的兩個圈起來的地方,寫入資料時,當local_ready為高時,表示可以進行讀寫操作,此時在下一個時鐘週期上升沿傳送寫請求,傳送寫請求時,local_ready拉低,所以,寫請求必須保持到local_ready為高時,才能在下一個週期去拉低。讀操作時也一樣。
這裡寫圖片描述

下面兩個截圖是我在ddr2 HPC User Guide 上找到的寫,讀請求和local_ready間的關係。概括就兩個意思
(1)local_ready拉高,表示控制器接受了使用者傳送的讀寫請求,這樣可以在下個時鐘週期開始又一次的讀寫請求;
(2)當傳送了讀寫請求後,此時local_ready變為低,則寫請求,地址訊號,burstbegin等必須維持到local_ready為高,後才能拉低,否則寫無效。
這裡寫圖片描述
這裡寫圖片描述

下面兩個圖是ddr2 HPC User Guide上給出的ddr2 full-rate 寫和讀操作的時序圖,使用時,主要是看local interface 部分的訊號波形。
這裡寫圖片描述
這裡寫圖片描述