本(běn)文(wén)为(wèi)明(míng)德揚原創文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处!
一(yī)、SDRAM數據(jù)總(zǒng)線(xiàn)屬性(xìng)
下(xià)图(tú)为(wèi)SDRAM的(de)某一(yī)接口(kǒu)时(shí)序图(tú),我(wǒ)们(men)可(kě)以(yǐ)看(kàn)到(dào),读(dú)和(hé)写占用(yòng)的(de)都是(shì)DQ这(zhè)个(gè)數據(jù)總(zǒng)線(xiàn),对(duì)于(yú)SDRAM来(lái)说(shuō),只(zhī)有(yǒu)一(yī)根(gēn)數據(jù)總(zǒng)線(xiàn),那(nà)麼(me)當我(wǒ)们(men)需要(yào)用(yòng)这(zhè)根(gēn)線(xiàn)读(dú)取(qǔ)數據(jù)的(de)时(shí)候,读(dú)出(chū)来(lái)的(de)數據(jù)占用(yòng)了(le)總(zǒng)線(xiàn),这(zhè)个(gè)时(shí)候是(shì)必然无法写入(rù)數據(jù)的(de),同(tóng)樣(yàng)的(de)在(zài)写數據(jù)的(de)时(shí)候也(yě)无法進(jìn)行读(dú)數據(jù)的(de)操作。
二(èr)、SDRAM同(tóng)时(shí)读(dú)写需求
虽然SDRAM具有(yǒu)不(bù)可(kě)同(tóng)时(shí)读(dú)写的(de)屬性(xìng),但是(shì)在(zài)一(yī)些項目中(zhōng)需要(yào)写入(rù)的(de)數據(jù)和(hé)读(dú)出(chū)的(de)數據(jù)都是(shì)連(lián)續的(de)。比如(rú)在(zài)邊(biān)緣檢测的(de)工程中(zhōng),攝像头(tóu)一(yī)直(zhí)在(zài)傳出(chū)數據(jù),并且送到(dào)VGA的(de)图(tú)像數據(jù)也(yě)不(bù)能(néng)斷,这(zhè)时(shí)我(wǒ)们(men)既要(yào)将攝像头(tóu)傳出(chū)的(de)數據(jù)写到(dào)SDRAM,又要(yào)從SDRAM读(dú)出(chū)數據(jù)并在(zài)VGA顯示。因(yīn)此(cǐ)实際工程中(zhōng)时(shí)需要(yào)SDRAM同(tóng)时(shí)实現(xiàn)读(dú)數據(jù)和(hé)写數據(jù)功能(néng)的(de)。
前(qián)面(miàn)我(wǒ)们(men)也(yě)分(fēn)析过(guò)SDRAM的(de)接口(kǒu)时(shí)序图(tú),明(míng)确DQ總(zǒng)線(xiàn)只(zhī)能(néng)進(jìn)行读(dú)數據(jù)或(huò)者(zhě)写數據(jù),不(bù)能(néng)同(tóng)时(shí)進(jìn)行读(dú)写數據(jù),那(nà)麼(me)如(rú)果(guǒ)遇到(dào)上(shàng)述情(qíng)況,就(jiù)需要(yào)我(wǒ)们(men)在(zài)SDRAM固有(yǒu)屬性(xìng)的(de)基礎上(shàng)来(lái)解(jiě)決問(wèn)題(tí)。
三(sān)、“僞同(tóng)时(shí)读(dú)写”的(de)原理
既然SDRAM的(de)屬性(xìng)不(bù)變(biàn),那(nà)麼(me)我(wǒ)们(men)可(kě)以(yǐ)在(zài)SDRAM时(shí)序前(qián)面(miàn)加两(liǎng)个(gè)FIFO,SDRAM接口(kǒu)时(shí)序和(hé)SDRAM硬(yìng)件(jiàn)之間(jiān)由(yóu)一(yī)根(gēn)數據(jù)總(zǒng)線(xiàn)DQ相連(lián),如(rú)下(xià)图(tú)所(suǒ)示。
FIFO是(shì)在(zài)FPGA中(zhōng)比較常用(yòng)的(de)存儲器,FIFO写入(rù)和(hé)读(dú)出(chū)都由(yóu)时(shí)鐘(zhōng)控制,而(ér)且可(kě)以(yǐ)用(yòng)不(bù)同(tóng)的(de)时(shí)鐘(zhōng),那(nà)麼(me)當读(dú)出(chū)的(de)时(shí)鐘(zhōng)大于(yú)写入(rù)时(shí)鐘(zhōng)的(de)时(shí)候,我(wǒ)可(kě)以(yǐ)一(yī)直(zhí)往里(lǐ)面(miàn)写,但是(shì)由(yóu)于(yú)读(dú)出(chū)的(de)速率要(yào)快(kuài),那(nà)就(jiù)不(bù)必要(yào)一(yī)直(zhí)读(dú),FIFO的(de)深度(dù)越深,我(wǒ)就(jiù)可(kě)以(yǐ)等待越多(duō)的(de)时(shí)間(jiān)。
上(shàng)图(tú)結構中(zhōng),設置FIFO左(zuǒ)邊(biān)时(shí)鐘(zhōng)是(shì)25M,右(yòu)邊(biān)时(shí)鐘(zhōng)为(wèi)100M。写命令和(hé)写數據(jù)先(xiān)保存到(dào)FIFO1中(zhōng),读(dú)命令保存到(dào)FIFO2中(zhōng),在(zài)SDRAM接口(kǒu)时(shí)序里(lǐ)面(miàn),会(huì)判斷FIFO1和(hé)FIFO2中(zhōng)谁有(yǒu)數據(jù),谁有(yǒu)數據(jù)就(jiù)執行哪个(gè)命令;如(rú)果(guǒ)都同(tóng)时(shí)有(yǒu)數據(jù),那(nà)工程师(shī)可(kě)以(yǐ)決定(dìng)一(yī)个(gè)优先(xiān)級,選擇其中(zhōng)一(yī)个(gè)命令執行。而(ér)沒(méi)有(yǒu)選中(zhōng)的(de)命令,則保留到(dào)FIFO中(zhōng)緩存,等候被(bèi)選中(zhōng)執行。
簡單来(lái)講就(jiù)是(shì)數據(jù)都暫时(shí)的(de)存在(zài)FIFO中(zhōng),FIFO左(zuǒ)邊(biān)和(hé)右(yòu)邊(biān)的(de)工作时(shí)鐘(zhōng)不(bù)同(tóng),同(tóng)樣(yàng)一(yī)組數據(jù),如(rú)果(guǒ)左(zuǒ)邊(biān)读(dú)写數據(jù)都需要(yào)一(yī)个(gè)时(shí)鐘(zhōng),那(nà)麼(me)右(yòu)邊(biān)读(dú)写數據(jù)就(jiù)需要(yào)四(sì)倍时(shí)鐘(zhōng)即四(sì)个(gè)时(shí)鐘(zhōng)。这(zhè)樣(yàng)一(yī)来(lái),看(kàn)FIFO右(yòu)側的(de)接口(kǒu),永遠(yuǎn)都是(shì)要(yào)不(bù)就(jiù)是(shì)写,要(yào)不(bù)就(jiù)是(shì)读(dú),DQ不(bù)会(huì)被(bèi)读(dú)写同(tóng)时(shí)使用(yòng)(也(yě)就(jiù)是(shì)读(dú)写不(bù)同(tóng)时(shí))。而(ér)在(zài)左(zuǒ)側的(de)接口(kǒu)看(kàn)来(lái),写命令和(hé)读(dú)命令是(shì)可(kě)以(yǐ)同(tóng)时(shí)有(yǒu)效的(de)(也(yě)就(jiù)是(shì)读(dú)写同(tóng)时(shí))。
有(yǒu)的(de)朋友会(huì)講,这(zhè)種(zhǒng)方(fāng)法并不(bù)是(shì)真(zhēn)正(zhèng)的(de)同(tóng)时(shí)读(dú)写呀。其实,能(néng)不(bù)能(néng)同(tóng)时(shí)读(dú)写,是(shì)在(zài)不(bù)同(tóng)的(de)时(shí)間(jiān)精度(dù)来(lái)看(kàn)待的(de)。例如(rú)右(yòu)側的(de)接口(kǒu),在(zài)某一(yī)个(gè)时(shí)鐘(zhōng)沿看(kàn)来(lái),其狀态不(bù)是(shì)读(dú)就(jiù)是(shì)写,无法实現(xiàn)读(dú)写同(tóng)时(shí);但如(rú)果(guǒ)把时(shí)間(jiān)拉长,例如(rú)在(zài)1秒(miǎo)的(de)时(shí)間(jiān)內(nèi)来(lái)看(kàn),在(zài)这(zhè)一(yī)秒(miǎo)鐘(zhōng)內(nèi)既有(yǒu)读(dú)數據(jù)狀态,又有(yǒu)写數據(jù),就(jiù)会(huì)令我(wǒ)们(men)感(gǎn)覺到(dào)它(tā)是(shì)可(kě)以(yǐ)同(tóng)时(shí)读(dú)和(hé)写的(de)。将这(zhè)樣(yàng)一(yī)个(gè)結構當作一(yī)个(gè)整體(tǐ)来(lái)看(kàn),可(kě)以(yǐ)認为(wèi)实現(xiàn)了(le)SDRAM的(de)同(tóng)时(shí)读(dú)写,我(wǒ)们(men)将其稱之为(wèi)“僞同(tóng)时(shí)读(dú)写”。
其实这(zhè)種(zhǒng)“僞同(tóng)时(shí)读(dú)写”我(wǒ)们(men)還(huán)是(shì)經(jīng)常会(huì)遇到(dào)的(de)。例如(rú)電(diàn)腦CPU,衆所(suǒ)周知,它(tā)是(shì)串行執行指令的(de),一(yī)次(cì)只(zhī)能(néng)处理一(yī)个(gè)指令。但我(wǒ)们(men)在(zài)使用(yòng)電(diàn)腦时(shí),可(kě)以(yǐ)感(gǎn)覺到(dào)QQ、浏覽器和(hé)電(diàn)影是(shì)同(tóng)时(shí)工作的(de),这(zhè)也(yě)就(jiù)是(shì)时(shí)間(jiān)精度(dù)的(de)問(wèn)題(tí)。
四(sì)、現(xiàn)实案(àn)例
学会(huì)了(le)利用(yòng)FIFO的(de)存儲特(tè)點(diǎn)来(lái)实現(xiàn)“僞同(tóng)时(shí)读(dú)写”,我(wǒ)们(men)也(yě)就(jiù)解(jiě)決了(le)最(zuì)開(kāi)始提(tí)到(dào)的(de)SDRAM在(zài)邊(biān)緣檢测中(zhōng)实現(xiàn)同(tóng)时(shí)读(dú)写的(de)問(wèn)題(tí)。我(wǒ)们(men)在(zài)写側接收(shōu)的(de)像素數據(jù)在(zài)25M时(shí)鐘(zhōng)域的(de),在(zài)FIFO1的(de)读(dú)側是(shì)100M的(de)时(shí)鐘(zhōng)域,读(dú)写速率相差4倍,當FIFO緩存一(yī)定(dìng)量(liàng)的(de)數據(jù)之後(hòu),就(jiù)读(dú)出(chū)来(lái)写到(dào)SDRAM中(zhōng),写完之後(hòu),就(jiù)可(kě)以(yǐ)利用(yòng)FIFO1读(dú)写的(de)时(shí)間(jiān)差,来(lái)将SDRAM中(zhōng)的(de)數據(jù)读(dú)出(chū),然後(hòu)再放(fàng)到(dào)一(yī)个(gè)写側时(shí)鐘(zhōng)100M,读(dú)側时(shí)鐘(zhōng)25M的(de)FIFO2中(zhōng),就(jiù)可(kě)以(yǐ)保證FIFO2一(yī)直(zhí)有(yǒu)數據(jù)读(dú)出(chū),而(ér)FIFO1又一(yī)直(zhí)有(yǒu)數據(jù)写入(rù)。这(zhè)樣(yàng)以(yǐ)来(lái)就(jiù)实現(xiàn)了(le)攝像头(tóu)一(yī)直(zhí)采集數據(jù)并且一(yī)直(zhí)有(yǒu)數據(jù)傳輸到(dào)VGA。
以(yǐ)上(shàng)就(jiù)是(shì)通(tòng)过(guò)FIFO实現(xiàn)SDEAM同(tóng)时(shí)读(dú)写的(de)解(jiě)決方(fāng)案(àn),更(gèng)多(duō)關(guān)于(yú)FPGA的(de)欢迎加Q:1817866119(N老(lǎo)师(shī))進(jìn)行交流讨論!














