Xilinx DDR3 IP核使用問題匯總(持續更新)和感悟
一度因為DDR3的IP核使用而發狂。
後來因為解決問題,得一感悟。後面此貼會完整講述ddr3 ip的使用。(XILINX K7)
感悟:對於有供應商支持的產品,遇到問題找官方的流程。按照官方的指導進行操作。由於使用軟件版本不同可能語法之間有出入或著不兼容,此時常識尋找下載版本最接近的官方Guide來操作,你就會發現解決那些莫名其妙問題的突破點。
問題:
1.綜合
a.問題:Unable to set attribute "DQS_AUTO_RECAL" with value "0" on instance <phaser_in_gen.phaser_in> of block <PHASER_IN_PHY>. This property is already defined with value "1" on the block definition by a VHDL generic or a Verilog parameter. Apply the desired value by overriding the default VHDL generic or Verilog parameter. Using an attribute is not allowed.
定位到代碼:
generate
if ( PO_DATA_CTL == "TRUE" || ((RCLK_SELECT_LANE==ABCD) && (CKE_ODT_AUX =="TRUE"))) begin : phaser_in_gen
//(* DQS_AUTO_RECAL = DQS_AUTO_RECAL, DQS_FIND_PATTERN = DQS_FIND_PATTERN *)
PHASER_IN_PHY #(...)
phaser_in(...)
else
...
根據code中,if語句裏面的幾個表達式真值最終括號中真值是0,因此不執行if轉而執行else。因此這個部分就用不上了,所以code如何就不管。雖不知(*...*)是何語法,但問題可能出在這裏。因此註釋掉,重新綜合。就可以了。
2.USE_DM_PORT=1 or =0.1代表使能DM(數據掩碼)功能。(可以用,原因有待探究)
即寫入的數據是否有一部分需要被屏蔽掉。如果在IP核生成時選擇checked dm,一般生成的代碼中USE_DM_PORT會為1,這樣就會正確生成bit文件。如果手動改為0(同在ip核生成頁面選擇not checked dm一樣),就會導致實現過程失敗。那麽糾結的問題在於:仿真時USE_DM_PORT設為0,可以得到預期的結果(寫了數,然後讀,讀到的數就是寫進去的數)。而設為1時,結果就是錯誤的。讀出來的數並非寫進去的數,而且看到仿真圖中,寫數據時,dm線是X(不定值)。dm為1則屏蔽數據。但是後來將USE_DM_PORT設為1,並下板運行。發現讀到的數據通過串口發回來,恰好是寫進去的數據。
3.另一個在map過程中出現的問題。
是關於雙向數據引腳的約束問題。通過官方的solution解決,“CONFIG DCI_CASCADE = "33 32 34";”具體後面再加上來。
現在達到的效果:連續寫入8次數據,然後連續讀出來,數據正確。繼續做一下只取其中幾次的數據...看是否正確2015.11.15?
4.要讀的數據相應的地址(已查明)—查看內存顆粒相應手冊。關於Burst Type的解說。
引用其中一句話:The ordering of accesses within a burst is determined by the burst length, the burst type, and the starting column address。
在一個突發傳輸中訪問數據的順序取決於突發長度、類型及開始的列地址。
真相如下圖。
突發長度BL=8.本實例中采用的ddr3,是一個rank,數據位寬64bit,那麽進行一次數據突發傳輸,將傳送8*64bit的數據。如果進行8次這樣的突發傳輸——
寫:他們的列地址依次是10‘h0、10‘h8、10‘h10、10‘h18、10‘h20、10‘h28、10‘h30、10‘h38.等
讀:他們的列地址依次是10‘h0、10‘h8、10‘h10、10‘h18、10‘h20、10‘h28、10‘h30、10‘h38.等
問題現象:
讀地址是上面寫的地址時,數據讀取正確。假如賦予的讀地址是10‘h3、10‘h5等,那麽讀出來的數據就不是我們以為的10‘h3-10‘ha地址對應的數據。
轉載:http://blog.csdn.net/dawnhan/article/details/49783535
Xilinx DDR3 IP核使用問題匯總(持續更新)和感悟