Spartan6 DDR佔用MCB資源(硬核資源),7系列佔用MIG資源;
1.添加IP
博文較多,此處至重點介紹其中關鍵信息;
Clock Period : 指的是IP核給DDR3的時鐘,和速度等級有關,-n,其中n越大則最高頻率越大。
PHY to Controler Clock Ratio :MIG內部datapath的時鐘與DDR3的工作時鐘之間的比例。ui_clk是MIG內部輸出給用戶端的時鐘,同輸入給datapath的時鐘,也即ui_clk :ddr3_clkp,n = 1:4
Memory Part :若用的DDR選項裏沒有,可以先點擊Creat Custom Part 進行創新建。
Input Clock Period :用戶給IP核的時鐘。
Systerm Clock :系統時鐘,進過PLL後傳輸給DDD3;單端且來自本模塊,推薦選擇No Buffer
Reference Clock :參考時鐘,用於生成往datapath(IP核裏面邏輯)裏面寫的時鐘和IP核輸出給用戶的時鐘;在Systerm Clock=200M的時候,參考時鐘可以用系統時鐘。
Global :編譯這個IP和工程
Out of context per IP :單獨編譯IP
2.IP和初始化仿真
Add source --> Creat File
添加例化MIG文件
mig_7series_0_mig u_mig_7series_0_mig (
// Memory interface ports
.ddr3_addr (ddr3_addr),
.ddr3_ba (ddr3_ba),
.ddr3_cas_n (ddr3_cas_n),
.ddr3_ck_n (ddr3_ck_n),
.ddr3_ck_p (ddr3_ck_p),
.ddr3_cke (ddr3_cke),
.ddr3_ras_n (ddr3_ras_n),
.ddr3_reset_n (ddr3_reset_n),
.ddr3_we_n (ddr3_we_n),
.ddr3_dq (ddr3_dq),
.ddr3_dqs_n (ddr3_dqs_n),
.ddr3_dqs_p (ddr3_dqs_p),
.init_calib_complete (init_calib_complete),
.ddr3_cs_n (ddr3_cs_n),
.ddr3_dm (ddr3_dm),
.ddr3_odt (ddr3_odt),
// Application interface ports
.app_addr (app_addr),
.app_cmd (app_cmd), //命令控制信號
.app_en (app_en), //命令,地址使能信號
.app_wdf_data (app_wdf_data),
.app_wdf_end (app_wdf_end), //寫數據的最後一個數,類似於突發指示的功能,因爲用戶接口沒有突發長度指示;每一次傳輸只能傳輸128bit的數據,可以根據app_end來判斷哪些有效。7系列以上MIG只有8突發一種形式。
.app_wdf_wren (app_wdf_wren),
.app_rd_data (app_rd_data),
.app_rd_data_end (app_rd_data_end),
.app_rd_data_valid (app_rd_data_valid),
.app_rdy (app_rdy), //該信號表示IP核是否準備好接受數據,當它與app_en同時有效時寫數據有效,針對於命令
.app_wdf_rdy (app_wdf_rdy), //寫數據準備好信號指示,針對於數據
.app_sr_req (app_sr_req),
.app_ref_req (app_ref_req), //refresh 的request,刷新的請求;一般用不上填0即可,因爲刷新MIG可以自動完成,如果人爲需要刷新,1個週期的1即可
.app_zq_req (app_zq_req),
.app_sr_active (app_sr_active),
.app_ref_ack (app_ref_ack),
.app_zq_ack (app_zq_ack),
.ui_clk (ui_clk), //ip核輸出給用戶的時鐘
.ui_clk_sync_rst (ui_clk_sync_rst), //IP核輸出的同步復位
.app_wdf_mask (app_wdf_mask),
// System Clock Ports
.sys_clk_p (sys_clk_p),
.sys_clk_n (sys_clk_n),
// Reference Clock Ports
.clk_ref_p (clk_ref_p),
.clk_ref_n (clk_ref_n),
.sys_rst (sys_rst)
);
地址映射關係
可以看到app_addr有28根地址線全部用上,cow address有10bit,row address有15bit和DDR3對應。所以第一個128bit數據傳輸完成之後嗎,下一次連續傳輸地址+8;MIG內部會自行將輸入進來的128bit的數據轉化爲8個16bit的數據寫入DDR3中,地址也是MIG內部自動走動分配的,只需要給出8個首地址即可。
寫時序圖
有地址和數據關三種寫入方式,1對應數據和命令同時給出,2對應數據先於數據給出,3對應數據在命令給出之後給出,第三種方式數據最晚不能晚於命令給出的兩個週期後給出。這樣會發現每次寫一個128bit的數據時,由於MIG的突發長度固定位8,因此對於位寬16bit的DDR3來說,第一個128bit裏面也包含了該次寫入的最後一個數據,因此app_end信號始終有效;
下面以1. app_data64 位,DDR3位寬爲8位,PHY to controller clock ratio = 4:1介紹詳細app_end的不同情況(from UG586):
這種情況下由於時鐘比例是4:1,因此每個64bit數據既是本次突發的第一個數據也是本次突發的最後一個數據,因此aa_end始終有效。
2. app_data32 位,DDR3位寬爲8位,PHY to controller clock ratio = 2:1
總線位寬爲32bit,因此在傳輸第二個32bit數據時纔會有app_end有效,注意MIG中突發長度固定位8,當DDR3位寬爲8時,每一次傳輸會傳輸M8*8(BL)=64bit數據。