SDRAM突發讀寫注意

2021-08-19 08:58:37 字數 1815 閱讀 2034

最近的專案需要在設計乙個sdram控制器,用於儲存一段取樣資料,然後等待上位機下發指令,把資料上報。採用連續突發讀寫模式bl為4,時鐘50mhz。

sdram器件型號為mt48lc16m16a2。(4m*16*4banks),從上面的資訊我們可以了解到,該sdram的資料匯流排為16bit,行位址有13根(8k),列位址為9根,有4個bank。

專案中的sdram控制模組,是由原來寫好的sdram模組移植過來的,原來的**中讀寫突發長度都為1的。經過修改後就移植到新的專案當中。一開始當一次取樣的資料量比較少的時候,讀寫正常,但是一旦一次取樣資料量大的時候,發現資料有錯位。而且有一定的規律,這樣可以排除掉是由於時序問題或者管腳設定、或者初始化等原因,初步可以斷定時邏輯設計出問題了。

圖1   寫入的測試資料

往sdram寫入從16』h1---16』h6b35遞增資料。

圖2   sdram讀出的資料1

圖3   sdram讀出資料2

從上圖中可以看出,從sdram突發讀出來的資料很有規律,感覺上是某個位置的數被覆蓋了。例如圖3,正常讀出的順序應該,是(2001、2002、2003、2004),但是實際上讀出來的是2004、2001、2002、2003;圖2也是類似的問題。

由於資料量少的時候,讀寫正常,那麼就可以排除掉初始化不成功,或者時序不滿足的原因,問題很有可能是出在位址上,感覺是某個位址被重複寫了。經過測試發現,資料量在2k的樣子就開始出現異常了。

圖4   位址對映

上圖畫紅線部分的是修改前,突發讀寫異常的位址對映。其中i_addr_bus位址匯流排是對應著取樣資料依次遞增的。原來

i_addr_bus

匯流排的低為位址對映到了

sdram

的行位址。也就是說,突發讀寫的時候,行位址遞增了+4,等到行位址寫滿後,列位址才開始變化,應該是+1。結合資料長度每次到2k左右會出問題。根據突發為4,行位址匯流排8k。8k/4=2k。剛好是行位址寫滿後,切換到下一列的時候,部分資料被覆蓋掉了。

當然如果突發讀寫為1的話,這樣設計是沒問題的。

圖5   bus_hound檢測到的資料

利用檢測工具,bus_hound檢測到的結果也印證了剛才的推斷。其中out端是上位機下發的讀取取樣資料的指令,in端是fpga上報的內容。

至於為什麼被覆蓋掉的內容,一開始讀出來不是0001、2001、2002、2003而是2004、2001、2002、2003。我猜想是因為當設定好突發長度的時候,sdram就根據設定把內容劃分為乙個乙個類似與環形快取的小模組,防止資料寫亂到其他地方。所以當2001被寫入到環形快取的第二個位址時,依次類推,2004被環行寫到小模組的第乙個位址。而讀取的時候是從第乙個位址讀出來。所以會有2004、2001、….的情況。這只是猜想..

突發讀寫的時候,

sdram

預設是先把某一行的內容先寫滿(即列位址自動累加)。也可以理解為橫向突發讀寫。所以在突發讀寫的時候,位址的對映很關鍵。邏輯控制的位址的低位應該對映到

sdram

的列位址。

SDRAM設計之讀 寫(三)

本篇來記錄下,sdram的讀 寫過程,sdram 同步動態隨機訪問記憶體 所謂的 隨機 便是指我們每次讀 寫的位址可以是設計者指定的位置。sdram一般結構都會分為幾個bank,每個bank中分成行 列式來管理,使用者可以指定將寫入或者讀出哪個bank 哪一行 哪一列的資料。以美光的一款sdram ...

SDRAM讀寫一字(下)

上電後進行初始化狀態,初始化完成後進入空閒狀態,在此進行判斷如下判斷 如果自重新整理時間到,則進行自重新整理操作,操作完成後重新進入空閒狀態 如果讀使能有效則進行讀操作,操作完成後產生完成訊號並延遲乙個時鐘週期重新進入空閒狀態 如果寫使能有效則進行寫操作,操作完成後產生完成訊號並延遲乙個時鐘週期重新...

SDRAM和NAND Flash的幾個注意點

這幾天在研究st2410開發板上的儲存器控制部分,現結合自己在實驗中碰到的問題和查詢的相關資料,談談幾個注意點。1 s3c2410與sdram的連線問題 1 首先cpu向sdram傳送乙個讀位址,a0 a14對應的位址訊號是001000000000000b,此時sdram上的a0 a12上的位址訊號...