SDRAM突發讀寫注意

序言

最近的項目需要在設計一個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的列地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章