XILINX 公司在最新的Spartan6中集成了MCB硬核,它可以支持到DDR3-800,而且對(duì)于大多數(shù)廠家的存儲(chǔ)芯片都支持(Micron、Elpida、Hynix.....)。對(duì)于工程來(lái)講,其MCB硬核優(yōu)秀的誤碼校驗(yàn)和偏移時(shí)鐘校驗(yàn),以及PLL_ADV工作時(shí)的穩(wěn)定、高精度都大大保證了研發(fā)產(chǎn)品的質(zhì)量。而對(duì)于用戶控制接口又是以通用FIFO的讀寫(xiě)方式,代替復(fù)雜的DDR/DDR2/DDR3讀寫(xiě)邏輯。以SRAM的地址映射方式代替復(fù)雜的行列地址選擇??梢?jiàn)spartan6—MCB硬核控制器的誕生是值得大家推崇的。一, 在工程中添加IP1、 打開(kāi)工程,添加新的源文件,![]() 2、 選擇版本,這里以3.6為例(盡量選擇最新版本),進(jìn)入Xilinx Memory Interface Generator界面,單擊Next,進(jìn)入下一步;3、 選擇輸出項(xiàng),輸入自定義模塊名; 單擊Next,注意:如果你是修改一個(gè)核而不是第一次生成核,會(huì)出現(xiàn)如下對(duì)話框,單擊Yes,這時(shí)會(huì)覆蓋掉一些文件,因此無(wú)論你在接下來(lái)的步驟中有沒(méi)有對(duì)核的選項(xiàng)進(jìn)行修改,最后必須點(diǎn)擊Generator; 4、 單擊Next,選擇Memory Type; 注意到圖中有個(gè)C1、C3,這是因?yàn)閄ilinx的MCB有部分是屬于硬核,引腳是固定的,分別存在于FPGA芯片的BANK1和BANK3,在代碼中將看到很多的信號(hào)名是以C1_XXX和C3_XXX開(kāi)頭的,這很容易區(qū)分是哪個(gè)DDR芯片對(duì)應(yīng)的信號(hào)名,注意與后面的端口(Port)混淆;5、 單擊Next,進(jìn)入DDR2芯片選項(xiàng)模塊,先選擇存儲(chǔ)器,再輸入時(shí)鐘; 這里的Memory Part 選擇的是自定義的芯片,單擊 進(jìn)入端口配置,(1)選擇配置模式,單向與雙向的意思是指端口是可讀、可寫(xiě),還是既可讀又可寫(xiě), 將端口配置成一個(gè)讀一個(gè)寫(xiě),其他不用; (2)選擇存儲(chǔ)器的地址映射方式,可根據(jù)自己程序設(shè)計(jì)方便選擇,這里默認(rèn); 9、 Next;接著10、進(jìn)入FPGA選項(xiàng),這里注意系統(tǒng)時(shí)鐘的方式,根據(jù)實(shí)際情況選擇單端還是差分,這里選擇單端。還有就是要注意下這里debug選項(xiàng),建議選擇”Disable”. 其他默認(rèn);11、Next,同上;12、Next;13、選擇 Next;14、Next; 其中RTL文件夾內(nèi)的文件是我們主要關(guān)注的。這里的DDR667(建立IP時(shí)取的名字)是頂層文件,另外兩個(gè)分別是“管理時(shí)鐘”和“管理端口”的描述文件。 打開(kāi)“管理時(shí)鐘”的infrastrcture.v,需要注意的幾點(diǎn)(1) 如果MCB的輸入時(shí)鐘是經(jīng)過(guò)IBFG處理的,那么這里的IBFG就需要注釋掉,IBFG是全局輸入時(shí)鐘的緩沖,一個(gè)工程中有一個(gè)即可。 (2)u_pll_adv模塊就是Xilinx的PLL核,并沒(méi)有什么特殊之處,而MCB只用了其中的4個(gè)時(shí)鐘輸出,其中一個(gè)還是提供給用戶邏輯使用,因此完全可以對(duì)該P(yáng)LL的3個(gè)時(shí)鐘輸出做自定義,這樣可以減少系統(tǒng)所用PLL個(gè)數(shù)。![]() 對(duì)于自定義的PLL輸出根據(jù)需要最好加上BUFG, 然后將這些時(shí)鐘添加到模塊輸出項(xiàng),經(jīng)頂層模塊輸出。(3) 對(duì)于BUFPLL_MCB的詳細(xì)解釋?zhuān)x者可參見(jiàn)ug382手冊(cè).輸出文件和對(duì)應(yīng)的關(guān)系圖如下: 打開(kāi)作為頂層文件的DDR667,可以看到在IP設(shè)置時(shí)所選擇的參數(shù)都在這里了,如果需要做改動(dòng),可以在這里的parameter下修改。這里的參數(shù)有最高的權(quán)限,會(huì)覆蓋所調(diào)用模塊的默認(rèn)值。 三, IP的使用(1)在par文件夾下面有系統(tǒng)默認(rèn)的UCF(約束文件),默認(rèn)情況下會(huì)使用該UCF文件。 筆者在使用中發(fā)現(xiàn)一個(gè)奇怪的問(wèn)題,就是在自己重新定義UCF,且確認(rèn)所有的管腳都映射正確后,在MAP階段一直報(bào)錯(cuò),主要是報(bào)DQS、UDQS、DQS_N、UDQS_N這四個(gè)pin腳的分布有問(wèn)題,嘗試了很多辦法都無(wú)效。![]() 最終的解決辦法是從工程中移除頂層的DDR2_test.XCO文件(備注:這里DDR2_test是筆者為IP所取的名字),手動(dòng)添加所有的RTL源文件,編譯后順利通過(guò)map,不知道是bug還是其他的什么原因。 (2) 由于spartan6系統(tǒng)是最新的FPGA,xilinx官方一直在更新ISE軟件,F(xiàn)PGA的內(nèi)核也會(huì)有所變動(dòng),在期間選型時(shí)需要留意DS162文件中不同器件所需要的軟件版本。 同時(shí),對(duì)于使用-2速度的朋友需要注意下在XCN10024中XILINX隊(duì)MCB的性能做了一些小小的修正,在內(nèi)核電壓較低(1.14~1.26)的情況下,速度由原來(lái)的667降低至625. (3)由于系統(tǒng)默認(rèn)是將整個(gè)DDR按8bit來(lái)重新對(duì)地址編碼,這樣對(duì)于X16、X8和X4就需要根據(jù)下圖經(jīng)行重新的映射,具體可以參看UG388 (4)在設(shè)置FIFO的位寬時(shí),需要注意幾個(gè)速度問(wèn)題。比如DDR3-800,如果器件是X8模式的,那么每個(gè)時(shí)鐘可以觸發(fā)16bit數(shù)據(jù)(DDR是雙沿觸發(fā)),假設(shè)FIFO是64bit,那么系統(tǒng)時(shí)鐘至少需要(16/64)*400=100MHZ才能跟上DDR的速度,同理如果是32bit的FIFO,那么至少需要200MHZ的系統(tǒng)時(shí)鐘,這個(gè)在系統(tǒng)規(guī)劃時(shí)需要注意。另外FIFO最多可以到64級(jí),每一級(jí)大小等于位寬。 (5)由于整個(gè)IP中定義的參數(shù)和系統(tǒng)調(diào)用模塊比較多,為了防止軟件將一些信號(hào)優(yōu)化掉,需要設(shè)置Hierarchy為soft (6)如果系統(tǒng)中不止一個(gè)DDR,可以參考XAPP496中相關(guān)設(shè)計(jì)思路。作者:夏日可樂(lè)87
|
|
|