使用SDRAM控制器IP核對(duì)SDRAM進(jìn)行讀寫操作
SDRAM是一種RAM類型的易失性存儲(chǔ)器件,因其具有較大的容量和相對(duì)較低的價(jià)格在嵌入式系統(tǒng)中應(yīng)用廣泛。然而應(yīng)用SDRAM需要實(shí)現(xiàn)刷新操作、行列管理、不同延遲和命令序列等邏輯,控制復(fù)雜,而Qsys提供的SDRAM控制器IP核接口極大的方便了SDRAM的使用,本文我們實(shí)現(xiàn)使用SDRAM控制器IP核對(duì)SDRAM進(jìn)行讀寫操作。
理論部分簡(jiǎn)介
SDRAM控制器IP核能夠處理所有的SDRAM協(xié)議要求,包括上電初始化、地址復(fù)用、刷新、讀寫時(shí)序等,極大的方便了SDRAM的使用。下面我們先來看看SDRAM控制器IP核和SDRAM芯片的連接框圖,如下所示:
Avalon從機(jī)接口用來連接我們的CPU,Avalon從機(jī)接口是SDRAM控制器IP核中僅為用戶可見的部分。從控制器端口提供一個(gè)如SDRAM芯片一樣大的平滑、線性存儲(chǔ)器空間。當(dāng)訪問從控制器端口時(shí),SDRAM協(xié)議的細(xì)節(jié)完全透明。Avalon接口作為一個(gè)簡(jiǎn)單的存儲(chǔ)器接口操作,沒有存儲(chǔ)器映射的配置寄存器。這里我們需要注意的是:SDRAM芯片必須和Avalone接口一樣以相同的時(shí)鐘來驅(qū)動(dòng)。
我們可以看到圖中的片內(nèi)鎖相環(huán)(PLL),它就是用來調(diào)整SDRAM控制器與SDRAM芯片之間的時(shí)鐘相位差。在較低的時(shí)鐘頻率下,可能不需要PLL。在較高的時(shí)鐘頻率下,當(dāng)信號(hào)在引腳上有效時(shí),需要PLL來調(diào)整SDRAM時(shí)鐘。PLL并沒有包括在SDRAM控制器內(nèi)。如果需要PLL,設(shè)計(jì)者必須在生成Qsys系統(tǒng)模塊以外手動(dòng)添加PLL。AlteraFPGA和SDRAM芯片的不同組合將要求不同PLL的設(shè)置。
還有一點(diǎn)我們需要說明的是fmax性能取決于整個(gè)硬件設(shè)計(jì)。Qsys系統(tǒng)模塊的主控制器時(shí)鐘驅(qū)動(dòng)SDRAM控制器和SDRAM芯片。因此,整個(gè)系統(tǒng)模塊的性能決定SDRAM控制器的性能。例如,為了實(shí)現(xiàn)100MHz的fmax性能,系統(tǒng)模塊必須設(shè)計(jì)為100MHz時(shí)鐘率,且QuartusII軟件的時(shí)序分析必須檢驗(yàn)硬件設(shè)計(jì)是否能夠進(jìn)行100MHz的操作。說完了SDRAM的綜述之后下面我們就總結(jié)給出SDRAM控制器IP核的功能特性:
(1)SDRAM控制器IP核具有不同數(shù)據(jù)寬度(8、16、32或64位)、不同內(nèi)存容量和多片選擇等設(shè)置。
(2)SDRAM控制器IP核可以全面支持符合PC100標(biāo)準(zhǔn)的SDRAM芯片。(PC100,表明時(shí)鐘信號(hào)為100,數(shù)據(jù)讀寫速率也為100)
(3)SDRAM控制器IP核可選擇與其他的片外Avalon三態(tài)器件共用地址和數(shù)據(jù)總線,該特性在I/O引腳資源緊張的系統(tǒng)中很有用。我們可以在Qsys中使用SDRAMIP核的配置向?qū)碇付ㄓ布匦院头抡嫣匦?。SDRAMIP核配置向?qū)в袃蓚€(gè)選項(xiàng)卡:MemoryProfile和Timing,如下圖所示。
為了使用方便,Presets列表提供幾個(gè)預(yù)定義的SDRAM配置。如果實(shí)際使用的SDRAM芯片型號(hào)與列表中的一致,可直接選用而不用設(shè)置其他選項(xiàng)。選擇不同的預(yù)配置,SDRAMIP核將自動(dòng)改變MemoryProfile和Timing選項(xiàng)卡上的值來匹配指定的配置。如果實(shí)際使用的SDRAM芯片與列表中的不相同,則需要設(shè)計(jì)者根據(jù)SDRAM芯片數(shù)據(jù)手冊(cè)的參數(shù)來設(shè)置MemoryProfile和Timing標(biāo)簽上的值,改變?nèi)魏芜x項(xiàng)卡上的配置設(shè)置轉(zhuǎn)變Preset值為custom。
當(dāng)然我們也可以將我們配置好的SDRAM參數(shù)添加到預(yù)定義的SDRAM配置,在今后的使用過程中我們就直接選擇我們添加的預(yù)定義的SDRAM配置。接下來我們就來簡(jiǎn)單的介紹一下MemoryProfile和Timing。
(1)MemoryProfile選項(xiàng)卡
MemoryProfile選項(xiàng)卡允許設(shè)計(jì)者指定SDRAM的結(jié)構(gòu),例如地址和數(shù)據(jù)總線寬度、片選信號(hào)的數(shù)目和區(qū)的數(shù)目等。MemoryProfile選項(xiàng)卡設(shè)置項(xiàng)如下表所示。
這些參數(shù)值可參照使用的SDRAM手冊(cè)來設(shè)置。通過MemoryProfile選項(xiàng)卡上的設(shè)置后,消息框以兆字節(jié)、兆bit位以及可尋址的字長(zhǎng)顯示SDRAM預(yù)期的內(nèi)存容量。將這些預(yù)期值與選擇的SDRAM的實(shí)際大小相比較可以檢驗(yàn)設(shè)置是否正確。說完了MemoryProfile選項(xiàng)卡,接下來我們看看Timing選項(xiàng)卡。
(2)Timing選項(xiàng)卡
Timing選項(xiàng)卡允許設(shè)計(jì)者設(shè)置SDRAM芯片的時(shí)序規(guī)范。正確值在SDRAM芯片數(shù)據(jù)手冊(cè)中提供。Timing選項(xiàng)卡上可用的設(shè)置如下表所示。
我們需要注意的是無論我們輸入的精確時(shí)序值如何,每個(gè)參數(shù)實(shí)現(xiàn)的實(shí)際時(shí)序?qū)锳valon時(shí)鐘的整數(shù)倍。對(duì)于每隔一段時(shí)間執(zhí)行一個(gè)刷新命令的參數(shù),實(shí)際時(shí)序?qū)⒉怀瞿繕?biāo)值,而其他所有參數(shù),實(shí)際時(shí)序?qū)⒋笥诨虻扔谀繕?biāo)值。
操作任務(wù)
利用官方SDRAMControllerIP核實(shí)現(xiàn)對(duì)SDRAM的讀寫操作。
硬件設(shè)計(jì)
實(shí)驗(yàn)的硬件框架如下圖所示:
圖中,我們要把clkIP核的時(shí)鐘頻率設(shè)置為100MHz。
另外需要注意的是,NiosIIIP核需要將復(fù)位向量ResetVector和異常向量ExceptionVector都設(shè)置為SDRAM,如下圖所示:
現(xiàn)在我們主要來介紹一下新添加的SDRAMIP核,按照使用的SDRAM型號(hào)為
W9825G6KH的datasheet,配置如下圖所示。
為了方便大家以后的使用,下面我們就簡(jiǎn)單為大家講解一下如何將自己的SDRAM配置添加至Library中。當(dāng)我們配置好SDRAM以后,我們可以在窗口的右下方找到【New】按鈕并點(diǎn)擊,彈出如下圖所示頁面。
在該頁面中,我們將Presetname和Presetdescription填寫好以后,我們就可以點(diǎn)擊【Save】按鈕,彈出如下圖所示提示窗口。
在該提示窗口中我們選擇是,這時(shí)我們就可以在Library中看到我們添加的SDRAM配置了。然后我們重新打開Qsys軟件,這時(shí),我們就可以在SDRAM的Library中看到我們添加的W9825G6KH。最后我們?cè)傺a(bǔ)充說明一點(diǎn),SDRAM為動(dòng)態(tài)存儲(chǔ)器對(duì)時(shí)序要求比較高,由于FPGA內(nèi)部有延遲,所以PLL輸出100Mhz時(shí)鐘頻率給SDRAM_SCLK時(shí),PLL時(shí)鐘需要設(shè)置相位偏移,
相位偏移我們?cè)O(shè)置為-75deg。
頂層代碼如下:
從頂層代碼可以看到,我們主要例化PLL和SDRAM控制器,PLL生成兩個(gè)100MHz的時(shí)鐘,其中一個(gè)偏移-75度用于驅(qū)動(dòng)SDRAM芯片。
軟件設(shè)計(jì)
本實(shí)驗(yàn)的軟件工程代碼如下:
在代碼中,首先定義了一個(gè)aut_u8型的指針ram指向SDRAM的基地址+0x10000,之后我們改變或讀取指針指向的地址(SDRAM基地址+偏移地址)的值,就改變了SDRAM相應(yīng)地址(偏移地址/2)的值。在主函數(shù)中,我們通過memset函數(shù)將從ram指向地址開始的100個(gè)地址的值全部清0,再通過一個(gè)for循環(huán)向從ram指向地址開始的100個(gè)地址的賦相應(yīng)的值,最后再將這100個(gè)值逆向讀取打印出來,這樣就完成了SDRAM的讀寫操作??梢钥闯?,通過SDRAM控制器的使用,對(duì)SDRAM的讀寫操作變得非常簡(jiǎn)單。
之所以對(duì)SDRAM的讀寫要偏移0x10000,是因?yàn)镃PU程序的運(yùn)行占用了從SDRAM基地址開始的部分內(nèi)存,如果我們不做偏移直接從基地址開始讀寫,則很有可能破壞程序正常運(yùn)行,0x10000這個(gè)值并不固定,只要?jiǎng)e占用程序運(yùn)行的內(nèi)存就可以了。
下載驗(yàn)證
首先我們需要在QuartusII軟件中將qsys_sdram.sof文件下載到開發(fā)板中;然后在Eclipse軟件中將qsys_sdram_rw.elf文件下載進(jìn)去。
qsys_sdram_rw.elf下載完成以后,我們的C程序會(huì)自動(dòng)運(yùn)行,同時(shí)在NiosIIConsole界面會(huì)顯示程序的打印信息。圖中可以看到從SDRAM中讀出的數(shù)據(jù)為99到0,與我們寫入的數(shù)據(jù)一致,說明本次實(shí)驗(yàn)下載驗(yàn)證成功。
如果大家在下載elf文件的過程中工具提示錯(cuò)誤,如下圖所示:
我們留意到在下載過程中,Console會(huì)提示如下圖所示的信息,說地址“0x2000020”到“0x200D757”之間驗(yàn)證錯(cuò)誤。
錯(cuò)誤的這段地址并不固定,但它們?cè)赒sys系統(tǒng)中剛好處于SDRAM的地址范圍內(nèi)。此時(shí),我們可以通過以下方式解決下載報(bào)錯(cuò)的問題。
在Eclipse中右擊應(yīng)用工程“qsys_sdram_rw”,在彈出的菜單中選擇“RunAs”
—>“RunConfigurations”,會(huì)彈出“RunConfigurations”配置頁面,如下圖所示:
在上圖所示頁面中的“TargetConnection”標(biāo)簽頁最下方,勾選“Resettheselected
targetsystem”。在上圖中,我們同時(shí)勾選了“IgnoremismatchedsystemID”以及“Ignoremismatchedsystemtimestamp”。設(shè)置完成后,點(diǎn)擊“Apply”,最后點(diǎn)擊“Run”來重新下載elf文件,這樣在下載的過程中就不會(huì)報(bào)錯(cuò)了。