明(míng)德揚科教業务:
FPGA培訓班
FPGA項目承接
虽然現(xiàn)代(dài)FPGA包(bāo)含內(nèi)部(bù)存儲器,但可(kě)用(yòng)內(nèi)存的(de)數量(liàng)總(zǒng)是(shì)低于(yú)專用(yòng)存儲器芯片(piàn)所(suǒ)能(néng)达(dá)到(dào)的(de)水(shuǐ)平的(de)數量(liàng)級。因(yīn)此(cǐ),许多(duō)FPGA設計(jì)者(zhě)将某種(zhǒng)類(lèi)型的(de)內(nèi)存附加到(dào)他(tā)们(men)的(de)FPGA上(shàng)也(yě)就(jiù)不(bù)足为(wèi)奇了(le)。特(tè)别是(shì)SDRAM以(yǐ)其高(gāo)速度(dù)和(hé)低成(chéng)本(běn)的(de)特(tè)點(diǎn)而(ér)成(chéng)为(wèi)非(fēi)常受欢迎的(de)存儲器。不(bù)幸的(de)是(shì),它(tā)们(men)不(bù)像静(jìng)态存儲器那(nà)樣(yàng)容易控制,所(suǒ)以(yǐ)經(jīng)常使用(yòng)SDRAM控制器。
对(duì)于(yú)我(wǒ)们(men)的(de)控制器,我(wǒ)们(men)的(de)目标(biāo)可(kě)能(néng)是(shì)最(zuì)簡單的(de)SDRAM:微米(mǐ)。MT48LC1M16A116 MB遺留SDRAM。我(wǒ)们(men)的(de)测試系(xì)統是(shì)Xylo-E,Xylo-EM和(hé)Xylo-LM(Xilinx或(huò)AlteraFPGAs,16 MB到(dào)256 MB SDRAM).
我(wǒ)们(men)将主(zhǔ)題(tí)分(fēn)为(wèi)三(sān)个(gè)部(bù)分(fēn)。首先(xiān)介紹了(le)FPGA中(zhōng)使用(yòng)的(de)存儲器。然後(hòu)介紹了(le)如(rú)何制作16 MB的(de)SDRAM控制器。最(zuì)後(hòu)介紹了(le)先(xiān)進(jìn)的(de)DDR SDRAMS。
-
從静(jìng)态到(dào)動(dòng)态
-
一(yī)个(gè)簡單的(de)控制器
-
DDR-速度(dù)競赛
静(jìng)态記(jì)憶
讓我(wǒ)们(men)假設我(wǒ)们(men)希望将一(yī)个(gè)16 MB的(de)內(nèi)存連(lián)接到(dào)一(yī)个(gè)FPGA上(shàng)。
16 MB意(yì)味着內(nèi)存容納1600万(wàn)位(确切(qiè)地(dì)说(shuō)是(shì)16,777,216位)。現(xiàn)在(zài)这(zhè)些位很少(shǎo)是(shì)單独尋址的(de),但是(shì)通(tòng)常是(shì)在(zài)8或(huò)16的(de)數據(jù)包(bāo)中(zhōng)(我(wǒ)们(men)稱之为(wèi)單词)。因(yīn)此(cǐ),如(rú)果(guǒ)我(wǒ)们(men)的(de)16 MB內(nèi)存被(bèi)組織为(wèi)1M字(zì)的(de)16位,我(wǒ)们(men)需要(yào)一(yī)个(gè)20位的(de)地(dì)址總(zǒng)線(xiàn)和(hé)一(yī)个(gè)16位的(de)數據(jù)總(zǒng)線(xiàn),再加上(shàng)一(yī)些允许写和(hé)读(dú)的(de)信(xìn)号(hào)。
真(zhēn)正(zhèng)的(de)內(nèi)存也(yě)会(huì)有(yǒu)一(yī)个(gè)CS(芯片(piàn)選擇),如(rú)果(guǒ)內(nèi)存是(shì)同(tóng)步的(de),則会(huì)有(yǒu)一(yī)个(gè)时(shí)鐘(zhōng)(为(wèi)了(le)清(qīng)晰起見(jiàn),從图(tú)片(piàn)中(zhōng)省(shěng)略这(zhè)些时(shí)鐘(zhōng))。
如(rú)果(guǒ)这(zhè)个(gè)內(nèi)存是(shì)一(yī)个(gè)块(kuài)(在(zài)FPGA內(nèi)),它(tā)看(kàn)起来(lái)就(jiù)不(bù)一(yī)樣(yàng)了(le)(假設有(yǒu)这(zhè)麼(me)大的(de)16 MB块(kuài)).典型的(de)區(qū)块(kuài)要(yào)小得多(duō))。
正(zhèng)如(rú)您所(suǒ)看(kàn)到(dào)的(de),它(tā)仍然是(shì)一(yī)个(gè)內(nèi)存块(kuài),但是(shì)有(yǒu)两(liǎng)个(gè)地(dì)址總(zǒng)線(xiàn)。那(nà)是(shì)因(yīn)为(wèi)現(xiàn)代(dài)FPGA中(zhōng)的(de)块(kuài)是(shì)双(shuāng)口(kǒu)的(de).这(zhè)意(yì)味着两(liǎng)个(gè)代(dài)理可(kě)以(yǐ)同(tóng)时(shí)訪問(wèn)內(nèi)存。通(tòng)常,一(yī)个(gè)代(dài)理写入(rù)內(nèi)存,而(ér)另(lìng)一(yī)个(gè)代(dài)理读(dú)取(qǔ)。因(yīn)此(cǐ),存儲器对(duì)每个(gè)代(dài)理都有(yǒu)独立的(de)地(dì)址和(hé)數據(jù)總(zǒng)線(xiàn)。上(shàng)面(miàn)的(de)图(tú)片(piàn)顯示了(le)頂部(bù)的(de)第(dì)一(yī)个(gè)(写)代(dài)理和(hé)底部(bù)的(de)第(dì)二(èr)个(gè)(读(dú)取(qǔ))。更(gèng)高(gāo)級的(de)阻止器允许每个(gè)代(dài)理同(tóng)时(shí)读(dú)写,但上(shàng)面(miàn)所(suǒ)示的(de)體(tǐ)系(xì)結構是(shì)最(zuì)常用(yòng)的(de)。另(lìng)外(wài),块(kuài)通(tòng)常是(shì)同(tóng)步使用(yòng)的(de),因(yīn)此(cǐ)每个(gè)代(dài)理必須提(tí)供一(yī)个(gè)时(shí)鐘(zhōng)(沒(méi)有(yǒu)顯示在(zài)图(tú)片(piàn)上(shàng))。
到(dào)目前(qián)为(wèi)止,顯示的(de)記(jì)憶是(shì)静(jìng)态的(de),这(zhè)意(yì)味着它(tā)们(men)僅僅是(shì)通(tòng)过(guò)对(duì)它(tā)们(men)施加能(néng)量(liàng)来(lái)保存它(tā)们(men)的(de)內(nèi)容。此(cǐ)外(wài),静(jìng)态內(nèi)存可(kě)以(yǐ)被(bèi)看(kàn)作是(shì)一(yī)个(gè)长长的(de)線(xiàn)性(xìng)單词數組(您只(zhī)需提(tí)供一(yī)个(gè)地(dì)址并可(kě)以(yǐ)訪問(wèn)匹(pǐ)配的(de)數據(jù).无并發(fà)症)。交換条(tiáo)件(jiàn)是(shì)每比特(tè)的(de)成(chéng)本(běn)比.
動(dòng)态記(jì)憶
我(wǒ)们(men)将使用(yòng)SDRAM,它(tā)是(shì)動(dòng)态內(nèi)存(SDRAM中(zhōng)的(de)“D”)。而(ér)在(zài)動(dòng)态內(nèi)存中(zhōng),內(nèi)存并不(bù)被(bèi)看(kàn)作是(shì)一(yī)长串單词,而(ér)是(shì)被(bèi)組織成(chéng)一(yī)个(gè)矩阵(zhèn)(行/列)。
上(shàng)面(miàn)的(de)图(tú)片(piàn)顯示了(le)行的(de)12位和(hé)列的(de)8位,總(zǒng)共(gòng)有(yǒu)20个(gè)地(dì)址位。輕(qīng)松點(diǎn)。
有(yǒu)一(yī)个(gè)複雜的(de)問(wèn)題(tí):为(wèi)了(le)提(tí)高(gāo)性(xìng)能(néng),內(nèi)存被(bèi)分(fēn)割成(chéng)相等的(de)块(kuài),稱为(wèi)“银行”。这(zhè)是(shì)因(yīn)为(wèi)一(yī)些動(dòng)态內(nèi)存操作很慢(màn),所(suǒ)以(yǐ)银行允许在(zài)等待另(lìng)一(yī)个(gè)银行的(de)同(tóng)时(shí)使用(yòng)一(yī)个(gè)银行。
因(yīn)此(cǐ),如(rú)果(guǒ)我(wǒ)们(men)的(de)16 MB SDRAM有(yǒu)2家(jiā)银行,那(nà)麼(me)每家(jiā)银行都持(chí)有(yǒu)8MB。
當SDRAM被(bèi)訪問(wèn)时(shí),FPGA必須選擇银行(1位)、行(現(xiàn)在(zài)只(zhī)有(yǒu)11位)和(hé)列(8位),總(zǒng)共(gòng)20位。但是(shì)这(zhè)是(shì)两(liǎng)个(gè)步驟:首先(xiān)是(shì)行+银行,然後(hòu)是(shì)列:
-
FPGA選擇一(yī)个(gè)银行并激活它(tā)的(de)一(yī)行。然後(hòu),它(tā)等待幾(jǐ)个(gè)时(shí)鐘(zhōng)(为(wèi)排準備)。
-
現(xiàn)在(zài)行是(shì)活動(dòng)的(de),FPGA只(zhī)需提(tí)供列地(dì)址就(jiù)可(kě)以(yǐ)訪問(wèn)(读(dú)和(hé)/或(huò)写)行中(zhōng)它(tā)想(xiǎng)要(yào)的(de)任何數據(jù)。
-
一(yī)旦FPGA完成(chéng)了(le)对(duì)行的(de)处理,就(jiù)必須在(zài)打(dǎ)開(kāi)新行之前(qián)關(guān)閉該行。
为(wèi)了(le)獲得最(zuì)好(hǎo)的(de)性(xìng)能(néng),用(yòng)戶(=FPGA)希望避免过(guò)多(duō)地(dì)打(dǎ)開(kāi)和(hé)關(guān)閉行,而(ér)是(shì)在(zài)關(guān)閉行之前(qián)盡可(kě)能(néng)多(duō)地(dì)進(jìn)行一(yī)行工作,并在(zài)不(bù)同(tóng)的(de)银行中(zhōng)交叉(chā)操作,这(zhè)樣(yàng)就(jiù)不(bù)会(huì)浪費时(shí)鐘(zhōng)周期(qī)。大多(duō)數SDRAM实際上(shàng)有(yǒu)4或(huò)8家(jiā)银行,而(ér)且每家(jiā)银行都是(shì)独立的(de),因(yīn)此(cǐ)可(kě)以(yǐ)有(yǒu)自(zì)己的(de)行活動(dòng)。
SDRAM引脚
如(rú)果(guǒ)我(wǒ)们(men)看(kàn)一(yī)下(xià)SDRAM的(de)引脚,就(jiù)会(huì)發(fà)現(xiàn)有(yǒu)幾(jǐ)个(gè)新来(lái)的(de)。
地(dì)址總(zǒng)線(xiàn)和(hé)數據(jù)總(zǒng)線(xiàn)仍然存在(zài),但是(shì)地(dì)址總(zǒng)線(xiàn)只(zhī)有(yǒu)11位(它(tā)用(yòng)来(lái)提(tí)供要(yào)打(dǎ)開(kāi)的(de)行,然後(hòu)是(shì)列地(dì)址)。BA引脚指定(dìng)银行(因(yīn)为(wèi)在(zài)我(wǒ)们(men)的(de)示例中(zhōng)只(zhī)有(yǒu)2家(jiā)银行,我(wǒ)们(men)只(zhī)需要(yào)一(yī)个(gè)引脚)。we、CAS和(hé)RAS一(yī)起用(yòng)作命令引脚,因(yīn)此(cǐ)我(wǒ)们(men)可(kě)以(yǐ)向(xiàng)SDRAM發(fà)送8个(gè)不(bù)同(tóng)的(de)命令(命令包(bāo)括“Open row”、“read”、“write”和(hé)“Close row”)。其他(tā)一(yī)些引脚被(bèi)使用(yòng)(但沒(méi)有(yǒu)顯示在(zài)图(tú)片(piàn)上(shàng)),如(rú)时(shí)鐘(zhōng),芯片(piàn)選擇,字(zì)节(jié)啟用(yòng).
請注意(yì),在(zài)動(dòng)态內(nèi)存術(shù)語(yǔ)中(zhōng),“打(dǎ)開(kāi)行”稱为(wèi)“激活”,“關(guān)閉行”稱为(wèi)“預充電(diàn)”。
刷新
SDRAM是(shì)動(dòng)态存儲器:它(tā)们(men)的(de)內(nèi)容需要(yào)定(dìng)期(qī)刷新,因(yīn)为(wèi)每个(gè)內(nèi)存位值(0或(huò)1)都保存在(zài)一(yī)个(gè)微小的(de)電(diàn)容器中(zhōng),其電(diàn)荷随时(shí)間(jiān)而(ér)衰減。但衰變(biàn)率很低,只(zhī)要(yào)定(dìng)期(qī)读(dú)写(“刷新”),制造商就(jiù)保證不(bù)会(huì)丢失任何數據(jù)。
有(yǒu)两(liǎng)種(zhǒng)刷新機(jī)制可(kě)用(yòng)。
-
FPGA向(xiàng)SDRAM發(fà)送“自(zì)動(dòng)刷新”命令.
只(zhī)需确保它(tā)是(shì)定(dìng)期(qī)完成(chéng)的(de)(SDRAM數據(jù)表(biǎo)告訴您最(zuì)低刷新頻率)。
-
FPGA訪問(wèn)每一(yī)行“足够頻繁”。
打(dǎ)開(kāi)一(yī)行将導致(zhì)SDRAM中(zhōng)的(de)“感(gǎn)测放(fàng)大器”獲得該行的(de)所(suǒ)有(yǒu)電(diàn)容器電(diàn)荷的(de)副本(běn)。然後(hòu),當行被(bèi)關(guān)閉时(shí),先(xiān)前(qián)感(gǎn)测的(de)值被(bèi)複制回(huí)電(diàn)容器中(zhōng),刷新進(jìn)程中(zhōng)的(de)數據(jù)。
为(wèi)什麼(me)是(shì)內(nèi)存控制器?
動(dòng)态記(jì)憶比静(jìng)态記(jì)憶更(gèng)複雜.我(wǒ)们(men)有(yǒu)行、列、银行和(hé)刷新周期(qī)需要(yào)处理。但是(shì)SDRAM由(yóu)于(yú)其高(gāo)速和(hé)低成(chéng)本(běn)的(de)每比特(tè)而(ér)引人(rén)注目。
因(yīn)此(cǐ),我(wǒ)们(men)需要(yào)的(de)是(shì)一(yī)種(zhǒng)訪問(wèn)SDRAM的(de)方(fāng)法,但是(shì)使用(yòng)静(jìng)态內(nèi)存很容易。这(zhè)就(jiù)是(shì)創建內(nèi)存控制器的(de)原因(yīn)。它(tā)们(men)充當轉(zhuǎn)換层:一(yī)方(fāng)面(miàn),它(tā)们(men)为(wèi)用(yòng)戶提(tí)供了(le)一(yī)个(gè)易于(yú)使用(yòng)的(de)內(nèi)存接口(kǒu),然後(hòu)進(jìn)行肮髒的(de)工作来(lái)驅動(dòng)真(zhēn)实的(de)SDRAM信(xìn)号(hào)。
我(wǒ)们(men)的(de)SDRAM控制器具有(yǒu)以(yǐ)下(xià)特(tè)性(xìng):
-
易于(yú)使用(yòng):使SDRAM看(kàn)起来(lái)像静(jìng)态內(nèi)存(或(huò)盡可(kě)能(néng)接近(jìn))。
-
快(kuài)速:如(rú)果(guǒ)提(tí)供連(lián)續地(dì)址,SDRAM将在(zài)突發(fà)模式下(xià)使用(yòng)。
-
簡單:沒(méi)有(yǒu)調度(dù),一(yī)次(cì)只(zhī)有(yǒu)一(yī)个(gè)银行在(zài)活動(dòng)。
-
功能(néng)強(qiáng)大:SDRAM顯示为(wèi)一(yī)个(gè)簡單的(de)双(shuāng)口(kǒu)存儲器(即有(yǒu)一(yī)个(gè)写入(rù)代(dài)理和(hé)一(yī)个(gè)读(dú)取(qǔ)代(dài)理)。
控制器最(zuì)不(bù)常見(jiàn)的(de)特(tè)性(xìng)可(kě)能(néng)是(shì)最(zuì)後(hòu)一(yī)个(gè)。SDRAM是(shì)一(yī)種(zhǒng)單端口(kǒu)存儲器,但是(shì)FPGA從訪問(wèn)双(shuāng)口(kǒu)存儲器(比如(rú)块(kuài))中(zhōng)獲益很大,所(suǒ)以(yǐ)我(wǒ)们(men)覺得这(zhè)是(shì)一(yī)个(gè)很好(hǎo)的(de)特(tè)性(xìng)。
控制器信(xìn)号(hào)
这(zhè)里(lǐ)是(shì)我(wǒ)们(men)的(de)SDRAM控制器的(de)一(yī)个(gè)簡單的(de)視图(tú)。
左(zuǒ)邊(biān)的(de)前(qián)三(sān)个(gè)信(xìn)号(hào)由(yóu)書(shū)写代(dài)理使用(yòng)(“写請求”,後(hòu)面(miàn)是(shì)“写地(dì)址”和(hé)“写數據(jù)”)。然後(hòu)到(dào)下(xià)面(miàn)三(sān)个(gè)信(xìn)号(hào)为(wèi)閱读(dú)代(dài)理。在(zài)右(yòu)邊(biān),控制器驅動(dòng)SDRAM信(xìn)号(hào)。为(wèi)了(le)正(zhèng)确看(kàn)待問(wèn)題(tí),这(zhè)里(lǐ)有(yǒu)一(yī)个(gè)使用(yòng)SDRAM控制器的(de)典型FPGA系(xì)統的(de)視图(tú)。
現(xiàn)在(zài),我(wǒ)们(men)的(de)控制器使SDRAM顯示为(wèi)双(shuāng)口(kǒu)存儲器.但是(shì)SDRAM实際上(shàng)是(shì)一(yī)个(gè)單端口(kǒu)內(nèi)存,所(suǒ)以(yǐ)我(wǒ)们(men)的(de)控制器不(bù)得不(bù)玩一(yī)个(gè)把戏。如(rú)果(guǒ)我(wǒ)们(men)的(de)控制器同(tóng)时(shí)收(shōu)到(dào)两(liǎng)个(gè)請求,它(tā)要(yào)麼(me)必須暫停一(yī)个(gè)代(dài)理,要(yào)麼(me)記(jì)录(lù)它(tā)们(men)的(de)請求,然後(hòu)執行它(tā)们(men)。我(wǒ)们(men)的(de)控制器選擇了(le)第(dì)一(yī)種(zhǒng)策略。因(yīn)此(cǐ),我(wǒ)们(men)添加了(le)“授予”信(xìn)号(hào):代(dài)理可(kě)以(yǐ)在(zài)任何时(shí)候斷言請求,但控制器有(yǒu)權授予請求或(huò)不(bù)授予請求。如(rú)果(guǒ)一(yī)个(gè)請求被(bèi)拒絕,繼續詢問(wèn),它(tā)最(zuì)終(zhōng)会(huì)被(bèi)批準。
SDRAM的(de)最(zuì)後(hòu)一(yī)个(gè)複雜之处在(zài)于(yú)從读(dú)取(qǔ)請求返回(huí)的(de)數據(jù)被(bèi)延遲(稱为(wèi)CA延遲在(zài)SDRAM數據(jù)表(biǎo)中(zhōng))。控制器還(huán)可(kě)能(néng)会(huì)增加一(yī)些延遲时(shí)鐘(zhōng)。因(yīn)此(cǐ),即使控制器可(kě)以(yǐ)立即批準读(dú)取(qǔ)請求,匹(pǐ)配的(de)數據(jù)也(yě)只(zhī)能(néng)在(zài)固定(dìng)數量(liàng)的(de)时(shí)鐘(zhōng)之後(hòu)使用(yòng)。为(wèi)了(le)方(fāng)便起見(jiàn),我(wǒ)们(men)添加了(le)一(yī)个(gè)“數據(jù)有(yǒu)效”信(xìn)号(hào),該信(xìn)号(hào)是(shì)在(zài)數據(jù)真(zhēn)正(zhèng)可(kě)用(yòng)时(shí)斷言的(de)。
狀态機(jī)
我(wǒ)们(men)的(de)SDRAM控制器的(de)心(xīn)髒是(shì)一(yī)个(gè)狀态機(jī)。控制器等待請求(读(dú)或(huò)写),打(dǎ)開(kāi)匹(pǐ)配的(de)银行/行,發(fà)出(chū)读(dú)或(huò)写命令(只(zhī)要(yào)活動(dòng)代(dài)理在(zài)活動(dòng)行中(zhōng)請求它(tā)们(men)),最(zuì)後(hòu)關(guān)閉行。
根(gēn)據(jù)这(zhè)一(yī)計(jì)劃(huà),一(yī)次(cì)只(zhī)有(yǒu)一(yī)家(jiā)银行在(zài)活動(dòng)。先(xiān)進(jìn)的(de)SDRAM控制器将允许多(duō)个(gè)银行同(tóng)时(shí)活動(dòng),但我(wǒ)们(men)決定(dìng)保持(chí)簡單。
現(xiàn)在(zài),打(dǎ)開(kāi)和(hé)結束(shù)行需要(yào)时(shí)間(jiān)。例如(rú),SDRAM數據(jù)表(biǎo)提(tí)供了(le)以(yǐ)下(xià)數字(zì):
-
tRCD=20 ns(主(zhǔ)動(dòng)读(dú)写)
-
Trp=21 ns(預充電(diàn)至(zhì)活動(dòng))
因(yīn)此(cǐ),如(rú)果(guǒ)我(wǒ)们(men)在(zài)100 MHz上(shàng)運行SDRAM,时(shí)鐘(zhōng)周期(qī)是(shì)10 ns,我(wǒ)们(men)需要(yào)在(zài)狀态機(jī)中(zhōng)添加一(yī)些空时(shí)鐘(zhōng)周期(qī)(稱为(wèi)NOP)。
此(cǐ)外(wài),如(rú)果(guǒ)读(dú)取(qǔ)代(dài)理无法保證定(dìng)期(qī)打(dǎ)開(kāi)每一(yī)行,則需要(yào)刷新周期(qī)。
狀态機(jī)現(xiàn)在(zài)看(kàn)起来(lái)有(yǒu)點(diǎn)複雜。
最(zuì)後(hòu),NOP周期(qī)的(de)數目可(kě)能(néng)需要(yào)調整。例如(rú),在(zài)100 MHz和(hé)Trp=21 ns,我(wǒ)们(men)实際上(shàng)需要(yào)两(liǎng)个(gè)NOP周期(qī)後(hòu),預充電(diàn)(給(gěi)我(wǒ)们(men)30 ns前(qián)下(xià)一(yī)个(gè)激活)。
初始化(huà)
SDRAM有(yǒu)一(yī)些可(kě)編程的(de)設置(比如(rú)CAS延遲),所(suǒ)以(yǐ)有(yǒu)一(yī)个(gè)“模式”寄存器需要(yào)在(zài)啟動(dòng)後(hòu)初始化(huà)。为(wèi)此(cǐ),将使用(yòng)“加载模式”命令。SDRAM初始化(huà)可(kě)以(yǐ)在(zài)控制器中(zhōng)添加,或(huò)者(zhě)在(zài)控制器運行之前(qián)在(zài)單独的(de)步驟中(zhōng)添加。
密碼
控制器的(de)心(xīn)髒如(rú)下(xià)所(suǒ)示。
为(wèi)了(le)獲得最(zuì)佳的(de)IO时(shí)序,所(suǒ)有(yǒu)SDRAM控制信(xìn)号(hào)都被(bèi)注册,这(zhè)樣(yàng)就(jiù)沒(méi)有(yǒu)組合邏輯信(xìn)号(hào)進(jìn)入(rù)FPGA之外(wài)。
always @(posedge clk) // state machine case(state)
2'h0: begin if(RdReq | WrReq) begin // is there a read or write request?
SDRAM_CMD <= SDRAM_CMD_ACTIVE; // if so, open
SDRAM_BA <= Addr[19]; // this bank
SDRAM_A <= Addr[18:8]; // this row
SDRAM_DQM <= 2'b11;
state <= 2'h1; end else begin SDRAM_CMD <= SDRAM_CMD_NOP; // otherwise stay idle
SDRAM_BA <= 0;
SDRAM_A <= 0;
SDRAM_DQM <= 2'b11;
state <= 2'h0; end end 2'h1: begin SDRAM_CMD <= ReadSelected ? SDRAM_CMD_READ : SDRAM_CMD_WRITE;
SDRAM_BA <= AddrR[19];
SDRAM_A[9:0] <= {2'b00, AddrR[7:0]}; // column
SDRAM_A[10] <= 1'b0; // no auto-precharge
SDRAM_DQM <= 2'b00;
state <= (ReadSelected ? RdReq : WrReq) & SameRowAndBank ? 2'h1 : 2'h2; end 2'h2: begin SDRAM_CMD <= SDRAM_CMD_PRECHARGE; // close the row when we're done with it
SDRAM_BA <= 0;
SDRAM_A <= 11'b100_0000_0000; // all banks precharge
SDRAM_DQM <= 2'b11;
state <= 2'h0; end endcase
完整的(de)演示代(dài)碼是(shì)可(kě)用(yòng)的(de)。这(zhè)里(lǐ)。它(tā)是(shì)功能(néng),但因(yīn)为(wèi)这(zhè)是(shì)教育,我(wǒ)们(men)保持(chí)它(tā)盡可(kě)能(néng)簡單,通(tòng)过(guò)删除非(fēi)必要(yào)的(de)功能(néng)。檢查代(dài)碼中(zhōng)的(de)注釋以(yǐ)了(le)解(jiě)限制和(hé)要(yào)求。
使用(yòng)实例
SDRAM經(jīng)常用(yòng)于(yú)顯卡(kǎ),因(yīn)为(wèi)存儲图(tú)形需要(yào)大量(liàng)內(nèi)存。它(tā)的(de)工作原理是(shì)这(zhè)樣(yàng)的(de):計(jì)算機(jī)的(de)CPU将图(tú)形數據(jù)發(fà)送到(dào)視頻卡(kǎ)。卡(kǎ)使用(yòng)SDRAM存儲數據(jù),卡(kǎ)中(zhōng)的(de)控制器定(dìng)期(qī)读(dú)取(qǔ)存儲器以(yǐ)将數據(jù)發(fà)送到(dào)顯示器。數據(jù)(在(zài)SDRAM中(zhōng))在(zài)進(jìn)程中(zhōng)被(bèi)自(zì)動(dòng)刷新。
作为(wèi)验(yàn)證过(guò)程的(de)一(yī)部(bù)分(fēn),我(wǒ)们(men)使用(yòng)Xylo-EM板創建了(le)这(zhè)樣(yàng)的(de)基本(běn)系(xì)統。SDRAM控制器是(shì)双(shuāng)口(kǒu)的(de),这(zhè)使得設計(jì)變(biàn)得簡單明(míng)了(le)(PC/FX2是(shì)写入(rù)代(dài)理,視頻控制器是(shì)读(dú)取(qǔ)代(dài)理)。
随着內(nèi)存制造商試图(tú)尋找(zhǎo)提(tí)高(gāo)SDRAMS速度(dù)的(de)方(fāng)法,DDR SDRAM被(bèi)引入(rù)。DDR代(dài)表(biǎo)“双(shuāng)數據(jù)速率”。
DDRSDRAM的(de)大腦類(lèi)似于(yú)常規的(de)(單一(yī)數據(jù)速率)SDRAM(我(wǒ)们(men)仍然有(yǒu)银行和(hé)行需要(yào)打(dǎ)開(kāi))。DDRSDRAM的(de)運行速度(dù)要(yào)快(kuài)得多(duō),时(shí)鐘(zhōng)速度(dù)更(gèng)快(kuài),突發(fà)周期(qī)更(gèng)长,每个(gè)时(shí)鐘(zhōng)周期(qī)發(fà)送的(de)數據(jù)行有(yǒu)两(liǎng)个(gè)位(因(yīn)此(cǐ)DDR名稱)。这(zhè)導致(zhì)數據(jù)線(xiàn)上(shàng)的(de)时(shí)間(jiān)非(fēi)常緊张(zhāng),并增加了(le)一(yī)些功能(néng),以(yǐ)幫助可(kě)靠地(dì)傳輸數據(jù)。