—— 遠航路上ing 整理於 博客園。轉載請標明出處。
在上節建立完工程之后,要想明確DDR IP的使用細節,最好是做仿真。然后參考仿真來控制IP 核。
仿真的建立:
1、在IP核內的以下路徑找到以下三個文件加入並設置為僅僅仿真。這三個文件的作用是作為外部監視和仿真頭文件(test_mem_ctrl).
2、在IP核內部的以下路徑內將以下兩個文件加入到工程里,設置為僅僅仿真。這兩個文件的作用是模擬外部DDR器件,並存儲數據。
、
3、加入之后,基本就是下圖這樣的了。
4、然后建立仿真工程。並調用Modelsim仿真.在Modelsim里第一次自動運行仿真的時候,會出現下面的錯誤。雙擊錯誤的信息,會彈出
錯誤文件的錯誤提示。基本都是找不到參數文件,只要把參數文件copy到testbench的工程里就可以了。
5、在IP核的以下路徑內找到ddr3_sdram_mem_params.v文件,copy到testbench的工程下。
還有就是以下三個文件都要copy到testbench的工程目錄下。
還有個是模擬外部DDR的參數,否則ddr3.v和ddr3_dimm_16.v就會出現錯誤。
接着打開modelsim內的ddr3_dimm_16.v文件,在頂部加入下面兩個參數聲明(原來是沒有這連個參數聲明的)。
最好在DIamond的軟件的工程內也把這個文件修改了,這樣下次再使用這些文件建立新的仿真的時候就不需要加入這個參數聲明了。
在沒有加入“tb_config_params.v”的聲明的時候,ddr3_dimm_16.v文件會出現下面的報錯。這是因為藍色方框內的參數都在“tb_config_params.v
內聲明的。
最后,可以再次在MODELSIM中編譯一下全部文件,如果沒有錯誤,則就出現下面的提示,如果有錯誤,則需再次修改。
在頂層文件test_mem_ctrl.v文件的底部還包括了下面兩個我們已經加入的文件。這兩個是任務聲明文件。
包括了仿真步驟和仿真任務的產生。
testecase里面是仿真的步驟:
1)、先是IP核的設置。可以看到都是用了任務名。比如:reset、init、self_ref等等。而這些任務的具體操作步驟都可以在cmd_gen.v的文件內找到。
2)、設置MR0(只是設置了MR0),然后就會讀寫數據。具體參數含義還是要看cmd_gen.v文件。
3)、改變突發長度只需要設置MR0即可。
4)、設置為OTF模式,突發長度由otf_bit參數決定。
5)、設置為OTF模式並且burst_cnt可以改變。
6、運行仿真,並且將仿真進行到自動停止。觀察仿真波形。
1)、初始化完成
2)、設置IP核。
3)當cmd==2 的時候開始寫數據。cmd_rdy = 1,則命令被接受。
寫入的第一個數據'Hd82d5c69ea418124,然后在數據線上四位一個數據,從低位向高位寫起。'h8124,'hea41,'h5c69,'hd82d.依次被寫入到DDR芯片內的
第一個地址、第二個地址、、、等。
burst_length 為4, burst_count 為15的情況。
2)、讀取數據的操作的情況。
3)、讀取數據操作和寫入數據操作的區分可以是:em_ddr_dqs信號。在寫操作時,em_ddr_dqs先變為11,再變為00,當再次變為11時就開始了
寫入第一個數據。當讀取操作時,em_ddr_dqs先是變為00,然后再保持一個時鍾,然后變為11,開始讀取第一個數據。所以根據這可以判斷出下圖
左邊是讀取操作,右邊是寫入操作。
4)、下圖是burst_length = 4,brust_count = 15的情況下讀數據操作的波形圖。
值得注意的是:;::DDR IP核可以記憶若干讀寫操作,然后按順序執行讀寫操作而不會混亂,這樣可以大大節約DDR的操作時間。在進行讀寫操作的時候依然可以處理ddr的命令。