在 lattice_ddr3調試經驗分享(一)建立工程與仿真 博客中已經實現工程的建立以及仿真。后來公司還真的需要用lattice的FPGA。所以需要對這個example進行分析了。
打開 test_mem_ctrl.v 這個就是tb的頂層了。當然,lattice的很多東西和xilinx的沒法比,代碼質量也是一樣的。lattice除了便宜其他都不好。然而.......... 好了,言歸正傳,不吐槽了。lattice中例化的ddr是沒有設置得像xilinx(xilinx用的是官方仿真模型)的模型一樣可以在log中看出你的讀寫時間,讀寫地址,讀寫數據,以及命令。lattice的仿真模型像剛畢業的學生寫的一樣 —— log里啥都沒有,一切自己看波形。
折騰了好久,想自己把鎂光官方module放進去,失敗!有知道怎么放進去的攻城獅還請賜教了。
萬般無奈之下,還是好好分析lattice自己的example
平台:
lattice Diamond3.5 + modelsim10.2c +ecp3 -8 + MT41K64M16TW-107
1,test_mem_ctrl 這個modelsim中屏蔽掉自己不想要的 monitor,odt_watchdog。
還有兩個
對於325,326兩行,是task以及調用task的case。這個寫法有些像IC設計的時候做驗證的方式。但是我也是做過IC的人,團隊中沒有人寫得這么稀爛過。屏蔽屏蔽!!
然后自己寫個這個東西
好了,初始化成功了。
這么寫肯定會提示reset時間不夠,reset到cke的時間不夠。先不用管
init_start為1,IP核還是初始化ddr。然后重點就是這個init_done拉高一個脈沖。init_start一定要在init_done拉高的一周周期后立刻拉低,不然這個IP又來初始化一次。
還有幾個參數需要注意:ofly_burst_len=1,選擇BL8模式
cmd_burst_cnt 這個是命令重復次數。 次數設定在0~32次之間可選。當cmd_burst_cnt =0 你寫一次命令,這個IP 就可以重復32次
2, 先寫,不過這個不可綜合的語句我寫的有些復雜
我是隨便往里面寫了兩個數。是不是覺得有些奇怪,為何代碼是這樣子的。那是因為這個IP里面有一個設定,就是寫有效到吃寫的數據之間是有latency的,方便大家用fifo。手冊上的波形圖如下:
然后坑爹的要看波形圖了
第一個箭頭的地方ddr的cmd為0011 是ACTIVE 。后面就是cmd=0100 WRITE —— ddr的datasheet上
看到我寫入的地方是bank1,row3 ,col=0 。col在波形圖上是 0x1000,要知道col只有10bit。
寫的時候需要注意。這個控制器比較坑爹,因為我這個DDR的data位寬是16bit,也就是每個地址只能存16bit數據,然后這個控制器的data接口就成了64bit。要知道每次寫地址會自動益增8,也就是每次你應該放進去的數據為16bit*8=128bit,可是控制器的數據位寬只有64bit —— 少了一半,也就是說你每次寫應該寫兩個數據進去,這無疑是降低了控制器的效率啊。
圖中黃線部分后是讀取的第一個數,再后面的1122334455667788是第二個數。
3,讀。讀的話就比寫簡單一些
好了。現在想想怎么把這個模型轉換成自己想要的可綜合模塊吧。
歡迎加入: FPGA廣東交流群:162664354
FPGA開發者聯盟: 485678884