本文為明德?lián)P原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處!
一、SDRAM數(shù)據(jù)總線屬性
下圖為SDRAM的某一接口時(shí)序圖,我們可以看到,讀和寫占用的都是DQ這個(gè)數(shù)據(jù)總線,對(duì)于SDRAM來說,只有一根數(shù)據(jù)總線,那么當(dāng)我們需要用這根線讀取數(shù)據(jù)的時(shí)候,讀出來的數(shù)據(jù)占用了總線,這個(gè)時(shí)候是必然無法寫入數(shù)據(jù)的,同樣的在寫數(shù)據(jù)的時(shí)候也無法進(jìn)行讀數(shù)據(jù)的操作。
二、SDRAM同時(shí)讀寫需求
雖然SDRAM具有不可同時(shí)讀寫的屬性,但是在一些項(xiàng)目中需要寫入的數(shù)據(jù)和讀出的數(shù)據(jù)都是連續(xù)的。比如在邊緣檢測(cè)的工程中,攝像頭一直在傳出數(shù)據(jù),并且送到VGA的圖像數(shù)據(jù)也不能斷,這時(shí)我們既要將攝像頭傳出的數(shù)據(jù)寫到SDRAM,又要從SDRAM讀出數(shù)據(jù)并在VGA顯示。因此實(shí)際工程中時(shí)需要SDRAM同時(shí)實(shí)現(xiàn)讀數(shù)據(jù)和寫數(shù)據(jù)功能的。
前面我們也分析過SDRAM的接口時(shí)序圖,明確DQ總線只能進(jìn)行讀數(shù)據(jù)或者寫數(shù)據(jù),不能同時(shí)進(jìn)行讀寫數(shù)據(jù),那么如果遇到上述情況,就需要我們?cè)?span>SDRAM固有屬性的基礎(chǔ)上來解決問題。
三、“偽同時(shí)讀寫”的原理
既然SDRAM的屬性不變,那么我們可以在SDRAM時(shí)序前面加兩個(gè)FIFO,SDRAM接口時(shí)序和SDRAM硬件之間由一根數(shù)據(jù)總線DQ相連,如下圖所示。
FIFO是在FPGA中比較常用的存儲(chǔ)器,FIFO寫入和讀出都由時(shí)鐘控制,而且可以用不同的時(shí)鐘,那么當(dāng)讀出的時(shí)鐘大于寫入時(shí)鐘的時(shí)候,我可以一直往里面寫,但是由于讀出的速率要快,那就不必要一直讀,FIFO的深度越深,我就可以等待越多的時(shí)間。
上圖結(jié)構(gòu)中,設(shè)置FIFO左邊時(shí)鐘是25M,右邊時(shí)鐘為100M。寫命令和寫數(shù)據(jù)先保存到FIFO1中,讀命令保存到FIFO2中,在SDRAM接口時(shí)序里面,會(huì)判斷FIFO1和FIFO2中誰有數(shù)據(jù),誰有數(shù)據(jù)就執(zhí)行哪個(gè)命令;如果都同時(shí)有數(shù)據(jù),那工程師可以決定一個(gè)優(yōu)先級(jí),選擇其中一個(gè)命令執(zhí)行。而沒有選中的命令,則保留到FIFO中緩存,等候被選中執(zhí)行。
簡(jiǎn)單來講就是數(shù)據(jù)都暫時(shí)的存在FIFO中,FIFO左邊和右邊的工作時(shí)鐘不同,同樣一組數(shù)據(jù),如果左邊讀寫數(shù)據(jù)都需要一個(gè)時(shí)鐘,那么右邊讀寫數(shù)據(jù)就需要四倍時(shí)鐘即四個(gè)時(shí)鐘。這樣一來,看FIFO右側(cè)的接口,永遠(yuǎn)都是要不就是寫,要不就是讀,DQ不會(huì)被讀寫同時(shí)使用(也就是讀寫不同時(shí))。而在左側(cè)的接口看來,寫命令和讀命令是可以同時(shí)有效的(也就是讀寫同時(shí))。
有的朋友會(huì)講,這種方法并不是真正的同時(shí)讀寫呀。其實(shí),能不能同時(shí)讀寫,是在不同的時(shí)間精度來看待的。例如右側(cè)的接口,在某一個(gè)時(shí)鐘沿看來,其狀態(tài)不是讀就是寫,無法實(shí)現(xiàn)讀寫同時(shí);但如果把時(shí)間拉長(zhǎng),例如在1秒的時(shí)間內(nèi)來看,在這一秒鐘內(nèi)既有讀數(shù)據(jù)狀態(tài),又有寫數(shù)據(jù),就會(huì)令我們感覺到它是可以同時(shí)讀和寫的。將這樣一個(gè)結(jié)構(gòu)當(dāng)作一個(gè)整體來看,可以認(rèn)為實(shí)現(xiàn)了SDRAM的同時(shí)讀寫,我們將其稱之為“偽同時(shí)讀寫”。
其實(shí)這種“偽同時(shí)讀寫”我們還是經(jīng)常會(huì)遇到的。例如電腦CPU,眾所周知,它是串行執(zhí)行指令的,一次只能處理一個(gè)指令。但我們?cè)谑褂秒娔X時(shí),可以感覺到QQ、瀏覽器和電影是同時(shí)工作的,這也就是時(shí)間精度的問題。
四、現(xiàn)實(shí)案例
學(xué)會(huì)了利用FIFO的存儲(chǔ)特點(diǎn)來實(shí)現(xiàn)“偽同時(shí)讀寫”,我們也就解決了最開始提到的SDRAM在邊緣檢測(cè)中實(shí)現(xiàn)同時(shí)讀寫的問題。我們?cè)趯憘?cè)接收的像素?cái)?shù)據(jù)在25M時(shí)鐘域的,在FIFO1的讀側(cè)是100M的時(shí)鐘域,讀寫速率相差4倍,當(dāng)FIFO緩存一定量的數(shù)據(jù)之后,就讀出來寫到SDRAM中,寫完之后,就可以利用FIFO1讀寫的時(shí)間差,來將SDRAM中的數(shù)據(jù)讀出,然后再放到一個(gè)寫側(cè)時(shí)鐘100M,讀側(cè)時(shí)鐘25M的FIFO2中,就可以保證FIFO2一直有數(shù)據(jù)讀出,而FIFO1又一直有數(shù)據(jù)寫入。這樣以來就實(shí)現(xiàn)了攝像頭一直采集數(shù)據(jù)并且一直有數(shù)據(jù)傳輸?shù)?span>VGA。
以上就是通過FIFO實(shí)現(xiàn)SDEAM同時(shí)讀寫的解決方案,更多關(guān)于FPGA的歡迎加Q:1817866119(N老師)進(jìn)行交流討論!