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